如果我的unsigned(MAX downto 0)
包含值2**MAX - 1
,那么VHDL(87 | 93 | 200X)标准是否定义了当我将其递增1时会发生什么? (或者,类似地,当我从零减去一个?)
答案 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
溢出/下溢的问题,这就是我提出的问题(result
和delta
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提示,在链接的新问题中指出这一点。