在上一篇博文(计算机组成原理--真正的减法器-CSDN博客)中,给出了 “级联式” 减法器的电路图。
“级联式” 减法器的各级减法运算,是从低位到高位逐位进行的。这种方法虽然完全符合人类的算法,但是,也带来了速度低的缺点。而且,相减的位数越多,速度就越低。
为了提高减法器的工作速度,也可以仿照 “同步加法器” 的设计思路,把 “逐位进行” 的算法,改为 “同步借位” 的算法。那么,各个位的差,就会在同一步调下产生。
对于一个全减器,输入信号有三个(A、B、Ci),输出信号有两个(Co、S)。它们之间的逻辑关系式如下:
Co = /AB + /ACi + BCi = /A (B + Ci) + BCi
S = A ⊕ B ⊕ Ci
与全加器的关系式相比较,可看出:
全减器的借位 Co,与全加器的进位 Co 不同,变量 A 是取反的。
而两者的 S,是相同的,变量 A 都是原变量。
在前面,做而论道已经给出了同步进位的加法器电路。可否对其做简单的改造就使其成为减法器呢?答案是:不容易。
在加法器电路的输入部分,使用了两个逻辑门:Ai + Bi、AiBi。以此再分别求出 Co 和 S。
但是在全减器中,仅在 Co 才对变量 A 有不同的处理,而在 S 中,又要求 A 是相同的。所以,这就不容易对全加器进行简单的改造,来设计全减器了。
为了借用加法器的设计思路,所以,还是先讨论 “同步进位” 加法器的设计方案。为了简化起见,下面仅用两位加法器来说明问题。两位加法器的功能是:
C2S2S1 = A2A1 + B2B1 + C0。
如果用 “同步进位” 的算法,各个输出分别是:
S1 = A1 ⊕ B1 ⊕ C0
C1 = A1B1 + A1C0 + B1C0 (C1 并不输出,只用来代入 S2、C2)
S2 = A2 ⊕ B2 ⊕ C1
C2 = A2B2 + A2C1 + B2C1
= A2B2 + (A2 + B2) C1
= A2B2 + (A2 + B2) (A1B1 + A1C0 + B1C0)
= A2B2 + A2A1B1 + A2A1C0 + A2B1C0 + A1B2B1 + A1B2C0 + B2B1C0
此时的 C2,是 “基本与或式”。可利用摩根定律,等效转换成 “与非与非式”,如下所示。
按照这些逻辑表达式,即可设计出 “同步进位” 的两位加法电路。下图是用 PROTEUS 软件进行仿真实验的截图。
两位加法器的功能是:C2S2S1 = A2A1 + B2B1 + C0。利用图中左上角的拨动开关,可以输入数据。下方的三个 LED 就会输出运算结果。你可随意输入不同的数据进行验证。
按照图中所示,A2A1 = 11、B2B2 = 11、C0 = 1。本加法器的运算结果是:111。符合加法器的功能要求。
将前面的加法器改造成减法器,就很容易了。只要把产生 C2、C1 的 A2、A1 做一次反相即可。那么,“同步借位” 减法器的 C2 逻辑表达式,即如下所示。
按照这些逻辑表达式,即可设计出 “同步借位” 的两位减法电路。如果用一个异或门代替反相器,则可以设计出 “可控的加减法电路”。下图是用 PROTEUS 软件进行仿真实验的截图。
在上图中,A2A1 都是经过异或门再送到 “同步进位” 电路的,因此,就可以由一位二进制数控制 A2A1 反相与否。当选择开关 SW1 拨到右边,异或门就会对 A2A1 进行反相。此时,本电路的功能就是 “同步借位” 减法器。输入输出的逻辑关系就是:C2S2S1 = A2A1-B2B1-C0。
图中的 A2A1 = 00、B2B1 = 01、C0 = 0。减法运算结果应该是-1。而 C2S2S1 = 111,正是-1 的补码。符合减法运算的规则。
这种加/减电路,即具有快速进/借位的功能,控制又极为方便。缺点则是:随着运算位数的增多,电路就会大幅度提高复杂程度。当然,如果用集成块搭建电路,是比较困难的,但是,如果由集成电路厂家把电路集成到芯片内部,这缺点就不明显了。
在 8086/8088 CPU 中,运算器是一个 “数字逻辑运算单元”,英文简称是 ALU。ALU 的功能有很多了,其中就包含了:加法运算、减法运算。
由于在 CPU 中,早就具备了减法运算功能,所以,就可以直接用二进制数来相减了,而不必先转换到补码再相加。因此,在《计算机组成原理》中,喋喋不休的讲 “用补码相加来做减法”,借此来设计除法电路,纯粹就是误导了。
--本文完--