Signed addition overflow
/*
这里要说明一下补码的相关知识点:
补码是计算机中用于表示有符号整数(即正数和负数)的方式
补码表示的范围(注意有正负之分):
对于一个 n 位 的二进制数:最大值:+2^(n-1) - 1,最小值:-2^(n-1)
例如对于 8 位 补码:最大值:+127(01111111),最小值:-128(10000000)
在计算机中,最高位为0表示“+",相反,最高位为1的时候表示”-“
正数的补码与原码(正常的二进制表示)相同
例如:5 的 8 位补码是 00000101。
负数的补码是通过对其绝对值的二进制表示取反(取反是指0变1,1变0),然后加1来得到
例如-5 的补码:先表示 5 为 00000101。取反:11111010。加1:11111011。所以 -5 的补码是 11111011。
如何判断加法溢出?
符号位相同:如果 a 和 b 的符号位(a[7] 和 b[7])相同,表示它们的加法不会因为不同符号而立即产生溢出。
结果符号位不同:如果 a[7] 和 b[7] 的符号位相同,而结果 s[7] 的符号位却不同(即加法结果符号位发生了变化),那么就发生了溢出。
例如:
a + b = 127 + 1 = 128,但是128不能表示为8位的补码数,因为它超过了最大值127。
在补码表示中,128 会变成 10000000,这实际上是 -128,所以发生了溢出。
*/
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
); //
// 计算和数s
assign s = a + b;
// 溢出检测:检查符号位的变化
assign overflow = (a[7] == b[7]) && (s[7] != a[7]);
endmodule