在计算机硬件层面上,你知道1+1是如何实现的吗?本文先介绍了继电器的基本原理,然后从分析与或非等逻辑门电路入手,推导出异或门的实现,借助异或门从而实现1+1,并得出全加器的基本原理。

前言

计算机中处理的都是二进制,1+1=2转成二进制表示为 1 + 1 = 10, 10表示相加结果为0, 并且有进位。如图所示,该运算可以拆分成求和和求进位。

求和的特点是0 + 0 = 0, 1 + 1 = 0, 0 + 1 = 1, 1 + 0 = 1. 可以看到,相同的数相加为0, 相反为1, 其实就是作异或。

求进位的特点是 0 + 0 = 0, 1 + 1 = 1, 0 + 1 = 0, 1 + 0 = 0,就是有0的话,结果就为0, 其实就是作与。

所以,该加法运算就可以拆分成一个异或运算和一个与运算。那么异或和与运算又是如何实现的呢?下面我们先从最简单的讲起。

0.接地

下图大家都很熟悉,一个电池接上一个灯泡,合上开关后,灯泡就亮了。它的基本原理是电子从电池的负极进过灯泡后到达正极,和正极的质子结合达到稳定状态。灯泡中有个金属片和钨丝,电子进过灯泡的金属片后,由于有电阻所以会发热,如果达到了钨丝的燃点后,钨丝在真空就会发亮。

上图有个问题就是如果电池和灯泡相距很远的话(比如广州到北京), 铺线的成本很高,来回都要一根线,有没有什么更节约成本的方法呢?肯定有, 我们知道地球本身就是一个巨大的导体,里面有无穷无尽的电子,灯泡可以直接接地,从地球上吸收电子,而电池将负极的电子接入到地球。这样的话,可以节约一半的铺线成本,如下图所示。

此处灯泡和电池接地是个示意图,只是为了说明这么个原理。真正这样做的话,灯泡肯定不亮,因为电池的电压相对地球来说太小了,地球的电阻相对电池来说太大了。

工程实践上,将上图简化为下图的方式来表示,将接地的电池用V来表示。

1.继电器

如果要长距离的传输,由于长导线的电阻越大,电流越小,功率就越小,为了使得灯泡一样亮,就需要增加电压。但是导线的长度可以近似无限增大,但是电压没法无限增大,所以需要一套中继系统,通过这套系统将比较弱的输入电流“放大”成较强的输出电流。这套中继系统就叫继电器。它的结构如下。

电流通过缠绕在铁棒的导线,会产生磁场。继而将上面的那个开关拉下来,从而接通该电路。以前的电报就是类似的原理,如下图所示,发送方按下开关,铁棒那里产生磁场,将另外一个开关合上,从而收端将电磁铁上面的活动杆拉下; 发送端松下开关,活动杆就弹回去了,从而能够听到“滴-答”的声音。“滴-答”声的长短代表了不同的含义,从而用来传递各种信息。

2. 与门

什么是门?继电器的组合就叫门,多个继电器可以并联或串联在电路中以执行各种基本功能。 将各种门组合起来可以实现复杂的功能。

将两个继电器串联起来叫与门。如下图所示,红色表示通电。只有当两个继电器都通电后,灯泡才亮,其它三种情况灯泡都不亮。当然,继电器的可以再接继电器、各种门,不一定是灯泡。

电气工程师用下图来表示一个与门。可以把按下开关当作1,断开开关为0。只有当两个输入都为1时,输出才为1,其它情况均为0。 同编程语言中的与(&)操作。 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

输入和输出的关系可以用下表来表示。

3.或门

当两个继电器并联在一起时称为或门。这种情况下,只要有一个继电器通电,灯泡就亮。只有当两个继电器同时断开时,灯泡才不亮。

可以用以下符号来表示或门。同编程语言中的或(|)操作符。 0 | 0 = 0, 0 | 1= 1, 1 | 0 = 1, 1 | 1 = 1。

或门的输入和输出的关系可以用下表表示。

4. 反向器

