上一讲,咱们看到,要可以实现一个完整的CPU功能,除了加法器这样的电路以外,咱们还须要实现其余功能的电路。其中有一些电路,和咱们实现过的加法器同样,只须要给定输入,
就能获得固定的输出。这样的电路,咱们称之为 组合逻辑电路(Combinational Logic Circuit)。编程
可是,光有组合逻辑电路是不够的。你能够想一下,若是只有组合逻辑电路,咱们的CPU会是什么样的?电路输入是肯定的,对应的输出天然也就肯定了。ui
那么,咱们要进行不一样的计算,就要去手动拨动各类开关,来改变电路的开闭状态。这样的计算机,不像咱们如今天天用的功能强大的电子计算机,spa
反倒更像古老的计算尺或者机械计算机,干不了太复杂的工做,只能协助咱们完成一些计算工做。3d
这样,咱们就须要引入第二类的电路,也就是 时序逻辑电路(Sequential Logic Circuit)。时序逻辑电路能够帮咱们解决这样几个问题。blog
第一个就是 自动运行的问题。时序电路接通以后能够不停地开启和关闭开关,进入一个自动运行的状态。这个使得咱们上一讲说的,控制器不停地让PC寄存器自增读取下一条指令成为可能。事件
第二个是 存储的问题。经过时序电路实现的触发器,能把计算结果存储在特定的电路里面,而不是像组合逻辑电路那样,一旦输入有任何改变,对应的输出也会改变。ip
第三个本质上解决了各个功能按照 时序协调的问题。不管是程序实现的软件指令,仍是到硬件层面,各类指令的操做都有前后的顺序要求。时序电路使得不一样的事件按照时间顺序发生。内存
想要实现时序逻辑电路,第一步咱们须要的就是一个 时钟。我在第3讲说过,CPU的主频是由一个晶体振荡器来实现的,而这个晶体振荡器生成的电路信号,就是咱们的时钟信号。路由
实现这样一个电路,和咱们以前讲的,经过电的磁效应产生开关信号的方法是同样的。只不过,这里的磁性开关,打开的再也不是后续的线路,而是当前的线路。it
在下面这张图里你能够看到,咱们在原先通常只放一个开关的信号输入端,放上了两个开关。一个开关A,一开始是断开的,由咱们手工控制;另一个开关B,
一开始是合上的,磁性线圈对准一开始就合上的开关B。
因而,一旦咱们合上开关A,磁性线圈就会通电,产生磁性,开关B就会从合上变成断开。一旦这个开关断开了,电路就中断了,磁性线圈就失去了磁性。因而,开关B又会弹回到合上的状态。这样一来,电路接通,线圈又有了磁性。咱们的电路就会来回不断地在开启、关闭这两个状态中切换。
这个不断切换的过程,对于下游电路来讲,就是不断地产生新的0和1这样的信号。若是你在下游的电路上接上一个灯泡,就会发现这个灯泡在亮和暗之间不停切换。
这个按照固定的周期不断在0和1之间切换的信号,就是咱们的 时钟信号(Clock Signal)。
通常这样产生的时钟信号,就像你在各类教科书图例中看到的同样,是一个振荡产生的0、1信号。
这种电路,其实就至关于把电路的输出信号做为输入信号,再回到当前电路。这样的电路构造方式呢,咱们叫做 反馈电路(Feedback Circuit)。
接下来,咱们还会看到更多的反馈电路。上面这个反馈电路通常能够用下面这个示意图来表示,其实就是一个输出结果接回输入的 反相器(Inverter),也就是咱们以前讲过的非门
有了时钟信号,咱们的系统里就有了一个像“自动门”同样的开关。利用这个开关和相同的反馈电路,咱们就能够构造出一个有“记忆”功能的电路。这个有记忆功能的电路,
能够实如今CPU中用来存储计算结果的寄存器,也能够用来实现计算机五大组成部分之一的存储器。
咱们先来看下面这个RS触发器电路。这个电路由两个或非门电路组成。我在图里面,把它标成了A和B。
1. 在这个电路一开始,输入开关都是关闭的,因此或非门(NOR)A的输入是0和0。对应到我列的这个真值表,输出就是1。而或非门B的输入是0和A的输出1,
对应输出就是0。B的输出0反馈到A,和以前的输入没有变化,A的输出仍然是1。而整个电路的 输出Q,也就是0。
2. 当咱们把A前面的开关R合上的时候,A的输入变成了1和0,输出就变成了0,对应B的输入变成0和0,输出就变成了1。B的输出1反馈给到了A,A的输入变成了1和1,
输出仍然是0。因此把A的开关合上以后,电路仍然是稳定的,不会像晶振那样振荡,可是整个电路的 输出Q变成了1。
3. 这个时候,若是咱们再把A前面的开关R打开,A的输入变成和1和0,输出仍是0,对应的B的输入没有变化,输出也仍是1。B的输出1反馈给到了A,A的输入变成了1和0,输出仍然是0。这个时候,电路仍然稳定。 开关R和S的状态和上面的第一步是同样的,可是最终的输出Q仍然是1,和第1步里Q状态是相反的。咱们的输入和刚才第二步的开关状态不同,可是输出结果仍然保留在了第2步时的输出没有发生变化。
4. 这个时候,只有咱们再去关闭下面的开关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的输出。
若是这个时候,咱们让R和S的开关,也用一个反相器连起来,也就是经过同一个开关控制R和S。只要CLK信号是1,R和S就能够设置输出Q。而当CLK信号是0的时候,不管R和S怎么设置,输出信号Q是不变的。这样,这个电路就成了咱们最经常使用的D型触发器。用来控制R和S这两个开关的信号呢,咱们视做一个输入的数据信号D,也就是Data,这就是D型触发器的由来。
一个D型触发器,只能控制1个比特的读写,可是若是咱们同时拿出多个D型触发器并列在一块儿,而且把用同一个CLK信号控制做为全部D型触发器的开关,这就变成了一个N位的D型触发器,也就能够同时控制N位的读写。
CPU里面的寄存器能够直接经过D型触发器来构造。咱们能够在D型触发器的基础上,加上更多的开关,来实现清0或者所有置为1这样的快捷操做。
好了,到了这里,咱们能够顺一顺思路了。经过引入了时序电路,咱们终于能够把数据“存储”下来了。咱们经过反馈电路,建立了时钟信号,而后再利用这个时钟信号和门电路组合,
实现了“状态记忆”的功能。电路的输出信号不仅仅取决于当前的输入信号,还要取决于输出信号以前的状态。最多见的这个电路就是咱们的D触发器,它也是咱们实际在CPU内实现存储功能的寄存器的实现方式。
这也是现代计算机体系结构中的“冯·诺伊曼”机的一个关键,就是程序须要能够“存储”,而不是靠固定的线路链接或者手工拨动开关,来实现计算机的可存储和可编程的功能。
有了时钟信号和触发器以后,咱们还差一个“自动”需求没有实现。咱们的计算机还不能作到自动地不停地从内存里面读取指令去执行。这一部分,咱们留在下一讲。下一讲里,咱们看看怎么让程序自动运转起来。