在VHDL中增加std_logic_vector

时间:2018-04-12 09:48:13

标签: vhdl

我开始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)处解析net“calculateur [1]”的多个常量驱动程序。

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

2 个答案:

答案 0 :(得分:2)

您的问题比增加std_logic_vector更为重要。你似乎认为自己在编写软件。你不是,你在设计硬件。

VHDL中的每个进程(无论是显式的还是隐式的)都推断出一块硬件。您有两个进程:一个是显式(process(calculateur)),另一个是隐式(calculateur <= "00";)。两者都在驱动信号calculateur。因此你有一个短路。

您的错误消息是因为您有此短路。但是,情况要糟糕得多:你的第二个进程也有组合反馈(它的输出连接到它的输入),你也会发现第二个进程没有增加calculateur四次(我想这就是你所希望的)。

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

我认为您需要退一步学习一些VHDL基础知识。 My company's website可能会对您有所帮助。

答案 1 :(得分: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是在两个进程中驱动的。设置信号的每个过程都会为该信号创建驱动程序,而且几乎任何综合工具都不允许多个驱动程序。这就是错误信息的含义。