1

在 SO 而不是 EE 上发布这个问题是因为我正在努力解决编码/软件缺陷。


我是 VHDL 新手,正在阅读“Free range 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

结果,我收到了 4 条错误消息,显然是因为data(0)以及data(1)下面列出的其他消息。

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

感谢帮助!

4

1 回答 1

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的区别:

该链接已经解释了 to 和 downto 之间的区别。当我们不仅要使用位向量来表示位数组(其中每个位具有独立的行为),而且要表示整数时,就会出现“downto”和“to”的任何差异。然后,由于加法器、乘法器等电路处理数字的方式,位的重要性有所不同。我再举一个例子

假设您要分配位向量值 =“0001”,如果使用“3 downto 0”,分配将是

data<=(0 => '1', others => '0')

在“0到3”的情况下,分配将是

data<=(3=>'1',others => '0')

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

于 2015-12-06T00:54:33.853 回答