计算机是如何做加法的?(3)——改进全加器

摘要:改进全加器的设计,用一个或门代替最后的一个半加器,并初步介绍了二进制的思想。

目录
[隐藏]

在前面,我们谈到,希望能够简化对进位逻辑的处理。

虽然已经谈论不少的内容,但一直都还是停留在较为抽象的阶段。现在面临一个较为简单的问题,也应该是时候深入到电路底层去弄出点实际的东西来了。

从简(柿)单(子)的(先)问(拿)题(软)入(的)手(捏),这应该是要始终贯彻的原则。

进位的逻辑

概括一下,要满足的逻辑可形式化地表达如下 :

f(0, 0) –> 0

f(0, 1) –> 1

f(1, 0) –> 1

f(1, 1) :违反了我们的约定,不考虑。

用一张图来表示,那就是:

carry logic in number

因为只涉及 0 和 1,我们甚至可以用二值逻辑来实现。

比如开和关,其中开代表 1,关代表 0;

carry logic by on and off

又或者一个低电平和一个高电平,其中低电平代表 0,高电平代表  1。总之,有很多方式。

以上逻辑,如果我们用开和关来概括,那就是:

两个都关(0)时,结果为关(0);(即f(0, 0)=0)

有一个为开(1),结果为开(1)。(即f(0, 1)=1,f(1, 0)=1)

并联电路

以上逻辑是否让你想起了熟悉的并联电路呢?

pararell circuit

图片来自《编码:隐匿在计算机软硬件背后的语言》(Code: The Hidden Language of Computer Hardware and Software)一书。下面类似的截图或来自此书,或参考原书中的例图画成。

很明显,我们要表达的逻辑其实就是一个并联的逻辑。

严格地讲,是它的一个子集。我们有三条规则,上图中有四条规则,但最后一条用不上,违反了我们的假定。

继电器(Relay)

如果我们用继电器来作为一种控制手段:

relay off light off

希望你还记得继电器是什么,其实就是个电磁铁和一个弹性开关的综合体,上面的开关是个有弹性的小铁片,当通电时,线圈中产生电磁感应,形成一个磁场,好像一块磁铁一样,因此能把铁片吸引下来,从而控制电路的通断。

好吧,这些东西多少涉及了一些物理知识,希望你还能有点印象。

那么可以达到用输入来控制输出(图中形象地用灯泡的亮灭来表示)的目的:

relay on light on

当左边的开关合上时,电磁感应使得开关铁片被吸引下来从而连通了灯泡的电路。

或门(Or Gate)

当然了,只是这样的话,用处并不大。但当以并联的方式连接两个继电器时:

or gate by relay

注:图中简化了电池的画法,所有的 V(Voltage,电压)代表连接着电池的正极,接地符号则表示连接电池的负极。电池及之间的连线均已经省略。

那么,左边两个开关的状态(输入)将影响右边灯泡的状态(输出)

or gate by relay all case

这样的一个东西就是所谓的或门了,如果用一个竖线符号”|”来表示一个操作,把 0  和 1 想像成上面的关和开,那么

0 | 0 –> 0

0 | 1 –> 1

1 | 0 –> 1

1 | 1 –> 1

或门用以下符号来表示,它有两个输入一个输出:

or gate symbol

它实际是对这样一种功能的抽象:

or gate internal

当然,如果真心要真刀真枪地连出一个或门来控制灯泡的亮灭来玩下,大概是下面这个样子:

or gate real

图中的走线也很随意,通常,或门内部会统一引出一条电源和一条接地线,这样会整洁一些。

当我们按下其中一个开关时,就能控制灯泡了,情形如下:

or gate real example

或门是一个有源电路,这里的源指电源,当然我们通常会省去关于电源方面的部分,只关心功能方面的抽象。

另:现在通常是用晶体管来制造或门,而不是这些笨重的继电器,不过它们表达的逻辑是一致的。

一个晶体管从功能逻辑上讲相当于一个继电器,关于晶体管的具体原理后面再谈。

所谓功能逻辑大概也就是软件中的接口(interface),至于用继电器还是晶体管则是具体实现(implement)上的细节。

把其中的开和关用 1 和 0 来表示,那么一个或门的逻辑如下:

or gate logic by number

对比我们的需求:

or gate logic compare to demand

就不难发现,这正是我们想要表达的逻辑。

改进的全加器

至此,用或门来替换最后的一个半加器,据此可以简化得到全加器的模型如下:

improved full adder

它的内部由两个半加器再加一个或门组成。

当然,由于我们目前依旧还是从十进制角度考虑的,或门的输出还是要受到一定约束的,因为它的值要参与到下一级的输入。比如按前面的约定,电源方面应该选用 1V  的电压。

下图是执行前述一个计算的原理示意图:

improved full adder example

注意这里,输入的 1 是作为驱动继电器用的,而输出的 1 是从被控制的电源部分取得的,所以前面说电源的电压要选用 1V 的。

显然,只要电源电压是 1V,输出永远也只会是这个值,或者为 0。这也保证不会输出错误的值到下一级。

另外,即便有产生两次进位的错误,从上面的原理图也能看出,输出依旧是 1。

另一方面,一个或门其实并不计较输入的是 1V 还是 2V,或者是其它更大的值。只要这个电压足以驱动继电器,那么它就产生输出。

严格地讲,这也就是所谓的二值逻辑,一个或门仅能表示两种状态,开或关,它对数值其实是不敏感的。到后面全面转向二进制后,就无需对电压的具体值作出规定了。

现在,我们部分地实现了全加器的功能,也即是对最简单的进位逻辑的处理,并初步地引入了二进制的思想。目前,还有一个更为重要的部件,我们还是靠着 wishful thinking 来考虑它的,这就是半加器(HA),我们将在下一篇讨论它的设计与实现。

发表评论

电子邮件地址不会被公开。