standards - 是否为 VHDL numeric_std 有符号/无符号定义了溢出

标签 standards vhdl integer-overflow

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

最佳答案

简短回答:

没有溢出处理,溢出进位只是丢失。因此,结果只是运算的整数结果模 2^MAX

更长的答案:

numeric_std封装是标准封装但它不是Core 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)正常计算,最后一个进位机器人值被忽略。

关于standards - 是否为 VHDL numeric_std 有符号/无符号定义了溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769754/

相关文章:

html - W3C 是否允许显示 <h#> 元素 :inline;?

html - 空行内 block 元素的垂直对齐

java - 解释整数溢出的两种方法

VHDL : for loop, 索引算术不起作用

generics - VHDL 中可变数量的输入和输出

scala - 常见的做法是如何处理Integer溢出?

c - 数组索引上的整数溢出

standards - ISO 标准街道地址?

sql - SQL 标准是否允许函数名和括号之间有空格

vhdl - 在 VHDL 函数中生成随机值