目录
一、进位保存加法器
进位保存加法器(Carry Save Adder,CSA)终于开启了读者见面会。在之前介绍的众多加法器的缩写中,CSA众多。比较广为人知的CSA可能是进位保存加法器,所以它是怎样的存在呢?
使用进位保存加法器在执行多个数加法时具有极小的进位传播延迟,它的基本思想即将3个加数的和减少为2个加数的和,将进位c和和s分别计算保存,并且每比特可以独立计算c和s,所以速度极快。
在许多加法计算中,一般有2个以上,或者更多的加数。
如: Sum = A + B + C + D + E + …
最直接的办法是:先将A+B结果计算出来,再与C计算,依次进行,如下图(1)。
对于m个数相加,每个数n比特宽,总共需要m-1次加法。假如使用超前进位加法器LCA的话,直接相加法总共需要的门延迟为O(lg n);如果使用树形加法器(后期会介绍),门延迟将变为O(lg m * lg n)。
使用进位保存加法器CSA结构则可以将门延迟降到更低,其结构如上图(2)所示,它将3个数相加转换为2个数相加,在树的根部,加数宽度变为O(n+log m),因此如果最后一个加法器用LCA的话,则门延迟为O(lg(n+lg m))。
以(10 + 7 + 12 = 29)为例看看进位保存加法器是啥高级操作:
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。
二、3:2 Compressors
3:2 Compressor是进位保存加法器的一种,它将三个数的和转换为2个数的和,基本行为与第一部分描述的一致,根据算式的行为,列出其真值表如下:
定睛一看,3:2 Compressor就是一个全加器啊!
所以只要将全加器经过如下的变换,就可以将全加器FA生成进位保存加法器CSA,简直换汤不换药,重新包装了一下。
三个32比特的数x,y,z相加,其CSA结构如下:
在使用verilog设计一个算式如Sum = A + B + C + D;则可以设计一个全加器,由全加器组成N比特的CSA结构,将多个数合并,经过两级CSA,最后将进位C[N-1:0]与和Sum[N-1:0]通过一个加法器相加,注意进位传入到任何模块中时,需要将C[N-1:0]乘以2,因为这是它合并后真正的数。
欢迎批评指正,更多阅读,关注“纸上谈芯”,不定期更新,共同学习: