另一方面,半加法器半加法器用于计算各两个比特的二进制数a和b的和,输出结果是sum(s )和进位carry(c ) c。 在多比特数的计算中,进位c是下一个相邻比特的加法运算。 单一半加法器的计算结果为2c s。 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /
modulehalf_adder(inputa、input b、output c、output s ); assign c=ab; assign s=a^b; endmodule 真值表:
二、全加器全加器与半加器不同,全加器带有进位cin。 输入为a、b、cin,输出为sum(s )、进位) carry(c ) c,均为单位信号。
s是a、b、cin三个单位数的和,cout是a、b、cin三个数超过2之后的进位。 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /
modulefull_add(inputa,input b,input cin,output cout,output s ); assign s=a^b^cin; assigncout=ab|(CIN(a^b ); end module 3358 www.Sina.com/http://www.Sina.com /
三、行波进位加法器N-bit加法器可以由1-bit全加法器组合而成。 各全加法器的输出进位cout作为下一个全加法器的输入进位cin。 该加法器被称为行波进位加法器(Ripple-carry addr,RCA ),16位加法器的结构如下所示。 这里,a、b是16bit的加法运算,s是a-b的和,c16是该加法器的输出。
由上图可知,进位c16的结果取决于c15、c14、c13、…c2、c1、c0,在32bit、64bit等加法器中进位链看起来更长。 因此,行波进位加法器的设计简单,只需要级联全加法器,但存在超长进位链限制加法器性能的缺点。
moduleRCA#(width=16 ) ) input [width-1:0] A,input [width-1:0] B,output [width-1:0] sum,outpput assign temp[0]=0; genvar i; for(I=0; iwidth; i=i 1 ) begin full _ addr full _ addr _ inst (.a (I )、 b (I )、 CIN (temp ) I )、 cout (temp ) i1最终调制解调器
Nbit行波进位加法器可以级联n个全加法器构成,电路延迟包括门延迟和线延迟等,
从输入a、b、cin到输出s和输出cout,有以下路径。
(1) a ) s )经由xor1、xor2两个门
(2) a ) s )经由xor1、xor2两个门
(3)经由cin—s ) xor2的门
(4) a—cout )经由xor1、and1、or1三个门
(5) b—cout )经由xor1、and1、or1三个门
(6) cin—cout )通过and2、or1两个关口
从以上6条路径可以看出,从a、b、cin的输入数据准备完毕,到所有的s和cout完成,从a或b到cout共有3个选通延迟,是全加法器的最长路径,而且s参与下一级全加法器的运算
n位行波进位加法器的最长路径是(3) (N-1 ),因为在n个全加法器级联的行波进位加法器中,除了第一个进位c1具有3个栅极延迟之外,在剩下的N-1个全加法器中生成进位还需要2个栅极延迟
四、进位前加法器进位前加法器(Lookahead Carry Adder,简称LCA ) ) ) ) ) ) ) ) ) )。
在更宽的加法器n中,行波进位加法器的关键路径越长,加法器的性能就越受到限制,这对高速处理器来说是个大瓶颈。 超前进位加法器优化和改进行波进位加法器的关键路径,但RCA的缺点是,由于第k位进位Ck必须依赖于前一级的Ck-1,所以最高位进位在所有前一个进位计算完成之前不能计算结果。逻辑表达式:
观察上式s和c,将共享部分定义如下。
将LCA加法器改写如下。
其中:
上式中,栅极电平的电路图如下,是半加法器
4bitLCA加法器、其进位链和的公式分别计算如下。
结构图如下。
较大的位会增大电路的扇出和扇入。
基于4比
特LCA级联而成,如16比特LCA可由如下图级联而成(属RLCA):递归超前进位加法器(Recursive Lookahead Carry Adder,简称RLCA)
LCA进位c4的门电路图
LCA输出S3门电路图
RCA的缺点在于关键路径长,限制了速度,性能不高;LCA关键路径短,速度快,进位链计算依赖少,但对于位宽较大的加法器,PG和进位生成逻辑大,存在较大扇入扇出,变化信号多,会有较多的glitch,且面积与复杂度比同等的RCA大。
以下参数化LCA基于4比特LCA设计,width可参数化定义为4的倍数,如20,24,32等。
五、进位旁边加法器进位旁路加法器(Carry Skip Adder,CSA),也称Carry Bypass Adder。CSA也是另外一种加法器-----进位保存加法器(Carry Save Adder)的简称。
上面所述的行波进位加法器RCA,第k位的进位Ck必须等待之前的Ck-1的结果才能计算出来,如下图进位C16必须等到前一级全加器的C15输出才可以计算,所以行波进位加法器的特点便是超长的进位传播链。
进位旁路加法器的思想在于加速进位链的传播,在某种情况下,到达第i位的进位无需等待第i-1位进位。在16bitRCA中,最长的进位链为c0->c1->c2–…->c16,也就是说,每一位全加器都有进位,这条路径也是最长的关键路径。进位旁边加法器通过加入旁路逻辑来缩短这条最长路径,该旁路逻辑由2选1数据选择器,第x级进位和第y级进位和进位bypass信号组成。
CSA结构如上,紫色部分为数据选择器,橙色部分为数据选择信号,数据来源为进位C0和第三全加器的进位输出。
当P3&P2&P1&P0=1时C4=C0;进位C0直接传播至C4,而不需要再经过4级全加器的延迟,这就是进位旁路加法器的核心。
C4 = G3 + G2P3 + G1P3P2 + G0P3P2P1 + c0P3P2P1P0
当P3&P2&P1&P0=1时,则P3=P2=P1=P0=1,所以C4生成的逻辑如下:
C4 = G3 + G2 + G1 + G0 +c0
在超前进位加法器中有如下定义:
P是a与b异或的结果,只有a=0,b=1或者a=1,b=0时,P才可能等于1,而G=ab,所以只要P=1,则G一定为0,所以G3=G2=G1=G0=0.
最后的结论与上述一致:当P3&P2&P1&P0=1时,C4的生成逻辑最终变成C4=c0。
进位旁路加法器关键路径与优化
将Nbit加法器,以mbit为一组,分成N/m组,如下式16bit进位旁路加法器,N=16,m=4,共有4组,该16bitCSA由4个全加器组成的Block,进位逻辑Skip logic和2选1数据选择器三部分组成。
以上关键路径发生在:
(1)c0走第一级Block,经过4级全加器,进位从bit0到bit3生成C4
(2)中间进位经过bypass逻辑
(3)最后一级走Block逻辑,经过4级全加器,进位从bit12到bit15生成C16。
基于此结构通用的关键路径延迟公式为:
Tsetup:A、B低位到第一级Block的时间
tcarry:每个进位传播Bloack中全加器产生进位的时间
Tskip:进位通过skip逻辑的时间
Tsum:从最后个进位到s输出的时间
为什么最长的delay会是中间两级路径,如果加法器全部走Block逻辑,应该延迟更长?其实走最长的路径,中间路径会被旁路,也就是执行0111_1111_1111_1111+0000_0000_0000_0001的情况。第一级产生进位后,中间两级被旁路,最后一级经过RCA进位链,也就是下图中红色描绘出的路径图。
进位选择加法器(Carry Select Adder)由2个行波进位加法器和1个选择器构成,其中一个RCA加法器假定进位为0,另一个RCA加法器假定进位为1,其结构如下:
由4个蓝色全加器组成的RCA,假定进位输入c0=0;由4个绿色全加器组成的RCA假定进位输入c0=1。如果来自低级的进位cin=0,则选择蓝色RCA的进位c4作为该加法器的进位输出;如果来自低级的进位cin为1,则选择绿色RCA的进位的c4作为该加法器的进位输出,同时cin作为选择器选择信号,控制s0~s3的输出是来自蓝色RCA还是绿色RCA。
如下图16bit进位选择加法器,以4bit进位选择加法器为结构级联,每一级的进位可以同时经过4个全加器延迟同时生成,而选择信号在经过最低位的4bitRCA后生效,经过三个数据选择器的延迟,C16就会生成。所以相比于同等16bit的行波进位加法器,进位选择加法器极大的提高了速度,是面积换取速度设计的典型代表。红色描绘路径是关键路径。
进位选择加法器的总结:
优势:对于更大位宽加法器高位进位不取决于进位传播,速度快。但正确的输出必须等待正确的进位选择信号输出。
劣势:电路面积花费巨大,对于N比特加法器,需要几乎比RCA翻倍的全加器个数和许多多余的数据选择器。
对于N比特进位选择加法器构成的基础块,其大小可以相同,也可以不同,即其中RCA全加器个数可以不同。
基于4bitRCA模块,加入数据选择器,构成基础4bit进位选择加法器,由4bit进位选择加法器级联4级搭建成为16bit进位选择加法器,第一级进位延迟为4个全加器个1个输出选择器。
//two RCAs and Carry and sum selectgenvar i;generatefor(i=0;i<width>>2;i=i+1) beginif(i=0) begincsea_4bit u1(.op1(op1[3:0]),.op2(op2[3:0]),.cin(cin),.sum(sum_sel0[3:0]),cout(select[1]));endelse begincsea_4bit u1(.op1(op1[i*4+3:i*4]),.op2(op2[i*4+3:i*4]),.cin(1'b0),.sum(sum_Sel0[i*4+3:i*4]),.cout(c_sel0[i+1]));csea_4bit u1(.op1(op1[i*4+3:i*4]),.op2(op2[i*4+3:i*4]),.cin(1'b0),.sum(sum_Sel1[i*4+3:i*4]),.cout(c_sel1[i+1]));assign select[i+1] = select[i] ? c_sel1[i+1] : c_sel0[i+1];assign sum[i*4+3:i*4] = select[i] ? sum_sel1[i*4+3:i*4] : sum_sel0[i*4+3:i*4];endendendgenerate 七、进位保存加法器进位保存加法器(Carry Save Adder,CSA),使用进位保存加法器在执行多个数加法时具有绩效的进位传播延迟,基本思想是将3个加数的和减少为2个加数的和,将进位c和和s分别计算保存,并且每bit可以独立计算c和s,所以速度极快。
如: Sum= A + B + C + D…
最直接的办法是:先将A+B计算出来,再与C计算,依次如下:
对于m个数相加,每个数n比特宽,总共需要m-1次加法。
使用进位保存加法器CSA结构则可以将门级延迟降到更低,其结构如上图(2)所示,它将3个数相加转换为2个数相加,在数的根部,加数的宽度为n+logm。
10的二进制1010;7的二进制111;12的二进制1100;列出如下算式,按列2进制数相加,满2进1,这就是普通的竖式计算,结果为11100,即29。
而进位保存加法器将进位Carry与和Sum分开计算,计算步骤如下:
(1)计算和Sum:每一列数相加,对进制数取模,此处为二进制,如(0+1+0)=1,(0+1+1)=0,(1+1+1)=1。
(2)计算进位Carry:从竖式低位开始计算,低位向高位进位,每一列的数相加对进制数取商。如下式中,(0+1+0)/ 2 = 0 … 1,(1+1+0)/ 2 = 1 … 0,忽略余数。低位向高位传递进位。
(3)如下式子中,3个数的和变成了2个数,Carry和Sum,分别是11100和00001,注意,此处Carry是11100不是1110,因为是低位往高位进位,最低位进位为0,从竖式也可以看出,对Carry和Sum相加,结果仍然是11101,即29。