在计算机硬件层面上, 你知道 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 个晶体管(如果采用前置进位, 则需要更多的晶体管), 但是体积小很多
来源: https://cloud.tencent.com/developer/article/1031786