我目前正在用VHDL寫一個32Bit ALU(Add/Sub)。我遇到了溢出位的問題。 根據操作(加法,減法)和輸入值,我無法看到何時設置溢出。溢出bit 32Bit ALU VHDL
你能幫我嗎?
最好的問候, 安德烈
我目前正在用VHDL寫一個32Bit ALU(Add/Sub)。我遇到了溢出位的問題。 根據操作(加法,減法)和輸入值,我無法看到何時設置溢出。溢出bit 32Bit ALU VHDL
你能幫我嗎?
最好的問候, 安德烈
什麼是規範說應該怎麼辦?應該在什麼條件下應該設置溢出標誌的描述。
傳統上,溢出位在輸出太大而不能存儲時設置。在總結兩個32位數字的答案中,你可以把它看作第33位。在有符號算術中,如果操作結果的大小太大,可能會發生這種情況,而不管符號如何。使用2-s補碼算術時,必須小心一點,因爲最大的負數比在給定的比特數中表示的最大正數稍微更負。
在實際做它的術語,只是創建一個numeric_std
矢量比所述輸入更寬1個比特,做
a<=b+c;
,並讓合成器創建的邏輯。然後你不必擔心細節。
的「A」可以使用a(a'high)
並把它作爲溢流被取下(
的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;
您做出重要的關於補碼溢出點... – Marty 2009-12-01 21:38:46
爲了增加賈斯汀的回答(這是一個很好的點:)有功能在ieee.numeric_std縮放矢量圖書館。加法可以寫成'a <= resize(b,a'length)+ resize(b,a'length)'。 此外,限制答案通常不是你想要在溢出的情況下做什麼 - 它需要額外的邏輯。如果進位用於多字添加,您*真的*不希望飽和算術。 – 2009-12-16 16:18:39