最近在休假中,太宅了,也没打算到处去玩。放空脑袋,读读写写,聊以自娱。

我们知道,计算机的功能,都是通过计算来完成的,而这个计算是怎样完成的呢?答案是:电路。

在前面的文章中,我们深入探讨了编码的本质以及计算机的工作原理,重点讲了二进制的表示和加法,并且留了一个“神秘电路”待实现。在本文中,我们主要来聊聊计算机加法的电路原理和proteus仿真,顺便会搞定之前文章提到的“神秘电路”:

上图中,用9v表示高电平,用0v表示低电平。为了方便,后续我们在画电路图时,都默认用5v表示高电平(对应二进制的数字1),用0v表示低电平(对应二进制的数字0)。

读初二时,在陈老师的物理课堂上,第一次听到了“大到太阳系、银河系,小到分子、原子、电子”。从那一刻起,我知道了电子是很小很小很小的东西。我们每天吃着分子、原子和电子,喝着分子、原子和电子,也拉着分子、原子和电子,而电子在现代计算机中非常重要,所以才叫电子计算机。在本文中,我们不讲分子、原子和电子,也不讲导体为什么能导电,绝缘体为什么难导电,也不细聊欧姆定律。附一图,是为念:

下面,我们用proteus来进行电路仿真。福特、安培、欧姆附体,灯泡亮了。电源电压为5v, 灯泡电阻为20欧,电流为0.25A, 这正是欧姆定律要揭示的内容。

读初三时,卢老师是我们的物理老师,他提到过二极管,并且说二极管具有单向导电性,后来读大学才知道二极管单向导电性的原因:P型N型半导体形成了PN结。

我们无需纠结于PN结原理,还是直接看二极管的单向导电性吧。很显然,单向导电性决定了下图中的灯泡L1亮,灯泡L2不亮:

二极管还有一个特性:二极管两端的电压差相对稳定。我们仿真中用到的二极管,两端的电压差基本在0.7v到0.8v左右,验证如下:

为了方便显示,在后续仿真中,我们用黄颜色的发光二极管,来表示高低电平(即二进制数字1和0),下图表示11101:

有了对二极管的基本认识,我们一起来看如下有趣的电路。根据二极管的单向导电性和两端相对恒定的电压差,不难分析出电路的特点。动图如下:

其中,D4和D5显示输入电压,D3显示输出电压。亮着表示高电平(5v, 可以表示二进制数字1),熄灭了表示低电平(0v, 可以表示二进制数字0)。可以看出,只有当D4和D5都亮时,D3才会亮,很显然,这是“与”逻辑,即:

D4

操作

D5

D3

0

0

0

0

1

0

1

0

0

1

1

1

这不就是二进制的乘法吗?简单。我们把上述这个电路叫作与门电路,简称与门。

与门逻辑其实就是:爸妈双方都同意你恋爱,你才能恋爱。

继续来看另外一个有趣的电路。根据二极管的单向导电性和两端相对恒定的电压差,也不难分析出电路的特点。动图如下:

可以看到,D4和D5只要有一个亮,D3就亮。很显然,这是“或”逻辑,即:

D4

操作

D5

D3

0

0

0

0

1

1

1

0

1

1

1

1

我们把上述这个电路叫作或门电路,简称或门。

注意,看仔细,上面的逻辑不是二进制加法,因为“1或1=1”,而二进制加法中是1+1=10(0左边的1表示进位)。

或门逻辑其实就是:爸妈只要有一方同意你恋爱,你就可以恋爱。

还有一个重要的电路,即非门电路,简称非门。意思是,当输入是高电平时,输出是低电平,而当输入是低电平时, 输出是高电平,简直就是跷跷板。即:

输入

操作

输出

0

1

1

0

我想了很久,也没有想出怎么用二极管来实现这个非门电路。如果有朋友想到了,请不吝赐教。既然暂时实现不了非门逻辑,那就只能请出三极管这个东西了:

