先来看图
32位双重分组跳跃进位(先行进位)链
一看即明
分析
-
看第八个小组,di=ai·bi,ti=ai+bi,故他们在得到输入后(ai,bi,c-1)即刻得到
原理如下
-
一位全加器三个输入,两个输出
-
ai,bi操作数
-
c-1低位进位
-
ci 向高位进位
-
si本位和
-
所以C0~C3的值可以算出,但此时后一位必须得到前一位的进位,才能得到,只有得到Ci才能得到本位和,故进位时间是运算速度的瓶颈
所以
这里的C0~C3不采用串行进位
-
做以上变换,di,ti,跟参加运算的数据有关 ,所以可以同时得到,故此时C0~C3可以同时得到(运算电路改变)
故得到初步改进电路,以16位为例
-
如果全部采用先行进位,每个电路会有很多扇入,电路过于复杂,故分为四个小组,组内用先行进位电路,组间串行进位
先行进位电路如下,可想而知,如果位数增多,电路将极其繁杂
问题:D8,T8是什么? -
仍旧以第8小组为例,这是我们熟知的C3的先行进位算法,将其拆分为两部分
-
其余小组同理,展开如下
-
C3的进位要给到第七小组,C7此时的算法已经是之前所说的先行进位
-
D7=d7+t7·d6+t7·t6·d5+t7·t6·t5·d4+t7·t6·t5·t4·C3,只跟本次输入以及低位进位有关,这个进位是C3,也就是说
即使每个小组内可以同时产生进位,但前一小组必须等后一小组产生之后才可以进行自己的先行进位,故做以下变换
好了,现在是什么情况 -
Di,Ti只跟输入数据有关,故此时C7拿到输入数据和C-1后就可以立刻得出,不需要等待C3进位
整个过程是(以第二大组为例)
- 当输入和c-1到位后,同时产生D5~ D8, T5~T8,(Di,Ti只跟输入数据有关),并且产生第八组低三位的进位,产生C3进位的D8,T8传出,所有Di,Ti传出
- 产生C15,C11,C7,C3,但注意,此时第七小组的低三位进位并没有产生,他们要等待C3进位传来(串行进位,原因前面已经说过)
- 第一大组也是同理,要等待C15的输入,而C15的产生不用等到第二大组所有小组的进位完成(像单重分组先行进位那样),而是先行进位得到,提高速率
总结:在每个小组先行进位的基础上,将高位做变换,再一次先行进位(按组的高位)
反思:
- 为什么其他小组的低三位要等上一小组的进位??
答:因为每个小组只是传入了Di,Ti,只满足下一小组最高位的得出,二次先行进位的关键在于Di,Ti的传送
回到开始的32位,应该就不难理解了,其过程为
注意:C19~C31的进位产生晚于C3 ~ C15一步
最后补一张图,以上所说一个小组其实就是四位全加器,集成在一起加上变换函数电路七七八八就变成74181,而Di,Ti,则可以输入到74182完成先行进位,故经常有用74181,74182设计32,64位ALU
学习记录
附图:64位