在SO而不是EE上发布此问题是因为我正在努力解决编码/软件缺陷。
我是VHDL的新手并经历了#34;自由范围的VHDL"书。玩bit_vector
我发现在总线语法中访问单线是bus_name(0)
(例如0)。
记住这一点,我写了4输入多路复用器的简单表示。
library ieee;
use ieee.std_logic_1164.all;
entity Multiplexer4_1 is
port
(
data : in bit_vector(3 to 0);
selector : in bit_vector(1 to 0);
output : out bit
);
end entity Multiplexer4_1;
architecture m4_1 of Multiplexer4_1 is
begin
output <= data(3) when (selector = "11") else
data(2) when (selector = "10") else
data(1) when (selector = "01") else
data(0) when (selector = "00") else
'0';
end architecture m4_1;
我使用ghdl
使用以下命令在linux下处理VHDL。
ghdl -a 4Multiplexer.vhdl
因此,由于下面列出的data(0)
,data(1)
和其他人,我会收到4条错误消息。
4Multiplexer.vhdl:15:23: static constant violates bounds
4Multiplexer.vhdl:16:21: static constant violates bounds
4Multiplexer.vhdl:17:21: static constant violates bounds
4Multiplexer.vhdl:18:21: static constant violates bounds
ghdl: compilation error
问题是:
bus_name(index)
是正确的语法吗?更新
不要犯同样的错误我已经了解了数组/范围在VHDL中的工作方式至关重要。
感谢您的帮助!
答案 0 :(得分:2)
问题在于声明。
您已将数据和选择器定义为
data : in bit_vector(3 to 0);
selector : in bit_vector(1 to 0);
您应该将其定义为
data : in bit_vector(3 downto 0);
selector : in bit_vector(1 downto 0);
或
data : in bit_vector(0 to 3);
selector : in bit_vector(0 to 1);
to和downto之间的区别:
这个链接已经解释了与downto之间的区别。任何差异&#34; downto&#34;和&#34;到&#34;当我们想要使用位向量而不只是表示位数组时出现,其中每个位具有独立的行为,但是表示整数。然后,由于加法器,乘法器等电路处理数字的方式,位重要性存在差异。 我将再举一个例子
假设你想要分配你的位向量值=&#34; 0001&#34; 如果使用&#34; 3 downto 0&#34;,分配将是
data<=(0 => '1', others => '0')
和&#34; 0到3&#34;案例,任务将
data<=(3=>'1',others => '0')
重要的是,应始终坚持上升或下降范围。程序员可以使用两者的组合。但是,它可能会令人困惑,并且可能会产生一些错误。此外,据我所知,大多数公交车都使用降序编号。因此,程序员喜欢下降范围。