我们不对三极管的原理进行详细介绍,但可以粗略近似理解一下:

a. 开关SW1相当于一个水闸开关,控制着三极管Q1,当SW1接高电平时(5v),水闸打开,三极管通畅无阻,此时D1左边就好像是接地一样(0v),显然,D1是不会亮的。

b.当开关SW1接低电平时(0v),三极管Q1堵塞住了,此时可以认为三极管断开了,直接从上图中摘掉三极管,于是乎,D1和灯泡L1形成了串联,自然D1就会亮。

可以看到,D1和D2的值是相反的,正所谓:东方不亮西方亮,西方不亮东方亮。这就是非门逻辑。

到此为止,我们学习了与门、或门、非门电路。但是,如果一直沉浸在这种底层的二极管和三极管中,感觉我们要造的加法器遥遥无期,何时是个头呢?

上面的与门、或门、非门,太繁琐了,二极管三极管都是什么玩意儿!我们需要屏蔽掉这些底层细节和复杂性,怎么办?解决办法是:抽象。在之前文章中,我们讲过,抽象是计算机中重要的思想。嗯,找来一只大象,然后抽它,用力狠狠抽。

直接来看抽象后的与门,即下图中的U1器件(U1下面那个灰色的AND, 就是与的意思),是不是简化了很多?这就是抽象的威力:

再来看抽象后的或门,即下图中的U1器件(U1下面那个灰色的OR, 就是或的意思):

再来看抽象后的非门,即下图中的U1器件(U1下面那个灰色的NOT, 就是非的意思):

天若有情天亦老,人间正道是沧桑。你若耐烦你亦烦,解决正道是抽象。通过抽象,我们脱离了分子、原子和电子这些微观层面的玩意儿,也忘记了福特、安培和欧姆,然后忘记了二极管和三极管,这就对了。我们的思维,要站在更高的维度上,要站在更高的抽象度上。

与门、或门和非门是三种最基本的电路逻辑器件,通过不断组合、集成和抽象,可以形成功能更强大的器件。可以近似地认为,集成电路和芯片,就是功能不断组合、集成而来的,抽象度非常高。

我们来看如下电路图,它由基本的与门、或门和非门组成(先不要管为什么这样设计电路):

可以看到,当D1和D2都亮或者都熄灭时, D3熄灭;  而当D1和D2有且仅有一个亮时,D3亮。这种逻辑叫异或, 这种电路叫异或门电路,简称异或门。来看看异或的具体逻辑:

D1

操作

D2

D3

0

异或

0

0

0

异或

1

1

1

异或

0

1

1

异或

1

0

这不就是二进制的加法吗?但是,貌似少了出进位,我们期待的二进制加法逻辑是:

加数

操作

被加数

出进位

加法结果

0

0

0

0

0

1

0

1

1

0

0

1

1

1

1

0

现在终于明白了,不考虑出进位时,二进制加法其实就是异或门逻辑。考虑出进位时,出进位的这一位其实就是与门逻辑。来看下电路,用D4表示出进位,D3表示结果位:

可以看到,上图的逻辑是:

D1

操作

D2

出进位D4

D3

0

0

0

0

0

1

0

1

1

0

0

1

1

1

1

0

很显然,这样就实现了二进制的加法。再来对比下我们要实现的“神秘电路”---“半加器”:

这个“神秘电路”---“半加器”,不就我们上个动图中的加法电路吗?终于,我们实现了“半加器”。

半加器已经不再神秘,在后面的叙述中,我们就不再专门加引号了。回头看看上面的半加器电路,感觉有一点点复杂,究其原因是:没有对异或门电路进行抽象,那就来抽象吧。抽象后的半加器如下图所示(U1下面那个灰色的XOR, 就是异或的意思):

电路简化了很多,抽象的威力,再次可见。

