【问题标题】:bit_vector bounds violation by static constant静态常量违反 bit_vector 边界
【发布时间】:2015-12-06 00:34:10
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: vhdl digital-logic ghdl


    【解决方案1】:

    问题在于声明。

    您已将数据和选择器定义为

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

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

    【讨论】:

    • IEEE Std 1076-2008, 5.2.1 “范围 L 到 R 称为升序范围;如果 L > R,则范围为空范围。” 5.3.2.2 “....如果任何离散范围定义了一个空范围,那么任何因此受约束的数组都是一个空数组,没有元素。”为什么要分析? “ 9.4.1 ”......某些表达形式可以在分析它们出现的设计单元时进行评估;这样的表达式被称为局部静态的。 ", 9.4.2 本地静态表达式, n) "一个索引名称,其前缀是本地静态主表达式,其索引表达式都是本地静态表达式"。
    • bit_vector 没有最高有效位或最低有效位,而 numeric_bit.signed 或 .unsigned 有(最左边的是 MS)。使用带有包 numeric_bit_unsigned 的 bit_Vector 将使左侧在算术上成为 MS。这不是这里的情况。也不需要访问 std_logic_1164 的 use 子句。
    • 是的。你说的对。没有像 MSB 和 LSB 这样的东西。仅供用户解释。感谢指出错误
    • 谢谢,它有帮助。我不清楚todownto 是如何工作的以及它们的局限性,所以我将使用指向这两个关键字相关信息的链接来更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2019-09-02
    • 2013-06-22
    相关资源
    最近更新 更多