如果我有一个unsigned(MAX downto 0)
包含值2**MAX - 1
,做VHDL(87 | 93 | 200X)标准定义,当我通过一个加一,会发生什么? (或类似地,当我从零递减它由一个?)
Answer 1:
简短的回答:
没有溢出处理,溢流进位简单地丢失。 这样的结果简直是你的操作模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)
通常计算和最后进位机器人值被忽略。
Answer 2:
我已经受够了想一个问题unsigned
溢出/下溢在C或Verilog和这里是我想出了( result
和delta
是unsigned
):
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位更大,以能够正确地适应加入的值。 的MSB然后被除去resize
其产生正确的溢出值命令。 同为下溢。
Answer 3:
为MAX的值等于7加入1〜2 ** 7 - 1(127)将导致值2 ** 7(128)。
的最大无符号值是由一个无符号阵列型的长度来确定:
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;
聚集体(others => '1')
表示的各元素的“1” somename
这是一个无符号阵列类型和表示最大二进制值成为可能。
这给:
foo.vhdl:15:9:@ 0毫秒:(报告注):somename'length = 8
foo.vhdl:16:9:@ 0毫秒:(报告注):somename最大值= 255
的长度是8并且由无符号的数组类型的数值范围表示的是从0到2 ** 8 - 1(255),最大可能值是大于2 ** 7(128),并且没有溢出。
这是在一个新的问题,注意到VHDL模2 ^ 32除 。 在你接受的答案的背景下,假设你的意思,而不是长度最左边的值。
从零的情况下递减确实导致的2 ** 8的值 - 1(255)(MAX = 7)。 下溢或取决于你的数学宗教溢出。
帽尖乔纳森Drolet在链接新问题,指出了这一点。