半加器已经搞定,可是,我们还是高兴不起来,因为半加器是半成品,从名字上就可以看出来。为什么呢?你看,上面的半加器只能处理两个二进制数字的相加,如果此时有一个从低位进位而来的二进制数字,那就是三个二进制的数字相加,想一下,是不是?以7+3为例:

这就尴尬了,半加器显然无法满足条件,我们继续优化电路(设计如下电路需要一些数字电路知识,但我们无需了解设计方法):

这就是二进制全加器,它能算出三个二进制位的和,如下:

加数D1

被加数D2

入进位D3

出进位D4

结果位D5

0

0

0

0

0

0

1

0

0

1

1

0

0

0

1

1

1

0

1

0

0

0

1

0

1

0

1

1

1

0

1

0

1

1

0

1

1

1

1

1

上图的二进制全加器还是有点复杂,我们对它进行抽象,如下图:

这就简单多了。可是,当我进行proteus仿真时, proteus提示没有74LS183这个全加器。好吧,这是proteus本身出现了一些问题,不纠结了。你不提供,我们自己也能造。

上面介绍的二进制全加器,是1位二进制全加器,只能在1个二进制位上进行操作,最大能计算1+1=2,如果我们把两个1位二进制全加器级联起来,就形成了一个2位二进制全加器,最大能计算3+3=6.

在介绍2位二进制全加器之前,我们先来简要了解一下数码管及其显示。在很多公共场合,我们都可以看见数码管的身影。最近出去玩了一下,顺手拍了一张照片,来看看:

数码管中有很多条形灯管,通过控制条形灯管的亮与熄,可以显示不同的数字。数码管的形式有很多,上图的数码管显示数字的范围是0-9.  而我们在本文中要介绍的数码管的显示范围是0-F, 也即十六进制的16个数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F,  十进制、二进制和十六进制的对应关系如下表所示:

十进制

二进制(B)

十六进制(H)

0

0

0

1

1

1

2

10

2

4-1

11

3

4

100

4

5

101

5

6

110

6

8-1

111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

16-1

1111

F

16

10000

10

17

10001

11

18

10010

12

19

10011

13

32-1

11111

1F

64-1

111111

3F

128-1

1111111

7F

256-1

11111111

FF

512-1

111111111

1FF

1024-1

1111111111

3FF

很容易看出, 四个二进制数位,可以“浓缩”为一个十六进制的数位。顺便地,可以看到,10个二进制数位,表示的数的范围是0-1023,共1024个数字,刚好是2的10次方,对于熟悉二进制的程序员来说,1024才是整数(而不是1000),所以,10月24日被称为程序员节。

来看下十六进制数码管的显示,0到9大家都认识,A-F长得有点丑,但足够表示数了:

十六进制的好处是:便于人类描述二进制。毕竟,二进制“膨胀”太快了,数位太多,不方便描述, 而一个十六进制数位,刚好可以对四个二进制数位进行“浓缩”。

我们常在二进制数字后面加一个B,  用于区分十进制。同理,在十六进制数字后面,我们约定俗成地加一个H, 以便和十进制进行区分。

我们继续来制作2位二进制全加器。把两个1位二进制全加器级联后得到如下动图中的电路:

上面动图实现2位二进制数的加法,最大可以计算3+3=6, 我们来具体看看上面动图完成的计算:

SW2

SW1

SW4

SW3

完成计算

1

0

1

0

2+2=4

1

1

1

0

3+2=5

1

1

1

1

3+3=6

我们的电路图越来越复杂了,得抽象一下了,直接使用封装好了的2位二进制全加器,如下面动图所示:

通过抽象,可以看到,电路图简单多了。抽象后的电路也完成了下表的计算:

SW2(A2)

SW1(A1)

SW4(B2)

SW3(B1)

完成计算

1

0

1

0

2+2=4

1

1

1

0

3+2=5

1

1

1

1

3+3=6

