如果我有一个包含值 2**MAX - 1
的 unsigned(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/