如果我有一个包含值2**MAX - 1
的unsigned(MAX downto 0)
,那么VHDL(87 | 93 | 200X)标准是否定义了当我将其增加1时会发生什么? (或类似地,当我递减它由一个从零?)为VHDL定义溢出numeric_std有符号/无符号
回答
简短的回答:
没有溢出处理,溢流进位简单地丢失。因此,结果就是您的操作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)
正常计算,最后一个进位bot值被忽略。
我已经与希望的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位,以能够正确地适应加法的值。然后通过resize
命令删除MSB,该命令产生正确的溢出值。下溢也一样。
对于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 modulo 2^32 addition中被发现。在你接受的答案中,它假设你的意思是长度而不是最左边的值。
从零个案件的减量确实导致值2 ** 8-1(255)(MAX = 7)。根据你的数学宗教,下溢或溢出。
给Jonathan Drolet的提示是为了指出这个问题。
- 1. 从numeric_std无符号转换为std_logic_vector在vhdl
- 2. 无符号VHDL
- 3. 无符号long long溢出
- 4. 无符号整型溢出
- 5. 为什么turbo c环绕有符号整数溢出每次虽然有符号整数溢出未定义?
- 6. 无符号溢出模运算符C
- 7. 是否定义了C#/ .NET有符号整数溢出行为?
- 8. RuntimeError(符号表溢出(符号_one_time_conditions)。)
- 9. VHDL std_logic_vector转换为带符号和无符号numeric_std
- 10. 我想乘以有符号和无符号vhdl
- 11. 如何处理VHDL中的有符号和无符号数字?
- 12. 符号整数溢出行为
- 13. 定义默认int为无符号int
- 14. 未定义的符号...运算符new(无符号长整数)
- 15. VHDL中的无符号文字
- 16. strcmp()和有符号/无符号字符
- 17. 查询SQLite返回有符号int16,但被定义为无符号
- 18. 如何创建大于2³¹-1的numeric_std有符号值?
- 19. REE 187 RuntimeError(符号表溢出(符号_one_time_conditions)。):
- 20. €符号未定义
- 21. 未定义符号
- 22. 未定义符号
- 23. 如何预先确定无符号计算可能溢出?
- 24. RAND_MAX宏:有符号还是无符号?
- 25. 有符号和无符号整数?
- 26. Integer.parseInt() - 有符号和无符号数
- 27. C++有符号/无符号不匹配
- 28. C89:有符号/无符号不匹配
- 29. C++ 11类型(有符号+无符号)?
- 30. 如何检查溢出转换的char * []为无符号短
正是我想要的那种引用,谢谢:)(请忽略我以前对于进位的评论,我误读了这个函数!) – detly 2012-08-02 12:41:20
@detly:不客气 – wap26 2012-08-02 12:53:55
这个答案也是错误的, MAX + 1的长度。使用MAX名称时出现问题。对于声明为无符号的某个名称,其子类型指示(索引范围)为31 downto 0且长度为32(somename'length),右边索引为0的最大值为2 ** 32 -1。 – user1155120 2015-06-03 02:58:15