文档章节

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

国栋
 国栋
发布于 2015/05/12 09:59
字数 1685
阅读 330
收藏 1

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

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

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

进位的逻辑

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

f(0, 0) –> 0

f(0, 1) –> 1

f(1, 0) –> 1

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

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

image

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

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

image

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

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

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

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

并联电路

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

image_thumb132 

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

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

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

继电器(Relay)

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

image

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

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

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

image 

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

或门(Or Gate)

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

image

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

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

image

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

0 | 0 –> 0

0 | 1 –> 1

1 | 0 –> 1

1 | 1 –> 1

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

image

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

image

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

image

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

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

image

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

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

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

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

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

image

对比我们的需求

image

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

改进的全加器

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

image

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

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

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

image

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

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

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

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

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

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

© 著作权归作者所有

国栋

国栋

粉丝 389
博文 79
码字总数 154046
作品 0
东莞
程序员
私信 提问
聊聊从逻辑门到操作系统的计算机

前言 现代计算机已经发展的非常复杂,要理解计算机的运行原理都已经变得异常艰难,虽说我们无法亲自去制造他,但我们可以了解下计算机系统是怎么从0发展而来的。 逻辑门 逻辑门是计算机的基础...

超人汪小建
2018/07/02
0
0
四位计算机的原理及其实现

你是否想过,计算机为什么会加减乘除?或者更直接一点,计算机的原理到底是什么? Waitingforfriday有一篇详细的教程,讲解了如何自己动手,制作一台四位计算机。从中可以看到,二进制、数理...

阮一峰
2011/03/12
0
0
代码之谜 - 运算符

从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。 因此,“1加2加3” 在计算机中被表述为: 或者 虽然我们通...

justjavac
2012/11/01
140
0
自己手动编写一个简单的解释器 Part 2

自己手动编写一个简单的解释器 Part 1 《有效思考的5个要素》的作者 Burger 和 Starbird 在他们精彩的书中分享了一个关于他们如何观看国际知名小号演奏家 Tony Plog 为多才多艺的小号演奏者举...

Aaron74
2015/07/13
3.7K
7
位运算实现加、减、乘、除运算

我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最...

JxYoung
2016/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
31分钟前
2
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
59分钟前
84
3
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部