概述
用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢?
你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂.
问题
先把问题抛出来, 我们的全加器大概就长这样.
输入端放进来两个数字, 然后输出端返回两个数字的和.
抛开全加器不说, 首要问题是: 用什么来标识输入和输出的数字呢?
输入输出
当然了, 输出输出端都是导线, 要通过电流来表示. 那就使用电的特征咯.
方案一
简单粗暴, 使用电压. 数字1表示为1V, 数字10就是10V.
但是, 这个时候如果来了一个数字是10万呢? 整个10万 V 的电压, 别闹, 那还怎么抱在手里愉快的玩耍, 难道你不想玩手游了?
方案二
既然电压太高不可取. 人体的安全电压是36V, 也就是只要电压不高于36V 就可以了. 我们可以用一根导线来表示十进制的一位, 这样就可以将电压控制在0-9V 之间了. 嗯, 安全.
但是, 电压是不稳定的. 但是可以规定 8.6-9.5V=9. 嗯, 这个方案确实可行, 至少咱没有看出什么问题来. (据说现在已经有十进制的了??) 但是别着急, 看下一个方案.
方案三
想一下, 除了电压, 电还有什么特征呢? 电流? 功率? 开闭? 就是开闭. 一个电路要么连通, 要么断开, 简单明了没有歧义.
用电路的开闭如何表示数呢? 表示不了十进制, 还表示不了二进制么..
好, 就是它了, 实现简单方便.
输入输出的问题解决了, 剩下的就是全加器的构造了, 二进制的运算就不说了. 现在, 全加器应该长这样:
为什么是三个输入数字呢? c是进位. 那为什么是两个输出呢? y 是进位.
电路的逻辑运算
在开始全加器之前, 先来复习一下高中的物理知识.
还记得这个东西么?
画的丑了一些, 凑合看. 他可以将电场转换为磁场. 好, 下面的实现都是基于它的. 电磁感应. 继电器就是基于它实现的.
逻辑电路
看下面电路:
这是一个简单的并联电路, 实现了逻辑或, 只要有一个电路接通, 整体就是通路. 当然了, 串联电路就是逻辑与了. 那逻辑非如何处理呢? 这就要用到上面提到的继电器了.
逻辑非
图中的 J 表示继电器.
右侧电路的开关正常情况处于连通状态, 当左侧通电后, 会将右侧开关吸附起来, 令其断开. 这就实现了逻辑非. 当然, 与
或
的实现也可以通过继电器来传递.
逻辑与
这就是一个通过继电器实现的与门.
当然了, 或门也是一样的, 只是将右侧的串联电路改成并联电路就成了.
逻辑异或
有了与或非, 把他们三拼一拼, 异或就有了.
A xor B = (!A && B) || (A && !B)
来来来, 看图了.
这就是一个异或了. 有没有发现什么? 可以将电路参与到逻辑运算中.
好啦, 足够了. 开始着手实现全加器.
全加器
到这, 想必各位看官也知道为什么在全加器之前要先说逻辑电路了吧. 没错, 就是要把01的加法运算, 转换成逻辑运算.
列一张真值表:
真值表在此, 请运用你们数值计算的知识, 把逻辑表达式推出来吧. 请原谅我, 下面表达式是我嫖来的, 直接把化简后的逻辑表达式拿来了.
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个运算数, 半加器只有两个.
有了全加器, 是不是还得有全减器? 偷偷告诉你, 减法运算就是补码的加法运算.