2009-11-16 127 views
1

我目前正在用VHDL寫一個32Bit ALU(Add/Sub)。我遇到了溢出位的問題。 根據操作(加法,減法)和輸入值,我無法看到何時設置溢出。溢出bit 32Bit ALU VHDL

你能幫我嗎?

最好的問候, 安德烈

回答

1

什麼是規範說應該怎麼辦?應該在什麼條件下應該設置溢出標誌的描述。

傳統上,溢出位在輸出太大而不能存儲時設置。在總結兩個32位數字的答案中,你可以把它看作第33位。在有符號算術中,如果操作結果的大小太大,可能會發生這種情況,而不管符號如何。使用2-s補碼算術時,必須小心一點,因爲最大的負數比在給定的比特數中表示的最大正數稍微更負。

在實際做它的術語,只是創建一個numeric_std矢量比所述輸入更寬1個比特,做

a<=b+c;

,並讓合成器創建的邏輯。然後你不必擔心細節。

的「A」可以使用a(a'high)並把它作爲溢流被取下(

3

的MSB只是爲了一些額外的信息添加到馬丁的答案,你需要小心與檢測溢出2的補碼算法

例如,如果您有3位有符號值以二進制補碼格式表示,並且您想檢測到溢出,則需要對擴展位進行簽名擴展,然後查看是否多餘的位不同於最重要的想要位:

例如,如果你想計算= B + C:

--Declare the signals 
signal overflow : std_logic; 
signal a : signed(2 downto 0); 
signal b : signed(2 downto 0); 
signal c : signed(2 downto 0); 

-- Declare some additional signals with one more MSB than the original signals 
signal a_extended : std_logic(3 downto 0); 
signal b_extended : std_logic(3 downto 0); 
signal c_extended : std_logic(3 downto 0); 

-- Sign extend the MSB 
b_extended <= b(2) & b; 
c_extended <= c(2) & c; 

-- Perform the addition 
a_extended <= b_extended + c_extended; 

-- Detect the overflow case 
overflow <= '1' when a_extended(3) /= a_extended(2) else '0'; 

-- Calculate the answer 
-- Limit to 100 (-4) or 011 (+3) in the case of overflow 
process(a_extended) 
begin 
    if a_extended(3) /= a_extended(2) then 
     if a_extended(3) = '1' then 
     a <= "100"; 
     else 
     a <= "011"; 
     end if; 
    else 
     a <= a_extended(2 downto 0); 
    end if; 
end process; 
+0

您做出重要的關於補碼溢出點... – Marty 2009-12-01 21:38:46

+0

爲了增加賈斯汀的回答(這是一個很好的點:)有功能在ieee.numeric_std縮放矢量圖書館。加法可以寫成'a <= resize(b,a'length)+ resize(b,a'length)'。 此外,限制答案通常不是你想要在溢出的情況下做什麼 - 它需要額外的邏輯。如果進位用於多字添加,您*真的*不希望飽和算術。 – 2009-12-16 16:18:39