计算机加法的电路原理及proteus仿真

     原文发表于我的微信公众号"涛歌依旧",可以点击如下红色文字链接阅读:

  计算机加法的电路原理及proteus仿真(链接)

 

 

      从微信公众号把原文直接复制过来,发现图片、表格经常丢失,只有纯文字,所以建议直接点击上述链接阅读。

      复制过来的纯文字内容如下(图片、表格丢失):
 

 

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

      
      我们知道,计算机的功能,都是通过计算来完成的,而这个计算是怎样完成的呢?答案是:电路。
      在前面的文章中,我们深入探讨了编码的本质以及计算机的工作原理,重点讲了二进制的表示和加法,并且留了一个“神秘电路”待实现。在本文中,我们主要来聊聊计算机加法的电路原理和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位二进制全加器,能完成加法运算,达到了本文的目的。

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

      不见不散

 

 

你可能感兴趣的:(s4:,计算机组成,s6:,物理/通信)