计算机全加器简单实现

概述

用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢?

你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂.

问题

先把问题抛出来, 我们的全加器大概就长这样.

image-20200519201933365

输入端放进来两个数字, 然后输出端返回两个数字的和.

抛开全加器不说, 首要问题是: 用什么来标识输入和输出的数字呢?

输入输出

当然了, 输出输出端都是导线, 要通过电流来表示. 那就使用电的特征咯.

方案一

简单粗暴, 使用电压. 数字1表示为1V, 数字10就是10V.

但是, 这个时候如果来了一个数字是10万呢? 整个10万 V 的电压, 别闹, 那还怎么抱在手里愉快的玩耍, 难道你不想玩手游了?

方案二

既然电压太高不可取. 人体的安全电压是36V, 也就是只要电压不高于36V 就可以了. 我们可以用一根导线来表示十进制的一位, 这样就可以将电压控制在0-9V 之间了. 嗯, 安全.

但是, 电压是不稳定的. 但是可以规定 8.6-9.5V=9. 嗯, 这个方案确实可行, 至少咱没有看出什么问题来. (据说现在已经有十进制的了??) 但是别着急, 看下一个方案.

方案三

想一下, 除了电压, 电还有什么特征呢? 电流? 功率? 开闭? 就是开闭. 一个电路要么连通, 要么断开, 简单明了没有歧义.

用电路的开闭如何表示数呢? 表示不了十进制, 还表示不了二进制么..

好, 就是它了, 实现简单方便.

输入输出的问题解决了, 剩下的就是全加器的构造了, 二进制的运算就不说了. 现在, 全加器应该长这样:

image-20200519204133623

为什么是三个输入数字呢? c是进位. 那为什么是两个输出呢? y 是进位.

电路的逻辑运算

在开始全加器之前, 先来复习一下高中的物理知识.

还记得这个东西么?

image-20200519204953181

画的丑了一些, 凑合看. 他可以将电场转换为磁场. 好, 下面的实现都是基于它的. 电磁感应. 继电器就是基于它实现的.

逻辑电路

看下面电路:

image-20200519210128849

这是一个简单的并联电路, 实现了逻辑或, 只要有一个电路接通, 整体就是通路. 当然了, 串联电路就是逻辑与了. 那逻辑非如何处理呢? 这就要用到上面提到的继电器了.

逻辑非

image-20200519210646531

图中的 J 表示继电器.

右侧电路的开关正常情况处于连通状态, 当左侧通电后, 会将右侧开关吸附起来, 令其断开. 这就实现了逻辑非. 当然, 的实现也可以通过继电器来传递.

逻辑与

image-20200519211705586

这就是一个通过继电器实现的与门.

当然了, 或门也是一样的, 只是将右侧的串联电路改成并联电路就成了.

逻辑异或

有了与或非, 把他们三拼一拼, 异或就有了.

A xor B = (!A && B) || (A && !B)

来来来, 看图了.

image-20200519212842567

这就是一个异或了. 有没有发现什么? 可以将电路参与到逻辑运算中.

好啦, 足够了. 开始着手实现全加器.

全加器

到这, 想必各位看官也知道为什么在全加器之前要先说逻辑电路了吧. 没错, 就是要把01的加法运算, 转换成逻辑运算.

列一张真值表:

image-20200519213341345

真值表在此, 请运用你们数值计算的知识, 把逻辑表达式推出来吧. 请原谅我, 下面表达式是我嫖来的, 直接把化简后的逻辑表达式拿来了.

x = a xor b xor c

y = c && (a xor b) || (a && b)

算一算一个全加器一共用到了多少继电器? 其中: 与(2个), 或(2个), 亦或(8个).

x 需要2个亦或, 共16个继电器. y 需要2个与,1个亦或,1个或, 共14个继电器. 整个全加器共需30个继电器. 又因为 x 和 y 的计算在同一个全加器中, a xor b的操作, xy 可以公用同一个, 所以减少一个亦或, 共22个继电器. 据说还能少, 嗯, 咱也不知道.

以上, 一个超级简陋的全加器横空出世. 将上面的逻辑表达式放到电路里, 就能返回输入结果相加后的结果.


既然有全加器, 那是不是也有半加器? 嗯, 有. 半加器就是将两个位相加, 产生进位, 不考虑上一个来的进位. 简单说, 全加器有3个运算数, 半加器只有两个.


有了全加器, 是不是还得有全减器? 偷偷告诉你, 减法运算就是补码的加法运算.