1 组合逻辑电路(Combinational Logic Circuit)
要实现完整CPU功能,除加法器这种电路,还需实现其他功能的电路。有这样一种电路,类似加法器,给定输入,就能得到固定输出。
但仅有组合逻辑电路还不够,CPU就会变成电路输入是确定的,对应输出自然也就确定了。那么,要进行不同计算,就要去人工拨动各种开关,改变电路开闭状态,就像远古的打点计算机。
因此,要引入
2 时序逻辑电路(Sequential Logic Circuit)
2.1 解决痛点
自动运行
时序电路接通后可007无休开启、关闭开关,进入一个自动运行的状态。这使得控制器不停让PC寄存器自增读取下一条指令成为可能。
存储
通过时序电路实现的触发器,能把计算结果存储在特定的电路里面,而不是像组合逻辑电路那样,一旦输入有任何改变,对应的输出也会改变。
各功能按时序协调
无论程序实现的软件指令,还是到硬件层面,各种指令的操作都有顺序要求。
时序电路使得不同的事件按时间顺序发生。
硬件实现
时钟
首先得有一个时钟。CPU主频由一个晶体振荡器实现,该晶体振荡器生成的电路信号,就是时钟信号。
实现这样一个电路,和通过电的磁效应产生开关信号的方法一样。只是,这里的磁性开关,打开的是当前线路。
原先一般只放一个开关的信号输入端,放上了两个开关:
- 开关A
初始断开,手工控制 - 开关B
初始合上,磁性线圈对准初始的开关B
一旦合上A
=》磁性线圈通电,产生磁性
=》B就会断开
=》电路中断
=》磁性线圈失去磁性
=》B又合上
如此,电路接通,线圈又有磁性。电路就会007 地开启、关闭这两个状态中切换。
- 开关A闭合(也就是相当于接通电路之后),开关B就会不停地在开和关之间切换,生成对应的时钟信号
这不断切换的过程,对下游电路就是不断产生新的0/1信号。这种按固定周期不断在0和1之间切换的信号,就是时钟信号(Clock Signal)。
一般这样产生的时钟信号,就像你在各种教科书图例中看到的一样,是一个振荡产生的0、1信号。
- 时钟信号示意图
这相当于把电路输出信号作为输入信号,再回到当前电路 — 反馈电路(Feedback Circuit)。
上面这个反馈电路可用如下示意图表示:一个输出结果接回输入的反相器(Inverter)即非门。
- 通过一个反相器实现时钟信号
通过D触发器实现存储功能
有时钟信号,系统就有个“自动门”一样的开关。利用该开关和相同的反馈电路,即可构造出一个有“记忆”功能的电路,实现在CPU中存储计算结果的寄存器,也可实现计算机结构五大组成之一的存储器。
这个RS触发器电路由两个或非门电路组成。
- 或非门的真值表
- 该电路初始时,输入开关都关闭,所以或非门(NOR)A的输入是0、0,则输出1。而或非门B的输入是0和A的输出1,对应输出0。
B的输出0反馈到A,和之前的输入没有变化,A的输出仍然是1。
而整个电路的输出Q,也就是0。 - 当把A前面的开关R合上,A的输入变成1、0,输出变成0,对应B的输入变成0、0,输出就变成1。B的输出1反馈给到了A,A的输入变成了1和1,输出仍然是0。所以把A的开关合上之后,电路仍稳定,但整个电路的输出Q变成1。
- 这个时候,如果我们再把A前面的开关R打开,A的输入变成和1和0,输出还是0,对应的B的输入没有变化,输出也还是1。B的输出1反馈给到了A,A的输入变成了1和0,输出仍然是0。这个时候,电路仍然稳定。开关R和S的状态和上面的第一步是一样的,但是最终的输出Q仍然是1,和第1步里Q状态是相反的。我们的输入和刚才第二步的开关状态不一样,但是输出结果仍然保留在了第2步时的输出没有发生变化
- 这个时候,只有我们再去关闭下面的开关S,才可以看到,这个时候,B有一个输入必然是1,所以B的输出必然是0,也就是电路的最终输出Q必然是0。
这称为触发器(Flip-Flop)。接通开关R,输出变为1,即使断开开关,输出还是1不变。接通开关S,输出变为0,即使断开开关,输出也还是0。也就是,当两个开关都断开的时候,最终的输出结果,取决于之前动作的输出结果,这个也就是我们说的记忆功能。
这是最简单的RS触发器,即复位置位触发器(Reset-Set Flip Flop) 。当两个开关都是0,对应输出不是1或0,而是和Q的上个状态一致。
再加两个与门和一个时钟信号,即可利用时钟信号操作电路,可实现随时都可往Q写数据。
再看如下电路,这个在我们的上面的R-S触发器基础之上,在R和S开关之后,加入了两个与门,同时给这两个与门加入了一个时钟信号CLK作为电路输入。
这样,当时钟信号CLK在低电平的时候,与门的输入里有一个0,两个实际的R和S后的与门的输出必然是0。也就是说,无论我们怎么按R和S的开关,根据R-S触发器的真值表,对应的Q的输出都不会发生变化。
只有当时钟信号CLK在高电平的时候,与门的一个输入是1,输出结果完全取决于R和S的开关。我们可以在这个时候,通过开关R和S,来决定对应Q的输出。
通过一个时钟信号,我们可以在特定的时间对输出的Q进行写入操作
如果这个时候,我们让R和S的开关,也用一个反相器连起来,也就是通过同一个开关控制R和S。只要CLK信号是1,R和S就可以设置输出Q。而当CLK信号是0的时候,无论R和S怎么设置,输出信号Q是不变的。这样,这个电路就成了我们最常用的D型触发器。用来控制R和S这两个开关的信号呢,我们视作一个输入的数据信号D,也就是Data,这就是D型触发器的由来。
把R和S两个信号通过一个反相器合并,我们可以通过一个数据信号D进行Q的写入操作
一个D型触发器,只能控制1个比特的读写,但是如果我们同时拿出多个D型触发器并列在一起,并且把用同一个CLK信号控制作为所有D型触发器的开关,这就变成了一个N位的D型触发器,也就可以同时控制N位的读写。
CPU里面的寄存器可以直接通过D型触发器来构造。我们可以在D型触发器的基础上,加上更多的开关,来实现清0或者全部置为1这样的快捷操作。
3 总结
引入时序电路,就可以把数据“存储”下来。
通过反馈电路,创建了时钟信号,然后再利用这个时钟信号和门电路组合,实现“状态记忆”。
电路的输出信号不单单取决于当前的输入信号,还要取决于输出信号之前的状态。最常见的这个电路就是我们的D触发器,它也是我们实际在CPU内实现存储功能的寄存器的实现方式。
“冯·诺伊曼”机关键就是程序需要可以“存储”,而不靠固定线路连接或手工拨动开关,实现计算机的可存储和可编程的功能。
参考
- 《编码:隐匿在计算机软硬件背后的语言》14章~16章