bit_vector以静态常量限制违反

时间:2015-12-06 00:34:10

标签: vhdl digital-logic ghdl

在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中的工作方式至关重要。

感谢您的帮助!

1 个答案:

答案 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')

重要的是,应始终坚持上升或下降范围。程序员可以使用两者的组合。但是,它可能会令人困惑,并且可能会产生一些错误。此外,据我所知,大多数公交车都使用降序编号。因此,程序员喜欢下降范围。