上一小节我们介绍了一些电路的基本知识,并且利用电路的基本知识,在上一小节的末尾设计了一个比较简单的加法器。
这一小节中,我们主要会来探讨这些加法器应该怎么进行改进,使它执行加法的速度更快。
这小节的内容会比较绕,不过这一小节,并不是考试的重点,大家能有个大致的了解就可以了。
首先来看一下上一小节留下的串行进位的并行加法器
,它存在什么特点。
由于我们只是把这些一位全加器进行了简单的串联,而每一个全加器对本位和的计算,还有高位的进位的计算,都会依赖于来自低位的进位,因此这种加法器只能实现串行的进位。
就像多米诺骨牌一样,只有低位的进位算出来了,高位的进位信息,还有高位的本位和才能得到正确的结果。
所以这种加法器它的加法执行的速度,很大程度上是受到这些进位信息产生的速度的影响。
接下来我们要思考的问题就是,如何让各个进位的信息产生得更快。
来看每一个进位产生的逻辑表达式。
Ci这个进位,依赖于加数(Ai)和被加数(Bi)的两个等位的数值,另外还需要基于低位(Ci-1)过来的进位才可以算出来。
只不过这个表达式它具备一种递归的特性,Ci-1可以继续把它展开,变成这个样子:
Ci-1的产生会依赖于第i-1位的加数(Ai-1)和被加数(Bi-1),另外也会依赖于更低位进过来的进位(Ci-2)。
我们继续再把Ci-2进行展开,又可以得到这样的式子:
所以,如果我们一直往下展开,终有一天我们可以把它展开到C0。而 C0 这个信息是最开始就拥有的信息。
从这个式子里面可以看出来,我们只需要知道 Ai~A1
这些位的信息以及Bi~B1
这些位的信息,最后再结合一个 C0 的信息,我们就可以直接算出 Ci的值。
所以,每一位向更高位的进位,我们计算值所需要的那些数据,在刚开始其实就已经准备好了。因为被加数和加数每一位是多少,在刚开始就可以确定;而 C0 也是刚开始就有的信息。
所以如果我们能够利用刚开始就拥有的这些信息来直接求 Ci 这个进位的信息,我们就不需要像之前那样,等着这些进位一个一个运算结束,才可以算Ci的值。
这就是我们接下来的优化思路。
为了让表达式看起来更简洁一些,我们把Ai和Bi相与的部分记作Gi,把Ai和 Bi异或的部分记作 Pi。这样我们的式子可以得到化简。
所以,Ci的表达式我们可以写成如下的形式:
当然了,这儿其实不是数学里边的加,这里其实是一个或运算。
只不过这个地方我们用加还有乘这样的方式来描述,大家会更容易理解一些。上一小节我们说过与和或它们之间的这种关系,非常像算数运算里的乘和加。当然也具有结合率,分配率那些规律。
所以接下来的讲解中,我们会把或念作“加”,把与念作“乘”。
基于这个式子,我们可以知道 C1 ,也就是第一位的进位,应该是等于G1加上 P1 乘以C0。
C2 这一位的信息会根据低位过来的 C1 还有 A2 和 B2 进行一个运算。同样基于这个式子,可以得到 C2 应该是等于G2加上 P2 乘以C1,我们把 C1 用刚才得到的式子进行展开,就可以得到这样的一个结果。
接下来 C3、C4 也是一样的,只不过就是层层的套娃,把它给套进去就行了。
需要再次强调,得到 Gi和 Pi的这些信息,我们刚开始就有,因为 Ai表示的是被加数,Bi表示的是加数。被加数和加数的完整信息,它们的每一位的值到底是多少,我们刚开始就可以知道。
所以我们刚开始就可以同时输入的这些信息,应该是被加数 A1 一直到最后一位An,还有加数 B1 一直到最后一位 Bn的信息。另外还有以前的运算保留下来的 C0也就是最原始的进位信息,也是我们刚开始就可以知道的。
现在根据 A1 和 B1 我们就可以得到 G1 和P1。
观察下面这些式子,我们会发现 G1 和 P1 在 C2 、C3、 C4 的运算当中,都是需要用到的。
当然在 C1 的运算当中我们也需要用到。
所以 G1 和 P1 这两个比特的信息,可以刚开始就把它送到后边这些全加器里边。
这是根据 A1 和 B1 得到的两个比特的信息。
接下来 A2 和 B2 经过运算之后,也可以迅速的得到 G2 和P2。经过观察会发现,只要是角标大于等于 2 的这两位信息,都需要用到 P2 和G2,你看 C3 、 C4 也是需要用到P2, G2 ,所以 G2 和 P2 这两位的信息需要送到后面那几个位的加法当中。
后续的推理都是一样的。通过加数和被加数对应的两个比特位,可以算出与之对应的 Gi和Pi。Gi和Pi的信息,可以通过线路把它送往更高位的运算当中,因为更高位的这些运算的进位的确定需要依赖于 Gi和Pi。
这就意味着即便我们要计算的是 C4 进位的信息,在刚开始我们就已经把所有的计算所需要的这些数据,这些原材料给它准备好了。
我们只需要根据表达式设计相应的电路,就可以在第四个全加器直接算出 C4 的值。
也就是采用这种策略,每一位的进位都几乎是同时产生的,我们不需要再像之前那种设计方案那样,需要等待着后面的进位一位一位往上传。
所以这种加法器的速度会快很多。
我们把这种加法器称为并行进位的并行加法器
。因为每一个进位信息都是并行的产生的,几乎可以在刚开始就同时产生。
所以这种进位方式又可以称为先行进位和同时进位。
接下来我们再来看这种设计方案的一个不足。我们从C1、C2、C3、 C4 一路往下套娃,套的越深,你会发现逻辑表达式变得越长。
如果继续往下算,C5、 C6 会变得越来越复杂。
上一小节我们说过,逻辑表达式本质上其实就是我们电路的一种数学化的描述。逻辑表达式越长越复杂,就意味着我们的电路设计也会越来越复杂。
所以我们套娃的过程应该适可而止。
比较经典的一种做法是,我们会套到C4 这一位,也我们可以同时支持四位加四位的运算。
在加法器内部,每一个进位都是同时并行产生的。就像刚才我们分析的那样,我们只需要由 4 个FA,也就是 4 个全加器,再加上一些新的线路,加上一些运算逻辑,运算逻辑就是根据刚才的表达式来设计的。
加上这些东西,我们就可以构成一个4位的 CLA 加法器。