簡體   English   中英

溢出位32Bit ALU VHDL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM