模红全加器
全加的传统概念是:对两个数和进位输入信号进行加法处理,并输出进位信号
那么按照这种传统思维得出的算法是:输入两个加数A、B和一个进位输入信号CI,先用一个大的信号源X(X要大于A+B),计算A+B的值:X-(X-A-B),如果得出的数大于等于要计算的进制的值,那么就把这个数减去进制的值(比如要计算的是10进制就减去10),输出到下一步,并输出进位信号C(进位信号只有1和0),;如果小于进制值,不作处理,输出到下一步;把处理完的数加上进位输入CI,如果大于等于要计算进制的值,减去进制值,输出结果,并输出进位信号C(前面的后面的进位输出C是可以连在一起的);如果小于进制值,直接输出结果
这样把多个全加器的进位输出C和进位输入CI首尾相连,就得到了并行全加器
可以看到过程很繁琐,信号源X是个麻烦的家伙,一言不合就会出现强模
如果我们没有强模,那要怎么计算和大于15的两个数的和呢?我们可以把这个算法优化一下
拿16进制举例
当A+B小于16时,A+B=15-(15-A-B)
当A+B大于等于16时,A+B-16(-16是减去进制值)=A-(15-B)-1
下面这一步是怎么得出来的呢?我们来推一推:15-(15-A-B)-16=A+B-16=A+(B-16)=A+(B-15)-1=A-(15-B)-1
好,算法已经get到了,那么用布线语言应该怎么描述呢?
输入A、B,
①算出15-(15-A-B)的值,如果A-(15-B)>0则切断前面的输出,用另一个输出代替:A-(15-B)-1,并输出进位信号
②把上一步的输出和上一位的进位信号加起来,如果大于等于16就减去16,输出进位信号,否则直接输出
可以看到进行了两次全加运算,一次是前面A+B,后面是结果和进位信号的,我们还可以优化一下,把后面的全加运算去掉,这个时候,我们需要一种进位技术:串行进位链
串行进位链在数电加法器中也有运用,这种加法器也称伪超前进位加法器,其应用可以大幅提高进位速度
但是在模红这里,我们运用它是要缩小体积和优化算法
进位链确实是一条链,他可以被切断,可以在某个位置输入
比方说一条进位链有4位,3的位置被切断了,1、2、4的位置是打开的,从1输入信号,那1、2都能接收到这个信号,而4被前面的3切断了所以收不到信号
进位链在全加器中怎么用:
第一步
每一位的默认状态位切断进位链
每一位的进位输出(A-(15-B)>0)接到下一位的进位链输入
当①计算出来的结果等于15时,打开进位链
进位链示意图

第二步
把上一步的输出加上进位输入(直接加)
如果上一步输出为15且进位输入为1,直接输出0,其他都不管
到这里就计算完了,之所以直接输出0不用管是因为进位已经在前面处理好了