前言
近期看了一些关于数字电路和计算机组成原理的书籍,挺有趣的话题,整理成文章分享一下。
先推荐几本书籍:《编码:隐匿在计算机软硬件背后的语言》《深入理解计算机系统》,文章基本是从这几本书提炼的东西加上自己理解整理而成。
传递信息的电路
高中我们经常学过一个很简单的电路构成:一个电源、几条电线、一个开关、一个灯泡。
闭合开关之后灯泡就亮了。如图,可以理解成:我们把一个电压信号从电源这边通过电线传递到了灯泡这一端。当然这个电路也可以理解成:开关的”开“/”关“这一个状态通过这个闭合打开的动作传递给了灯泡。
<图1:电路>
电路的逻辑
串联与并联
我们常见的两个电路是串联并联,我们分别把两个开关命名为A、B,灯泡这一端的状态命名为Y。
<图2:串联>
<图3:并联>
串联就是只有开关A和开关B同时闭合,灯泡Y才会亮;并联就是只要开关A或者开关B有一个闭合,灯泡Y就会亮。
逻辑
按照一开始的逻辑,我们把电路理解成:输入是开关的状态(闭合或者断开),输出是灯泡的状态(亮或者不亮)。
我们把开关闭合当做状态”1“,断开当做状态”0“,灯泡亮为状态”1“,灯泡不亮为状态”0“。于是电路就理解成为一个数学上的概念:逻辑代数表达式,这个式子有输入有输出,各个输入输出的取值要么0,要么1。
通过电信号控制开关
刚刚电路是通过人工闭合断开开关来传递信息,为了脱离这个动作,就需要让电路自己控制开关。看看《编码:隐匿在计算机软硬件背后的语言》里边讲到的继电器,就是这么一个”自动“的装置。
继电器有2个输入,1个输出。如下图所示,当IN1的电压为V时,通电的螺线管产生磁力把上边带有弹簧的开关吸下来,使得上边的电路闭合,从而输出端OUT等同于输入IN2。
<图4:通过电控制开关>
通过开关,我们可以实现信号在电路里边传输,通过组合不同的开关,我们可以组成更复杂的电路,也就是说只要有足够多的继电器(也就是开关),我们就可以设计出一个传递信息的复杂电路,这个设备的大小完全就取决于继电器的大小以及线路的编排。
逻辑门
与门和或门
通过前边的串联和并联电路,我们可以得到这么两个电路。
<图5:与门>
<图6:或门>
与门电路:输入端A和B电压为V(A=1, B=1)时,电路的灯泡Y就亮了(Y=1),逻辑表达式记为:Y = A * B
或门电路:输入端A和B电压其中一个为V(A=1 或者 B=1)时,电路的灯泡Y就亮了(Y=1),逻辑表达式记为:Y = A + B
这样的电路有了基本的逻辑运算能力!
其他逻辑门
同理,很容易就可以得到其他逻辑门。
<图7:其他逻辑门>
非门: 输入A=1,输出F=0;输入A=0,输出F=1;(F和A相反)
异或门: 输入A=0&B=0,或者A=1&B=1,输出Y=0;输入A=1&B=0,或者A=0&B=1,输出Y=1;(A和B不同时,Y为1)
简单的组合电路
我们可以利用或门、与门与非门来构建一个异或的电路。
<图8:异或门电路>
我们很容易构建一个2个输入和1个输出的逻辑电路。
更复杂的电路
如果电路要求有多个输入和多个输出,电路应该怎么设计呢?简单一点,我们考虑一个3输入2输出的电路设计。
我们把电路的所有输入输出状态罗列出来,就得到一个真值表,如下表。
<图9:真值表>
其实可以把2个输出拆开来看,只要能够构建出N输入1输出的电路,把多个这样的电路合在一起就可以达到我们的目的。我们把刚刚的真值表拆成2个真值表。
<图10:Y1真值表>
<图11:Y2真值表>
现在我们专注于设计输入为ABC,输出为Y1的电路。按照下图的步骤,我们就可以得到Y1的表达式: Y = B*C + A*(B+C)
<图12:Y1逻辑表达式>
有了这个表达式很容易用2个或门2个与门构建出输出为Y1的电路。同理设计出Y2的电路,2个电路合起来就达到了我们的目的。
电路的计算能力
下边的计算中,所有的输入输出都是0和1。
半加器
不考虑进位的加法 S = A + B (CO为进位),可以设计出这样的半加器。
<图13:半加器>
全加器
如果考虑上进位CI的加法 S = A + B + CI (CO为进位),利用刚刚的半加器就可以构建出新的计算能力:全加器。
<图14:全加器>
8位芯片
刚刚都是1位的运算,如果把8个的1位全加器前后的CI和CO连起来,就可以得到一个8位的加法运算电路!
<图15:8位芯片>
2个计算能力共用电路
如下图,我们可以把8位的加法减法能力巧妙的设计在一起,他们共用了一些线路,这样也节省了不少芯片,也减小了整个电路体积。
<图16:2个计算能力共用电路>
电路的记忆能力
一个有思考能力的”脑“其实应该具备两个能力:计算+记忆。
先看看下图的反馈电路,一旦开关闭合之后,输出Y就会一直”振荡“,产生0101的输出
<图17:反馈电路>
考虑这样的电路,一个RS触发器。
<图18:记忆电路>
通过简单的推算就知道,上边那个电路在S = 0, R = 0的时候,Q端输出保持上一时刻的值,这个电路就有了”记忆“功能。
上边的RS触发器可以留意到2个特点:
- 非记忆状态时:R和S的值不同。
- 记忆状态时,R和S不会同时为1。
因此我们在RS触发器前在加点电路控制,让RS触发器的输入端在CLK=1时满足以上第一个条件,CLK=0时,满足第二个条件。
<图19:D锁存器>
可以看到:
- CLK为1的时候,Q端输出等于D端。
- CLK为0的时候,Q端锁住了上一时刻D端的值
一个没有节奏的CPU
<图20:没有节奏的CPU>
只要D锁存器的CLK端开关闭合上之后,这个电路就一直在计算sum+=1,断开开关的时候,此时锁存器的Q7-Q0端已经记录了断开时刻的sum值,但是这个加一循环了多少次,我们是不知道的。这个电路没有一个节奏。
本质原因就在于锁存器在CLK为1的时候,输出端一直都是输出端的值,如果能有一个节奏,例如每隔1s,才将输入端的值同步到输出端去,对于刚刚的电路来说就更有意义了,我们只要知道这个周期,那我们就知道这个电路运行多少秒之后得到的sum值是什么。
带节奏的锁存器
<图21:带节奏的锁存器>
为了达到在0到1跳动这一下触发输入到输出的信号传递,我们可以利用2个电平触发的D锁存器。如下图:
<图22:边沿触发器>
有了这个边沿触发器加上一开始说反馈电路的振荡器,改造一下刚刚的计算电路,就得到一个带节奏的”CPU”
<图23:有节奏的运算>
硬件计算VS软件计算
硬件计算就是通过芯片直接计算得出结果,例如上边的加法器减法器。
软件计算就是通过程序控制多次芯片计算得来的结果。
于是乎可以得到:硬件计算是比软件计算更快的!但是硬件计算需要更复杂的电路设计,相比而言软件计算非常灵活,它可以利用有限的硬件计算能力构建出无限的计算集合。
一个计算机系统,它需要底层硬件提供基础的计算/记忆能力,也需要灵活的软件计算来完成不同的业务需求。
请问一下博主用的是什么绘图软件