加法器中进位和溢出的区别以及Verilog中的代码区别

一:加法器中进位与溢出位的区别

1.首先要说的是,对于无符号数我们讨论的是它的进位位;对于有符号数我们讨论的是它的溢出位,因为有符号数的进位位就是溢出位。
2.在微机原理或计算机运算中,进位是指运算的结果对更高一位形成+了1的进位或-1的借位,进位标志位表示为CF(Carry Flag);溢出是指运算的结果超出了规定位宽所能装载的数值范围,溢出标志位表示为OF(Overflow Flag).。
3.进位与溢出对运算结果的影响:通过以下一个例子的对比来讨论无符号数的进位标志位和有符号数的溢出标志位对结果的影响:
假设研究对象是8位数据的加法器,则对于无符号数其表示范围是0-255,有符号数其表示范围为-128~127。
那计算机是如何知道现判断的是无符号数还是有符号数的呢?
通常计算机会直接把对象当作无符号数来处理,但是具体要用哪个标志位(OF或CF)则由程序员自行决定。
(1)溢出标志位:
以 7FH(0111 1111B)+02H(0000 0010B)=81H(1000 0001B)为例:
如果把它当作无符号数来运算,那么运算结果是81H(+129),此时没有发生进位,即CF=0;
如果把它当作有符号数来运算,那么运算结果是81H(由于负数以补码来表示,因此为-127),此时可以发现,结果(-127)与理论运算结果(129)不同,发生了错误,因为产生了溢出(此时溢出位OF=1)。可以发现溢出位的置位规律为:当两个相加数(A和B)的符号位相同同时它们的和与它们有不同的符号,就会产生溢出。通常溢出标志位的逻辑表达式为:
OF=(A[n-1]&&B[n-1]&&~ sum[n-1] )+(~ A[n-1]&&~ B[n-1]&&sum[n-1]);
(2)进位标志位:
以1000B+1100B=10100B为例
如果把它当作无符号数处理,则最高位的1就体现出了“进位”,此时计算结果并没有发生错误,而是在更高的bit体现了 进位,结果仍然是10100B(即十进制的20),此时进位标志位CF=1;
如果把它当作有符号数处理,那么此时计算结果的最高位被舍弃(“弃位”),结果为0100B(也就是十进制的+4),可以发现这时出现了溢出,对结果产生了影响,溢出标志位也被置位:OF=1

二:verilog中进位与溢出的实现

1.四位无符号数进位加法器的实现:

/*****带有进位标输入和输出的无符号数加法器******/
module cf_add(a,b,cin,cout,sum);

input   [3:0]a,b;
input   cin;
output  cout;
output  [3:0]sum;

assign {cout,sum}=a+b+cin; 
endmodule 

RTL仿真图解(也许是叫RTL吧QAQ)
加法器中进位和溢出的区别以及Verilog中的代码区别_第1张图片

2.八位有符号数带溢出加法器的实现:

module of_add(a,b,s,overflow);

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 

/*另一种实现方法如下:
   wire [8:0] t;
	assign t = {a[7], a} + {b[7], b};
	assign s = t[7:0];
	assign overflow = t[8] ^ t[7];
*/

RTL电路仿真结果
加法器中进位和溢出的区别以及Verilog中的代码区别_第2张图片
时序仿真结果(在HDLBits上有相关题目和解答 题目传送门:HDLBits中带有溢出的有符号数加法器题目; 解答传送门:知乎解答):
加法器中进位和溢出的区别以及Verilog中的代码区别_第3张图片
本文综合自己学习中遇到的问题总结而成,同时也借鉴了其它答主的一些回答和想法,关于溢出的具体原理,csdn上也有非常好的回答:溢出和进位 By景彪
第一次写博客,如果有漏洞或者笔误还请多多指教。

你可能感兴趣的:(fpga)