你看!这电路我玩得溜吗?

电子工程专辑 2022-01-22 10:30

电路是我的本行,电路基础、模拟电路、数字电路、高频电路,我还是比较熟悉的。而计算机编程嘛,是为了混口饭吃,半路出家自学。接下来,我会用电路来做计算器、计算机,并介绍编程。

计算机的功能,都是通过计算来完成的,而计算是怎样完成的呢?答案是:电路。我们探讨了编码的本质和计算机的工作原理,讲了二进制的加法,今天我们动手做一个计算器,实现加法功能。

读初二时,在陈老师的物理课堂上,第一次听到了“大到太阳系、银河系,小到分子、原子、电子”,当时印象非常深刻。从那一刻起,我知道了电子是很小很小很小的东西,肉眼是不可能看到的。

我们每天吃着分子、原子和电子,喝着分子、原子和电子,拉着分子、原子和电子。电子在现代计算机中很重要,所以才叫电子计算机。今天不讲分子、原子和电子,而是用电路来做计算器


一. 欧姆定律简介

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

图片


二. 二极管的验证

读初三时,在物理课上,听说过二极管,知道了二极管具有单向导电性。很显然,单向导电性决定了下图中的灯泡L1亮,而灯泡L2不亮,挺有意思的吧:

图片

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

图片
为了方便显示,在后续仿真中,我们用发光二极管来表示电路中的高低电平(即二进制数字1和0),灯亮时,表示1;灯熄灭时,表示0,下图表示11101:

图片



三. 与门电路简介

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

图片

其中,D4和D5显示输入电压,D3显示输出电压。可以看出,只有当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

我们把上述这个电路叫作或门电路。其逻辑是:爸妈只要有一方同意你恋爱,你就可以恋爱


五. 非门电路简介

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

输入

操作

输出

0

1

1

0

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

图片

我们不对三极管的原理进行详细介绍,但可以粗略近似理解一下:
  • 开关SW1相当于一个水闸开关,控制着三极管Q1,当SW1接高电平时,水闸打开,三极管通畅无阻,此时D1左边就好像是接地一样,显然,D1是不会亮的。

  • 当开关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这个全加器。好吧,不纠结了。你不提供,我自己也能造。

图片


十. 2位全加器电路

上面的二进制全加器,是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才是整数,所以,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

      

十一. 4位全加器电路

一个2位二进制全加器,最多计算3+3=6,要计算更大值的加法,该怎么办呢?还是老办法,继续级联。
把两个2位二进制全加器级联,就形成了4位二进制全加器。最大计算15+15=30,来看下9+8=11H=17:

图片

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

图片

很显然,完成了9+8=11H=17的计算同理,也可以用两个4位二进制全加器级联,形成8位二进制全加器。


十二. 连续加法器探索

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

图片

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

图片

可是,上图电路仍然没法正常工作,因为它产生了死循环思考一下,问题出在哪里?嗯,缺少了控制开关,于是,我们来进一步尝试,加入控制开关,如下图所示:

图片

然而,令人失望的是,还是会产生死循环,看一下上述动图就知道了:全加器的输出结果立即导入到了输入端。实际仿真时,上图数码管在飞快变动,因为出现了死循环。

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

别着急呀。在未来,我们会实现这个连续加法器,而且是全自动的连续加法器,不需要人去掰弄开关。那时,我们顺便体会对电路进行编程的感觉。今天,暂时先聊这么多。

作者/来源:涛哥依旧


图片