书中无此页面内容,属于作者在制作网页时临时增加的福利
在上一节用逻辑门实现加法中展示了如何用逻辑门构建数字加法器。
不过无论逻辑门如何构建,它们总是存在一定的传播延迟。
这是输入变化反映到输出所需的时间。
当逻辑门的输出成为其他逻辑门的输入时,每个单独门的传播延迟会影响电路的整体速度。
逻辑门实现加法末尾展示的8位加法器由8个级联的1位加法器构成。
每个加法器可能产生一个Carry OUT值,这是下一个加法器所需的。
这被称为"行波进位"。
正如其名,它的进位像水波一样传递,也带来了较大的延迟
加法器的整体速度是1位加法器的传播延迟与位数的乘积。
那有没有一种可以不受因位数导致传播延迟的逻辑门组合呢
有的兄弟,有的
也称为"carry lookahead adder"(超前进位加法器)或"fast adder"(快速加法器)
在任何情况下,所有输入组合都可以用这个逻辑表来总结
其中CI代表Carry In,CO代表Carry Out:
输入 | 输出 | |||
---|---|---|---|---|
A | B | CI | Sum | CO |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
首先我们来分析一下Carry Out是怎么变成1的
在某些情况下,Carry Out位是相加生成的
这意味着它来自A和B输入的值。
具体来说,如果A和B都为1,则Carry Out是相加生成(Generate)的。在其他情况下,Carry Out位是传播(Propagate)的
这意味着它来自值为1的Carry In与A和B输入的组合。
此表显示了Carry Out位被生成和传播的情况:
Inputs | Outputs | Carry Type | ||||
---|---|---|---|---|---|---|
A | B | CI | Sum | CO | Generate | Propagate |
0 | 0 | 0 | 0 | 0 | ||
0 | 1 | 0 | 1 | 0 | ||
1 | 0 | 0 | 1 | 0 | ||
1 | 1 | 0 | 0 | 1 | ✓ | |
0 | 0 | 1 | 1 | 0 | ||
0 | 1 | 1 | 0 | 1 | ✓ | |
1 | 0 | 1 | 0 | 1 | ✓ | |
1 | 1 | 1 | 1 | 1 | ✓ | ✓ |
让我们定义两个名为G(生成)和P(传播)的值:
(注意此处的G、P与上方表格中的Generate、Propagate不是一样东西)
G为1表示A和B都为1,这表明Carry Out值为1是生成的:
P为1表示A或B为1:
当P和Carry In都为1,那么Carry OUT值为1是传播的。
此表的最后一列显示了如何从G、P和Carry In计算Carry Out位:
Inputs | Outputs | Carry Calculation | |||||
---|---|---|---|---|---|---|---|
A | B | CI | Sum | CO | G = A AND B | P = A OR B | CO = G OR (P AND CI) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
有趣的是,之前的1位加法器没有像此表最后一列所示那样计算Carry Out位
下方是之前的1位全加器:
一步一步来
将最左边OR和NAND门上下交换位置,现在NAND门位于OR门上方。
这对电路的工作方式没有影响。
这实际上只是一个外观上的差异,但是有助于即将出现的新电路。
接着修改电路使其这样:
上下两图,结构不一致,但实现的效果是一致的
有趣的是,这个电路比之前的电路稍微快一些。
计算Carry Out所需的逻辑门,比之前电路使用的更少。
假设您有四个1位加法器,用于相加一对4位二进制数。
我们按下面的法则来定义A、B、CI、CO变量
0表示最低有效位,1表示下一位,然后是2,3表示最高有效位。
对于每个四位加法器,Carry Out位可以使用前表所示的公式计算:
但每个位加法器的Carry Out位成为下一个更高有效位的Carry In位,因此Carry In位也可以计算:
注意CI2的公式以CI1结尾,但上一行表明CI1等于G0、P0和CI0的组合,因此可以这样重写公式:
这个公式不再需要CI1,这意味着CI2可以在没有前一个Carry位的情况下计算。
此时,使用OR和AND这些词变得有些笨拙
最好切换到代数表示法,其中+表示OR,·表示AND。
每个Carry In位可以表示为各种G和P值以及CI0的组合。
如果只需要四位加法,通常将CI0设为0,但让我们更通用化:
当我们完全展开后,得到的是以下的式子
上面的是超前进位加法器,而下面的是行波进位加法器的
我们通过公式来分析一下,为什么超前进位加法器能算得更快
看一下两者的CI4
行波进位加法器的CI4是层层嵌套的,一个外括号就是嵌套一次,只有里面的算出来了,外面的才能算出来
超前进位加法器的CI4公式较为扁平,无需等待前面进位的依次传递,能直接算出来
行波计算是一种串行计算,后面要等前面
超前进位计算是一种并行计算,大家都能一起算
所以超前进位加法器的速度更快
具体到电路中,超前进位加法器只需多挂载几个与门即可
如果你还是觉得抽象,难以理解,你可以看一下下面的电路图
同时包含了超前进位加法器和行波进位加法器的电路图
能让你更直观的理解
以下电路同时包含一个带行波进位的四位加法器和一个带超前进位电路的四位加法器。
两个加法器共享相同的输入和部分逻辑门
超前进位加法器的Carry In位表达式通过图底部的OR和AND门实现。
使用顶部的方形按钮设置两个四位值。最低有效位在右侧,最高有效位在左侧。
您还可以在最右侧选择第一个Carry In值。
上行显示带行波进位的加法器结果,下行显示超前进位的结果。
最左侧的圆圈显示最终的Carry进位位。
此电路设置为每个逻辑门具有250毫秒或1/4秒的传播延迟。
这突出了两个电路之间的区别。
圆形灯顶行上方的逻辑门专用于使用行波进位的加法器。
此电路上一节中的1位加法器相同。
注意Carry Out值成为下一个更高有效位的Carry In值。
电路下半部分提供关键的G和P信号。