超前进位加法器的理解

目前在所有的cpu中,为了提高加法的计算速度。都采用了超前进位加法器。

普通的加法器我们很好理解,我这里从网上找了一张图。

可以想象最简单的加法计算就是每一位都进行一次全加器计算,然后产生一个进行c,下一个全加器在取得进位以后再进行他的位的计算,循环下去直到最后一位。这样的问题是进行一次32位的加法计算就需要至少串行的经过32个全加器,如果CPU的频率是3Ghz,那么一个时钟周期,大约333皮秒内,是无法完成一次简单的加法运算的。


那么超前进位加法器是如何做到高速计算的,可以想象肯定是把计算平行化了,而且是用数量来换了速度。但是具体是怎么做的呢。我们来一起分析下。

首先考虑所有的加法情况

Row x y cin cout s
0 0 0 0 0 0
1 0 0 1 0 1
2 0 1 0 0 1
3 0 1 1 1 0
4 1 0 0 0 1
5 1 0 1 1 0
6 1 1 0 1 0
7 1 1 1 1 1

我们用这公式来描述所有2进制加法的进位的计算公式

ci+1 = xiyi + xici + yici
这里c表示的是进位,举个列子来说就是第一位的进位c1他是由第零位的x0*y0+x0*c0+y0*c0, 这里很明显c0是始终为0的。那么c1=x0*y0
然后这个提取公因子公式就变成了
ci+1 = xiyi + ci(xi + yi)
然后是不是发现,这样一来只有ci是不确定的。其他的xi和yi都是直接输入。
但是ci其实呢通过循环inline的一个替换,其实会变成类似
ci+1 = xiyi + (xi + yi)(xi-1yi-1 + ci-1(xi-1 + yi-1)
然后可以一直这样替换下去,直到c0这一层。或者是最右端的输入。
一般的通常会把这几个变量成为g,p变量
 gi = xiyi 
 pi = xi + yi


这样理论上可以实现任何位数都在有限次内完成,但是这样的代价是位数越多需要的电路也就越多。
这里附上一张wiki中的图来说明
这里第一步的时候,所有的4个全加器对每一位计算出自身的和Si, gi和pi
然后第二部,超前进位器计算出c1,c2,c3,c4,当然这里的c1,c2,c3,c4计算需要的逻辑门数量是逐步递增的。
然后c1,c2,c3对S1,S2,S3进行进位,C4会传递给更上面的位。
基本就是这样了。但是由于成本的问题一般都会把32位或者64位的切割成多个16位的超前进位来进行计算,能保证在一个时钟周期内完成基本就可以了。
取得一个成本和性能上得平衡。

你可能感兴趣的:(超前进位加法器的理解)