[英]Overflow bit 32Bit ALU VHDL
我目前正在用VHDL編寫32位ALU(Add / Sub)。 我遇到溢出位問題。 根據操作(加法,減法)和輸入值,我無法確定何時設置溢出。
你能幫助我嗎 ?
最好的問候,安德烈
只是為Martin的答案添加一些額外的信息,你需要注意用2的補碼算法檢測溢出。
例如,如果您有以二進制補碼格式表示的3位有符號值並且想要檢測溢出,則需要對擴展位進行符號擴展,然后查看額外位是否與最重要的位不同:
例如,如果要計算a = 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;
規范說它應該做什么? 應該描述應該在什么條件下設置溢出標志。
通常,當輸出對於存儲而言太大時,設置溢出位。 在將兩個32位數相加的答案中,您可以將其視為第33位。 在帶符號的算術中,如果操作結果的大小太大,則無論符號如何,都會發生這種情況。 使用2-s補碼算法時,您必須要小心,因為最大負數比您在給定位數中可以表示的最大正數稍微負一些。
在實際操作方面,只需創建一個比輸入寬1位的numeric_std
向量即可
a<=b+c;
讓合成器創建邏輯。 然后,您不必擔心細節。
可以取消“a”的MSB(使用a(a'high)
並將其用作溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.