我们知道,加法是算数运算中最基本的运算。
加法运算也是计算机要做的唯一工作。如果我们可以造出加法器,就可以利用加法来实现减法、乘法和除法。
事实上,构造加法器并不是让你去电子市场,购买零件,像小时候玩乐高式的,在房间中实际搭建出什么。相反的,可以在纸上画出一个加法器的逻辑结构。这样足以让我们理解计算机最底层的工作。
加法器是计算机中最基础的部件。但是它必然也会由其它零件组成。要了解这些,我们得从100多年前追溯起。
一、继电器的出现
百年前的萨缪尔·莫尔斯,他一生中为人们所熟知的有两个发明:一个是莫尔斯电码;另外一个就是电报机。电报机要实现的操作很简单:在线路的一端采取一些措施,使线路的另一端发生一些变化。电报机的发明标志着现代通信的开始。
在电报机线路中,随着电路导线越长,电流会越来越弱。要进行长距离通信,还必须要解决长导线带来的电阻问题,因此出现了继电器。如下图所示:电流从输入端进入,铁棒变成了磁铁,将活动杠杆拉下来。此时继电器中的开关闭合,因为V端提供了电压,输入端较弱的电流被放大成了较强的输出电流。
继电器的初期,只是在电报机线路中起一种放大电路信号的作用。可是我们需要将它应用在计算机中,用它来完成更重要的工作。
虽然在现代计算机中,继电器已经被晶体管代替,但是它们的工作方式都是相同的。
继电器就像一个开关,掌管着电路的连通与否。但它又不只是一个开关,因为它的闭合和断开不需要我们人为去控制,而是通过电流去控制。
还有很重要的一点就是,继电器暴露在外面的接口比开关要多一个,除了输入输出端,还有最上面的V端输入。就是因为这个V端,使两个继电器间有了多种不同的连接方式,继而组合成不同形式的继电器组。
二、逻辑门
两个及以上的继电器的不同连接方式就可以组合成各种的逻辑门。顾名思义,就和生活中的一扇门一样,逻辑门起到了阻止或者允许电流通过的作用。下面我们看一下常见的四种逻辑门。
1、与门
与门的连接方式如下。
可以看出,上面的继电器的输出端为下面继电器提供了V端电压。这个电路中只有两个输入端的开关都闭合,③处的电流才能流通至灯泡,以点亮灯泡。闭合任何一处的开关,或者都不闭合,都不足以使线路连通。
两个继电器连接成的与门,可以简化成如下的符号。
这个符号不仅说明了电路中有两个继电器,还表示上面的继电器与电源相连,而且两个继电器都接地。
2、或门
或门的连接方式如下。
这个电路中,任何一个输入开关的闭合都会为灯泡提供电压,使其点亮。
两个继电器连接成的或门,可以简化成如下的符号。
3、与非门
与非门只有在两个开关都闭合的情况下,灯泡熄灭。其它的任何情况,灯泡都被点亮。
两个继电器连接成的与非门,可以简化成如下的符号。
4、或非门
或非门只有在两个开关都断开的情况下灯泡才被点亮。其它任何情况,灯泡都处于熄灭状态。
两个继电器连接成的或非门,可以简化成如下的符号。
至此,我们已经看到了四种不同的方式来连接有两个输入、一个输出的继电器。这四种不同的连接方式组成了四种基本的逻辑门,分别是与门、或门、与非门和或非门。
我们约定,把开关的闭合表示成1,打开表示成0,灯泡的点亮表示成1,熄灭表示成0。则四种逻辑门的输入输出关系可以总结为如下表格。
现在我们更加坚信了一点,继电器不仅仅是起到开关的作用。因为我们无论如何也无法用两个开关来完成如此丰富的电路选择操作。
如果将继电器的输出端换一种方式连接,我们还能得到另外一种计算机中常用的器件:反向器。
反向器的输入信号与输出信号是相反的。我们也可以使用如下的符号来代替反向器。
至此我们已经完成了构造加法器的所有准备工作,接下来要考虑的就是如何使用我们所知的4种基本逻辑门和反向器来构造出一台加法器。
三、加法器
想象一下小学数学课堂上,我们是怎么让425和286这两个十进制数相加的。
从最左边一列开始我们总共要进行三次加法运算,最左边一列的加法运算只有两个加数,而中间一列有三个加数,因为第一列的两个数相加后会有一个进位。
在这里我们暂时不考虑十进制的加法。因为从上面的逻辑门看来,只有二进制的运算和和我们所学的电路是最契合的。
做二进制加法的步骤与十进制是相同的,都是从左向右,每两个数做加法运算。
我们学习十进制的加法时,有十进制的加法表。二进制当然也有它自己的加法表,并且远简单于十进制的加法表。如下图所示。
可见,两个一位的二进制相加结果只有两位。我们把左边的一位叫做加法位;右边的一位叫做进位位。我们把这两个数位单独拿出来,制表成下面的样子。
首先我们看一下进位表。不难发现它和与门的输入输出关系表是一样的。
这是一个令人惊喜的发现,我们可以使用一种我们学过的电路来实现进位位的运算了。可是在四种基本的逻辑门中,找不到一种门的关系表来实现加法位的运算。
这里介绍最后一种常用的逻辑门:异或门。它不属于基本逻辑门,因为它是由我们学过的基本逻辑门组合连接而成。示意图如下。
异或门的符号如下。
异或门的关系表如下。
可以看到,异或门的关系表与加法位的运算表完全相同。
现在我们可以通过异或门和与门的组合,来完成两个一位二进制数的相加。让两个一位二进制数(A和B)分别作为异或门和与门的输入信号。连接电路如下图。
由一个异或门和一个与门按照这种连接方式组成的电路,称为半加法器(以下简称半加器)。半加器还可以简化成如下的符号。
为什么要叫做半加器呢?其实半加器也是加法器的一种,但是因为其功能的不足,半加器只能将两个二进制数相加,也就是说半加器只能用于二进制加法最右边一列的相加,因为半加器只有两个输入端。对于其它列,由于进位位的存在,需要将三个数相加,此时就不能继续使用半加器了。
那么有没有一种电路组合,既能完成两个数相加,同时又能完成三个数相加呢?答案是有的。我们将两个半加器和一个或门做如下连接。
为了简便,我们用如下的符号来代替上图,并给它起名为全加法器(以下简称全加器)。
全加器有三个输入端,和两个输出端。当进位输入为0时,就相当于一个半加器。当进位输入为1时,则实现三个二进制位的相加。下表列出了全加器输入组合和输出结果的所有情况。
这里将8个全加器做如下连接。
把按照如上连接的电路称为8位二进制加法器。
现在我们对如何使用这个加法器做一些说明。在这个8位二进制加法器中,A端和B端输入分别表示两个加数中的各个数位。S端表示加和输出。由于做二进制数加法时,右边第一列两个数相加没有进位,所以这里的进位输入端应该一直置为0。如果两个二进制数相加的和超出了8位二进制数的表示范围,则第九位置为1,即是进位输出端为1。
为了简便,我们将8位二进制加法器简化成下图。
至此,我们已经构造出了一台8位二进制加法器。如果你还不满足于8位二进制数相加,完全可以将两个8位二进制加法器级联成一个16位二进制加法器,如下图。
本文开始已经说过,二进制加法运算是计算机中最基本的运算。可是仅了解加法运算是不够的。因为在日常生活中遇到的问题,要远复杂于加法运算。要想让加法器完成更多的工作,必然要使用更多的器件。
现代计算机所做的事情也绝不仅是使用一个加法器能完成的。
本文内容参考自《编码》