《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

这一章基本上全是新知识点,所以,你会看到,我差不多把整章内容都搬过来了。

二进制数字相加的结果具有两个数位,其中一位叫做加法位(sum bit),另一位则叫做进位位(carry bit,比如“1加1等 于0,进位是1”)。现在,可以二进制加法表分成两张表,第 1张是表示“加法”的表:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

第2张是表示“进位”的表:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

与十进制加法一样,二进制加法也从最右向左逐列相加两个数:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

注意,当从右边加到第3列的时候,产生了一个进位。同样的情况也发生在第 6、7、8列。

为了更合理一些,我们决定搭建的二进制加法器最高能执行的加法长度为8位。也就是说,操作数的范围是从 0 0 0 0 - 0 0 0 0~1111 1111,即十进制的0~2 5 5。两个8位二进制数的和最大可以是1 - 1111 - 111 0,即5 1 0。

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

如上图,板上有两行开关,每行 8个。这些开关集是输入设备,我们将用它输入两个 8位数。开关往下表示0,往上表示1。输出设备在板的底部,是一行灯泡,共 9个。 这些灯泡用来表示加法的结果,不亮的灯泡表示 0,亮的表示1。我们用了9个灯泡是因为两个 8位数相加的结果可能是9位数。 例如,如果我们想把 0 11 0 - 0 1 0 1和1 0 11 - 0 11 0加起来(即前例中 显示的两个数字),需把相应的开关设置成上图的样子。

加法机的余下部分包含了以不同方式连接而成的逻辑门。开关触发逻辑门中的继电器, 继电器接着点亮相应的灯泡。

当你看到下面两个1位二进制数相加的进位表时,你可能立刻会想到逻辑门和二进制加法 之间有某种联系(这和上章所述的与门的输出是一样的):

                  《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器                  《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

所以,与门可以用来计算两个1位进制数位相加得到的进位。

那么,加法表如何用继电器来实现呢?

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

首先应意识到或门的输出和我们所期望的很近似,只是右下角的结果不同;而对于与非门而言,除了左上角的输出不同以外,其他结果也与期望的一样:

                                    《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

总结上面三张表可以得到:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

从上表可以看出,只要将两个门的输出的结果通过与门连到一起就能得到我们想要的结果:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器


异或门:


实际上面这个电路有它自己的名字,称为“异或门( Exclusive OR gate ,简写为 XOR)”。之所以称之为异或门,是因为若想输出为 1,要么仅让A输入为1,要么仅让B输入为1,但不能同时为1,否则输出则为0。这样可以不用再去画一个或门、一个与非门和一个与门, 可以用电气工程师规定的符号来表示它:

异或门的特征如下表:

                              《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

至此,我们可以使用与门和异或门来实现这些结果:二进制数的“加法”可以由异或门得到,而“进位”可以由与门得到,所以可以把异或门 和与门结合起来来完成两个二进制数 A和B的加法:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器


半加器:


为了避免重复画与门和异或门,可以把上图简单地表示成如下的样子:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

这个符号称为“半加器(Half Adder)”,它可以把两个二进制位A 和 B相加,从而得到 一个加法输出 (简称S) 和一个进位输出 (简称C O )。但大部分二进制数是多于1位的,半加器不能 够把前一步的进位加到本次运算中。例如做如下加法:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

只能用半加器来计算最右边一列数的加法:即 1加1等于0,进位为1。对于右边第2列数,由于进 位的存在,需要加3个数。

要把3个二进制数相加,需要按如下方式把两个半加器和一个或门连接起来:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

要理解它的工作原理,先从最左边第一个半加器的 A 输入和B 输入开始,其输出是一个 和及相应的进位。这个和必须和前一列的进位输入 (简称CI) 加起来,然后把它们输入到第二 个半加器。第二个半加器的和输出是最后的和。两个半加器的进位输出又输入到一个或门, 或门产生了本次加法的进位输出。你可能会想这里还需要一个半加器,这当然是可行的。但当你把所有的可能情况考虑完,你会发现两个进位不可能同时为 1。当两个输入不能同时为 1 时,或门已足够用于表示两个进位的加法,此时或门和异或门的功能是相同的。


全加器:


上图可简化表示为下面的方块图,称其为“全加器(Full Adder)”:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

下面的表是对全加器所有可能的输入及其相应输出的小结:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

本章中的 8位加法机就至少需要 1 4 4个继电器,这个数目是如何得到的呢?每个与门、或门、与非门 都需要2个继电器,所以,一个异或门需 6个继电器。一个半加器由一个异或门和一个与门构 成,所以它要8个继电器。1个全加器需要两个半加器和一个或门,所以它要 1 8个继电器。对 于8位二进制加法机而言,共需8个全加器,因而总共是1 4 4个继电器。

现在可以把这些开关和灯泡连接成全加器了。 首先把最右边的两个开关和一个灯泡连到一个全加器上,如下图所示:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

第1列不会有进位输入,所以全加器的进位输入端是接地的,这表示输入为“ 0”。 而接下去的几列可能包括来自前面加法的进位,对于接下去的每组两个二进制位和灯泡,可以按如下办法连接全加器:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

第八个灯泡和最后一对开关连到最后一个全加器上,这里最后的进位输出连到第九个灯泡上。连接方式如下图所示:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

还可以用另一种方式来看8个全加器的连接:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

下面是一个完整的屏蔽在一个盒子里的8位加法器。输入是A和B标识为从A0~A7及B0~B7。输出为和输出,标识为从S0~S7:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

这是标识多位数字的常用方法。下标为 0的位最低有效位。 而位A7、B7和S7是最高有效位。例如,下面展示的是这些字母是如何用来表示 二进制数0 11 0 - 1 0 0 1的:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

下标始于0,且向高位递增的原因是它们和2的乘方数(幂)是对应的:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

8位加法器的另一种画法是:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

双线箭头包含了8个输入端,代表一组8个分开的信号。它们标识为A7⋯A0、B7⋯B0、S7⋯S0 也用来表示一个8位二进制数。 一旦构造了一个8位加法器,就可以构造另一个加法器。把它们级联起来可以很容易地构成1 6位加法器,右边加法器的进位输出连到左边加法器的进位输入端。左边加法器的输入包含了两个加数的高8位,同时产生了结果的高8位:

《Code:The Hidden Language of Computer Hardware and Software》读书笔记:第12章 二进制加法器

现在,你可能会问:“计算机真的是以这种方式把数字加起来的吗?”

基本上是这样的,但不完全是。

首先,加法器应该做得更快。如果你明白这个电路是如何工作的,你会看到最低位相加 产生的进位作为下一列数相加的一个输入,而第 3列的加法又等着第2列加法的进位,依此类 推。加法器总体的速度等于加数的位数乘以单个全加器的速度。这种进位方式称为行波进位。 更快的加法器使用称为先行进位的加法电路,从而加快了加法进程。

第二(但是十分重要),计算机再也不用继电器了!尽管它们曾经用过。建于 2 0世纪3 0年 代初的第一批数字计算机使用继电器,后来又用了真空管。现代计算机用晶体管。当用在计 算机中时,晶体管和继电器的功能差不多,但是晶体管速度更快,体积更小,更安静,更省 电,而且还便宜不少。构造一个 8位加法器仍然需要1 4 4个晶体管(如果采用先行进位,则需 要更多),但整体电路的体积却小多了。