2012-08-02 50 views

回答

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)正常计算,最后一个进位bot值被忽略。

+0

正是我想要的那种引用,谢谢:)(请忽略我以前对于进位的评论,我误读了这个函数!) – detly 2012-08-02 12:41:20

+0

@detly:不客气 – wap26 2012-08-02 12:53:55

+0

这个答案也是错误的, MAX + 1的长度。使用MAX名称时出现问题。对于声明为无符号的某个名称,其子类型指示(索引范围)为31 downto 0且长度为32(somename'length),右边索引为0的最大值为2 ** 32 -1。 – user1155120 2015-06-03 02:58:15

1

我已经与希望的unsigned溢出/下溢在C或Verilog和这里的问题是什么,我想出了(resultdeltaunsigned):

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,该命令产生正确的溢出值。下溢也一样。

1

对于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的提示是为了指出这个问题。