繁体   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