标准 – 为VHDL numeric_std签名/未签名的溢出定义

如果我有一个包含值2 ** MAX – 1的无符号(MAX downto 0),那么VHDL(87 | 93 | 200X)标准是否定义了当我将其递增1时会发生什么? (或者,类似地,当我从零减去一个?)
最佳答案
简短回答:

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

更长的回答:

numeric_std包是一个标准包,但它不是Core VHDL标准(87,93,200X).
供参考:numeric_std.vhd

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

该函数的定义是:

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)正常计算,最后一个进位bot值被忽略.

转载注明原文:标准 – 为VHDL numeric_std签名/未签名的溢出定义 - 代码日志