一个2位二进制全加器,最多计算3+3=6,要计算更大值的加法,该怎么办呢?继续级联:把两个2位二进制全加器级联在一起,就形成了一个4位二进制二进制全加器。最大可以计算15+15=30,我们看下9+8=11H=17,如下图所示:

上图这两个2位二进制全加器的级联,还是有点复杂,我们来抽象一下,直接使用封装好的4位二进制全加器,如下图所示:

很显然,也完成了9+8=11H=17的计算。

同理,我们可以用两个4位二进制全加器级联,形成一个8位二进制全加器。也可以用两个8位二进制全加器的级联,形成一个16位二进制全加器,道理都类似,故不再赘述。

到此为主,我们一步一步地用电路实现了加法。貌似大功告成了,但是,还有个疑问:计算机怎么计算1+2+3+4+5呢?这是个连续加法的问题。

我们来尝试用电路图实现,看下图:

计算结果: 1+2+3+4+5=FH=15

这种设计,能正确计算出结果,但是,非常搞笑,也很业余。去市场买这么多器材,然后找老板报销,老板估计要火冒三丈,要揍人的。这里的问题就在于:全加器太多,资源浪费。其实,一个4位二进制全加器貌似就足够了, 要懂得循环利用资源,避免浪费。来看看怎么设计:

可是,上图这个电路仍然是没法正常工作的,因为它产生了死循环,在proteus中,强制让上述电路执行,结果proteus报错。

思考一下,问题出在哪里?嗯,缺少了控制开关,于是,我们来进一步尝试,加入控制开关,如下图所示:

然而,令人失望的是,还是会产生死循环,看一下上述动图就知道了:全加器的输出结果立即导入到了输入端。值得说明的是:我在做gif动图时,采用每秒1桢的帧率,所以上图看起来变化得不快。但在实际仿真时,上图的数码管在飞快地变动和闪烁,因为还是出现了死循环。

连续加法器的尝试,还是失败了。所谓巧妇难为无米之炊,连续加法器失败的原因就在于:它需要特殊的器件,而我们现在还没有接触到这种特殊器件,没办法做连续加法器。

别着急,我们将在后续文章中,来实现这个连续加法器,而且是全自动的连续加法器,不需要人为去掰弄任何开关。那时,我们会顺便体会到“编程”的感觉:

我们最后来总结一下本文内容:

首先,通过二极管和三极管,我们实现了与门、或门和非门这三个最基本的电路逻辑器件。

然后,我们不断构造出更复杂的电路逻辑器件,如半加器和全加器,顺便搞定了之前文章提到的“神秘电路”, 其实一点也不神秘,很简单的东西。

最后,我们利用全加器的级联,构造了4位二进制全加器,能完成加法运算,达到了本文的目的。

好的,今天先聊到这里。期待全自动的连续加法器,那时,我们会体会到“编程”的感觉。

不见不散。