反向器就是将高电平转为低电平。断开开关时,灯泡亮。闭上开关时,灯泡反而不亮。反向器通常不会叫做一个门,主要是门通常是由两个或多个继电器组合而成的, 而反向器只需要一个继电器。

反向器用以下符号来表示。类似于编程语言中的取反操作符。 ~0 = 1, ~1 = 0.

5.与非门

与非门就是两个反向器并联在一起。只有当两个反向器都合上开关时,灯泡才不亮。刚好和与门相反。

用以下符号来表示一个与非门。在与门的基础上加上一个小圆圈,表示在与门结果上取反。

与非门的输入和输出之间的关系入下表, 只有当两个输入端为高电平(合上开关)时,输出才为低电平。

6. 或非门

两个反向器串联在一起称为或非门。只有当两个反向器的开关都打开时,灯泡才亮,刚好和或门完全相反。和与非门的区别是第2,3种情况,打开任意一个反向器,或非门不亮,而与非门亮。

用以下符号来表示或非门, 在或门的基础上加上个小圆圈,表示在或门的结果上取反。

或非门的输入和输出的关系如下。只有当两个输入端都是低电平(断开开关)时候,输出才为高电平。

7.异或门

异或门是如何实现的呢?异或门可以通过一个或门和一个与非门来实现。如下图所示,或的结果和与非的结果再作与后,得到的就是异或的结果。两个输入端,相同为0,相反为1.

或门和与非门通过一个与门连接起来就是异或门。各个继电器的连接关系入下图。与门、或门、与非门、或非门各需要两个继电器,一个异或门需要6个继电器。

异或门用下图来表示,在或门的基础上增加一根曲线。

异或门的输入和输出的关系入下表,用XOR表示异或, 输入相同为0, 相反为1。 同编程语言中的异或(^)操作符。0 ^ 0 = 0, 1 ^ 1 = 0, 1^0 = 1, 0 ^ 1= 1.

8. 1+1= 2?

分析完与门和异或门后,现在再回过头来看下开头说到的如何实现1 + 1 =2 的功能。一位的加法就相当于一个异或门求和, 一个与门求进位。如下图所示。

该电路图用以下这种较简单的方式来表示,该符号表示为半加器,原因是因为它没有将之前的进位加上。

通过半加器可以处理1 + 1 = 2 的运算,但是如果操作数位数大于1位,则还需要能够处理进位的功能。

为了能够处理之前的进位,在半加器的基础上改进下,通过两个半加器和一个或门组合起来就可以组成一个全加器(FA)。一个半加器需要8个继电器, 一个全加器需要18个继电器来实现。如下图所示。

全加器用以下符号表示, Carry In (CI)表示低位的进位,Carry Out (CO)表示当前位的进位。如果是最低位相加,则CI位设置为0,表示没有进位。

如果要实现两个8位数的相加,则需要8个全加器(总共需要144个继电器),通过下图所示的方式连接起来。低位的CO接到高位的CI上,A,B分别表示两个操作数。

下图是对上图的简化描述,表示一个8位的加法器, 其中A7...A0表示操作数A的二进制表示中的第0位到第7位,B表示另外一个操作数, S表示A和B相加后的结果。

如果要实现一个16位的加法器,只需要将两个8位的加法器串联起来即可。第一个8位加法器的CO接入到第二个8位加法器的CI位。如下图所示。

结语

现在的计算机真的是像现在这样实现加法的吗?原理类似,但是有两方面的改进。

一个是运算效率方面的提升,从上面看到的8位全加器,都是需要等待低位运算完后,高位再将低位的进位拿来参与运算,这样运算的速度就取决于操作数的位数,如果位数较多的话,速度会比较慢,这种实现方法叫作行波进位。目前计算中普遍采用的是前置进位,该方法可以提高运算速度。

另外一个是制作工艺的改进,继电器用在上世纪四五十年代的数字计算机中,现在的计算机都是用晶体管。晶体管相对继电器的优势是体积小、速度快、能耗低、噪声小、而且还更便宜。如果搭建一个8位全加器,也需要用到144个晶体管(如果采用前置进位,则需要更多的晶体管),但是体积小很多。

文章来源于腾讯云开发者社区,点击查看原文