在上一篇博文(计算机组成原理--同步加法器-CSDN博客)中,做而论道已经成功的设计出了 “同步加法器”,从而大幅度的提高了加法器的工作速度。
但是,“同步加法器” 的电路比较复杂,而且随着加法器位数的增多,其复杂程度越发明显。为此,就应该使用 “分组同步” 的方法,组内采用 “同步”,组间采用 “串行”,这样就可以在 “工作速度” 和 “复杂程度” 之间,找到一个平衡点。
74LS283 是一个同步进位的四位加法器芯片。在两片 74LS283 之间,采用 “串行进位” 的连接方式,就组成了一个八位的加法电路。如果需要,还可以继续级联,组成更多位数的加法电路。
电路的上方是输入的加数与低位的进位,下方是输出的进位与八位的和。
电路的左下角是进位输出端,如果你忽略它,只注意八位的和,你就会观察到减法的运算效果,体会到所谓的 “补码” 的作用。
随便找两个二进制数算一下,如下:
如果你保留进位,这就是:0111 0101 + 1101 0111 = 1 0100 1100。
相当于十进制的加法运算:117 + 215 = 332。
如果你舍弃进位,这就是:0111 0101 + 1101 0111 = 0100 1100。
本次加法,就是减法运算:117 - 41 = 76。
由此可知,当出现了进位,而你又舍弃进位,此时的【加法,就相当于减法运算】。
这种现象,不仅仅限于二进制数。试试看吧,在任意进制条件下时,你都可以观察到的。
这是数学领域的一个普遍规律,并非是计算机专家所定义的神马 “补码”。
舍弃了进位,+215 就能当做-41 来使用,加法,就能当做减法。
215 和 41,对应的关系,是怎样的呢?
如果用十进制来分析,可以看出,它们的和,是 256。
如果用二进制来分析,可以看出,它们两者是 “取反加一” 的关系。
即:先对 1101 0111 取反,可得 0010 1000,再加一,就是 10 1001 = 41 (十进制) 了。
同样,对 41 的二进制取反加一(并舍弃进位),也能得到 215。
注意,此处的 “取反加一” 并非是 “求补码” 中的 “取反加一符号位不变” 。
实际上,二进制数,它就是一个数。数字本身,根本没有神马 “符号位” !
而计算机专家所蛊惑的 “机器数真值符号位原码反码补码正数三码相同负数取反加一符号位不变模同余符号位也参加运算等等”,都是一派胡言!
在《数字电子技术》中说的取反加一,是针对全部的二进制位一起进行的。这种做法,就是所谓的 “求补”。
取反,可以利用反相器来完成,也可以用 “异或门或上 1 ” 来实现。加一,用 C0 = 1 就可以做到。
那么,利用加法器实现减法的电路如下:
这是一个可控的四位加减电路。图中左上角的拨动开关称为 M,由它就可以控制进行加法运算或减法运算。
当 M = 1 时,异或门即成为反相器,并且有 C0 = 1,这就实现了对 B 数据的取反加一。
此时,本电路的功能就是:S4S3S2S1 = A4A3A2A1-B4B3B2B1。
当 M = 0 时,就没有事了,功能仍然是:C4S4S3S2S1 = A4A3A2A1+B4B3B2B1。
图中的 M 为 1,就是做减法运算,S = A-B = 1010-0101 = 0101。运算正确。
但是,图中的进位 C4 的输出,是错误的,它不应该是 1。
为了纠正 C4 的错误,可以在 C4 处再补上一个异或门。改正的电路如下:
由图可见,此时的五位输出,都是正确的了。
即:C4S4S3S2S1 = A4A3A2A1-B4B3B2B1
= 1010 - 0101 = (借位 0) 0101。
你可以随意的拨动图中的九个开关,即可全面验证本电路的正确性。
在计算机专业的一些教材中,对于进位(做减法时,代表借位)输出端 C4 的输出为何值,是不予理会的。
为什么呢? 大概,是他们忘了写了吧。
本文完