2012-08-02 96 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的提示是爲了指出這個問題。