计算机加法的电路原理及proteus仿真相关推荐

  1. HC595简单原理及proteus仿真(一)草履虫能听懂版

    简单原理 目录 简单原理 简介: 特性 : 引脚功能: proteus仿真 接线: 注意: SH_CP,ST_CP,DS如何工作 实验一: 实验一: 实验三: END: hc595是具有三态输出寄存器 ...

  2. 二相四线制步进电机驱动原理与Proteus仿真

    一.L298N 单片机无法直接驱动步进电机,需要L298N进行驱动.L298N的最大功耗为20W,驱动部分端子供电范围+5~+30V,控制信号输入电压范围5V/0V,驱动部分峰值电流2A. 二.两相四 ...

  3. LCD1602原理与Proteus仿真

    1 LCD1602简介 LCD分为段式.点阵式两种,其中点阵式又分为字符模式与图形模式两种.段式LCD最常见的应用场景就是计算器,其显示效果类似于LED数码管.点阵式的图形模式LCD最常见的应用场景就 ...

  4. 电路原理计算机解法,电路原理学习指导与习题全解

    图书简介 本书是孙玉坤.陈晓平主编的<电路原理>配套的教学指导书,各章的排列次序.标题都与教材相同.每章均由四个部分组成:第一部分为基本知识点,概括性地说明本章的主要概念.基本理论和分析方 ...

  5. 【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

    [Proteus仿真]51单片机+DAC0832+LM358放大电路波形发生器 Proteus仿真 主程序代码 #include<reg52.h> //包含头文件 #include< ...

  6. 西电A测 | 基于Arduino uno的电子密码锁仿真系统 | 使用Proteus仿真 | Arduino IDE编写

    西电A测 | 基于Arduino uno的电子密码锁仿真系统 | 使用Proteus仿真 | Arduino IDE编写 | ATMEGA328P 电子密码锁系统 Arduino UNO Arduin ...

  7. 【Proteus仿真8086】将IO接口电路封装成子电路CCT001

    本次实验内容来自于顾晖老师<微机原理与接口技术 基于8086和Proteus仿真 第3版>的[例7-2],但老师使用的方法是将IO接口电路封装成子电路CCT001,这部分在章节没有讲述,于 ...

  8. 步进电机原理 Proteus仿真及硬件实现(详细)

    1 步进电机原理 1.1 步进电机简介 步进电机是将输入的电脉冲信号转换为角位移或线位移的元件.在不超负载运作的情况下,电机的转速以及停止的位置只取决于脉冲的个数和脉冲的频率.脉冲数越多,电机的角位移 ...

  9. Proteus仿真汽车氛围灯驱动电路及呼吸效果

    目录 一.引言 二.电路原理介绍 1.氛围灯熄灭原理 2.氛围灯点亮原理 3.可变占空比PWM信号调节氛围灯亮暗 三.AT89C51双定时器产生占空比可变的PWM信号 四.Proteus仿真动态视频记 ...

最新文章

  1. 极客新闻——10、Java工程师应该如何成长?
  2. 【面试】吃透了这些Redis知识点,面试官一定觉得你很NB
  3. dns被自动修改_部分 DNS 查询延迟的原因与解决方案
  4. 如何解决微服务的数据一致性分发问题
  5. # 遍历删除字典元素_第六章 字典
  6. css如何调整红心样式_CSS3跳动的红心
  7. 《设计模式之禅》学习笔记(九)
  8. git使用git push 命令跳出remote: Permission to Aname denied to usernameB 的问题
  9. 万创帮逆向解析,让你也能体验技术变现【Python爬虫实战系列之万创帮闲置资源整合逆向】
  10. rsync结合inotify工具实现实时同步传输文件
  11. 谷歌浏览器如何正确离线网页
  12. Matlab深度学习实践之手写体识别(含详细注释)
  13. [英文邮件写作技巧] 表达感谢,提出问题,描述附件
  14. tcsc工作原理matlab仿真,基于Matlab的TCSC建模与仿真研究.doc
  15. JavaScript实现淘宝商品展示(鼠标放在小图片上,上面会出现相应的大图片)
  16. 计算机视觉实战的深度学习实战二:图像预处理
  17. VS下同一个solution下不同project之间头文件的相互调用
  18. 3D动画效果照片墙demo
  19. instandceof
  20. 【Hexo】nexT主题使用攻略基础——添加分类、标签及关于

热门文章

  1. WIN7截图工具灵活使用
  2. [CTF]利用CRC32绕过RAR密码(适合于小文本文件)
  3. 【java基础】IO流是啥?有啥用?(上)
  4. Primitives vs Objects
  5. 物联网 嵌入式 单片机毕业设计题目100例
  6. android 9.0 默认打开开发者选项显示
  7. 常规创业公司股权分配参考
  8. 如何把云服务器恢复到最原始的状态
  9. Jquery给HTML元素绑定按键事件-回车事件
  10. 计算机进制算法在线,二进制转十进制和十六进制在线计算器