是否已为VHDL numeric_std签名/未签名定义溢出

时间:2012-08-02 01:16:10

标签: standards vhdl integer-overflow

如果我的unsigned(MAX downto 0)包含值2**MAX - 1,那么VHDL(87 | 93 | 200X)标准是否定义了当我将其递增1时会发生什么? (或者,类似地,当我从零减去一个?)

3 个答案:

答案 0 :(得分:6)

简答:

没有溢出处理,溢出进位就丢失了。因此,结果只是您的操作的整数结果 modulo 2 ^ MAX

更长的回答:

numeric_std包是标准包,但它不是核心VHDL标准(87,93,200X)。 供参考:numeric_std.vhd

最后+运算符调用ADD_UNSIGNED (L, R : unsigned; C : std_logic)函数(C = '0')。请注意,任何整数/自然操作数首先转换为unsigned

该函数的定义是:

function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is
    constant L_left : integer   := L'length-1;
    alias XL        : unsigned(L_left downto 0) is L;
    alias XR        : unsigned(L_left downto 0) is R;
    variable RESULT : unsigned(L_left downto 0);
    variable CBIT   : std_logic := C;
begin
    for i in 0 to L_left loop
        RESULT(i) := CBIT xor XL(i) xor XR(i);
        CBIT      := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
    end loop;
    return RESULT;
end ADD_UNSIGNED;

正如您所看到的CBIT='1'(携带位)i = L_left时出现“溢出”。结果位RESULT(i)正常计算,最后一个进位机器人值被忽略。

答案 1 :(得分:1)

我在C或Verilog中遇到了unsigned溢出/下溢的问题,这就是我提出的问题(resultdelta unsigned 1}}):

result <= unsigned(std_logic_vector(resize(('1' & result) - delta, result'length))); -- proper underflow
result <= unsigned(std_logic_vector(resize(('0' & result) + delta, result'length))); -- proper overflow

对于溢出'0' & result,使unsigned大1位,以便能够正确地容纳加法的值。然后通过resize命令移除MSB,从而产生正确的溢出值。下溢相同。

答案 2 :(得分:1)

对于MAX等于7的值,加1到2 ** 7 - 1(127)将得到值2 ** 7(128)。

最大无符号值由无符号数组类型的长度确定:

[some-attribute

汇总library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity foo is end entity; architecture faa of foo is constant MAX: natural := 7; signal somename: unsigned (MAX downto 0) := (others => '1'); begin UNLABELED: process begin report "somename'length = " & integer'image(somename'length); report "somename maximum value = " &integer'image(to_integer(somename)); wait; end process; end architecture; 代表&#39; 1&#39;在(others => '1')的每个元素中,它是无符号数组类型,表示可能的最大二进制值。

这给出了:

  

foo.vhdl:15:9:@ 0ms :(报告说明):somename&#39; length = 8
  foo.vhdl:16:9:@ 0ms :(报告说明):somename最大值= 255

长度为8,无符号数组类型可表示的数值范围为0到2 ** 8 - 1(255),最大可能值大于2 ** 7(128)且没有溢出。

在较新的问题VHDL modulo 2^32 addition中注意到了这一点。在您接受的答案的上下文中,它假设您的意思是长度而不是最左边的值。

零情况下的递减确实导致值为2 ** 8 - 1(255)(MAX = 7)。根据您的数学宗教,下溢或溢出。

向Jonathan Drolet提示,在链接的新问题中指出这一点。