在VHDL中增加std_logic_vector

问题描述 投票:0回答:2

我开始使用 VHDL,但遇到了一些问题。我想将 1 加到 std_logic_vector 中。我看到这个问题已经被问过,但仍然不起作用。这就是我所做的

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity lesson10c is 
  port (signal calculateur :  std_ulogic_vector (1 downto 0));
end lesson10c;

architecture behaviour of lesson10c is
begin 
  calculateur <= "00";

  process(calculateur)
  begin
    for i in 0 to 3 loop
    calculateur <= std_ulogic_vector(unsigned(calculateur)+1);
    end loop;
  end process;

end behaviour;

错误是

错误 (10028):无法解析 numeric_std_vhdl1993.vhd(1244) 处网络“calculateur[1]”的多个常量驱动程序。

只是练习代码,没有兴趣。你能告诉我哪里错了吗?

vhdl
2个回答
2
投票

你的问题比增加

std_logic_vector
更根本。您似乎认为您正在编写软件。你不是,你正在设计硬件。

VHDL 中的每个进程(无论是显式的还是隐式的)都推断出一块硬件。您有两个过程:一个是显式的 (

process(calculateur)
),另一个是隐式的 (
calculateur <= "00";
)。两者都在驱动信号
calculateur
。因此你有短路。

您的错误消息是因为您出现了短路。然而,比这更糟糕的是:你的第二个进程也有组合反馈(它的输出连接到它的输入),而且你还会发现第二个进程不会增加

calculateur
四次(我猜这就是你的意思)希望)。

不仅如此,您引用的错误消息是来自逻辑综合器的错误消息,这表明您正在尝试综合代码而不进行模拟。 (我这么说是因为我无法相信此代码的任何模拟的输出都会是您希望代码表现的方式)。始终首先模拟您的代码。

我认为你需要退后一步,学习一些 VHDL 基础知识。


1
投票

您看到的错误是由于您的代码在两个不同的进程中驱动

calculateur
造成的。请记住,这是一种硬件描述语言,而不是编程语言。

calculateur <= "00";

process(calculateur)
begin
  for i in 0 to 3 loop
  calculateur <= std_ulogic_vector(unsigned(calculateur)+1);
  end loop;
end process;

这里的第一行是并发分配。这并没有什么问题,但这实际上是另一个过程的简写。

考虑到这一点,我们可以看到

calculateur
是由两个进程驱动的。每个设置信号的进程都会为该信号创建一个驱动程序,并且几乎任何综合工具都不允许多个驱动程序。这就是错误消息的含义。

© www.soinside.com 2019 - 2024. All rights reserved.