Assume that you have two 8-bit 2's complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.
本题讨论的是有符号数相加的溢出问题中,需要实现一个 2 进制 8bit 有符号数加法器,加法器将输入的两个 8bit数补码相加,产生相加之和以及进位。
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
assign s = a + b;
assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);
endmodule
这里从溢出发生的情形出发解题,有符号数溢出有两种情况:一是正正相加,产生正溢出;另一种情况是负负相减,产生负溢出。所以就分别考虑了这两种情况,将这两种情况取或判断溢出。
a[7] && b[7] && ~s[7]:
负数相减(补码相加)产生正数,判断溢出。
~a[7] && ~b[7] && s[7]:
正数相加产生一个负数,判断溢出。
原码、反码和补码详解:
数字逻辑电路——原码,反码,补码_Cyan010320的博客-CSDN博客_原码补码转换逻辑电路图
【计算机组成原理】——补码加减法运算,如何判断溢出?_@玉面小蛟龙的博客-CSDN博客_补码溢出