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