数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器
半加器+半加法和全加法是算术运算电路中的基本单元,它们是完成1位二进制相加的一种组合逻辑电路。
半加器不考虑低位进位来的进位值,只有两个输入,两个输出。由一个与门和异或门构成.
真值表:
//半加器模块
module adder_half( input wire a,
input wire b,
output reg sum,
output reg cout);
always @(*)
begin
sum = a ^ b;
cout = a & b;
end
endmodule
当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数。这种就是“全加"
真值表:
或者Ci=AiBi+(Ai+Bi)Ci-1![在这里插入图片描述](https://img-blog.csdnimg.cn/20190615163154326.png
//full_adder
module adder_full(a,b,cin,,cout,sum);
input a,b,cin;
output cout,sum;
wire w1,w2,w3;
adder_half u1(.a(a),.b(b),.sum(w1),.cout(w2));
adder_half u2(.a(cin),.b(w1),.sum(sum),.cout(w3));
assign cout = w2 | w3;
endmodule
//full_adder
module adder_full(a,b,cin,,cout,sum);
input a,b,cin;
output cout,sum;
assign {cout,sum} = a+b+cin;
endmodule
//8bit_full_adder
module adder_full(a,b,cin,,cout,sum);
input [7:0]a,b;
input cin;
output [7:0]sum;
output cout;
assign {cout,sum} = a+b+cin;
endmodule
之前用八位全加器实现了八位串行的全加器,缺点相当明显,即加法器的延时过高,电路的工作频率低。 此类进位输出,像波浪一样,依次从低位到高位传递, 最终产生结果的加法器,也因此得名为行波进位加法器(Ripple-Carry Adder,RCA)。
如下面的四位全加器
其关键路径如图中红线所示:则其延迟时间为(T+T)*4+T=9T。假设经过一个门电路的延迟时间为T。
对于一个n bit的行波加法器,其延时为(T+T)*n+T=(2n+1)T。
对于较大位数的加法器,如32位的加法器。如果采用行波进位的方式,我们已经分析过需要(32*2+1)= 65级的门延迟, 那如果采用超前进位的方式,理想情况下也只需要四级的门延迟,但可惜的是, 这也只是一个理想。因为要实现32位的完全的超前进位,电路就会变得非常的复杂。 因此通常的实现方法, 是采用多个小规模的超前进位加法器拼接而成一个较大的加法器,例如,用4个8-bit的超前进位加法器连接成32-bit加法器。
参考资料:https://www.jianshu.com/p/6ce9cad8b467