建立数据通路
指令周期(Instruction Cycle)
计算机执行一条指令的过程,可以分解为一下这样及步骤。
- 取得指令(Fetch),也就是从PC寄存器里找到对应的指令地址,根据指令地址从内存中把具体的指令加载到指令寄存器中,然后把PC寄存器自增。
- 指令译码(Decode),也就是根据指令寄存器里面的指令,解析成要进行什么样的操作。具体要操作哪些寄存器,数据或者内存地址。
- 指令执行(Execute),对应具体的指令,进行算术逻辑操作、数据跳转或者直接的地址跳转。
- 重复以上三步骤。
“Fetch-Decode-Execute”这样的循环,我们称之为指令周期。
指令存放在存储器里,取指阶段,通过PC寄存器和指令寄存器取指令的过程,由控制器操作。指令的解码过程,也是由控制器进行。到了执行阶段,就是由算术逻辑单元,也就是运算器处理。如果是一个简单的无条件地址跳转,直接在控制器里完成。
除了指令周期,还有另外两个常见的周期。
机器周期或者CPU周期。我们一般把从内存里读取一条指令的对短时间,称为CPU周期。
时钟周期。就是我们机器的主频。一个CPU周期,通常由几个时钟周期累积起来。
所以,一个指令周期,包含多个CPU周期,而一个CPU周期包含多个时钟周期。
建立数据通路
数据通路就是我们的处理器单元。它通常由两类原件组成。
- 操作元件,也是组合逻辑元件,ALU。他的功能是在特定的输入下,生成特定的输出。
- 存储元件,也是状态元件。
我们通过总线的方式,把他们连接起来,就可以完成数据的存储、处理和传输了,这就建立了数据通路了。
控制器,他的逻辑就是循环取指和译码,然后把生成的控制信号,交给ALU去处理。不过它可以解析CPU支持的指令。
如何搭建CPU
第一,需要ALU,根据输入计算输出结果。
第二,我们需要能够进行状态读写的元件。能够存储上一次计算结果,在需要的时候拿出来用。如锁存器、D触发器。
第三,我们需要一个自动的电路,不停的实现PC寄存器自增,自动执行指令周期的步骤。
第四,我们需要一个译码的电路。
把这四类电路,通过各种方式组合在一起,就能实现CPU了。
自动电路的实现
也就是实现时序逻辑电路。
一开始下图的开关A打开,开关B闭合。一旦合上A,磁性线圈通电,产生磁性,B从闭合变成断开。一旦断开,电路中断,磁性线圈失去磁性。于是B又反弹回去成了闭合的状态。这样我们的电路就会来回不断地在开启、关闭两个状态切换。
存储电路的实现
我们先来看下面的RS触发器
以上电路
- 接通开关R,输出为1,断开开关输出还是1。
- 接通开关S,输出变为0,断开开关输出还是0。
- 当两个开关都断开时,输出结果取决于之前的输出结果
下图是该电路的真值表
此时我们在这个电路里加一个时钟信号和反相器如下图,就形成了D触发器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YtUyD3ag-1645862180996)(C:\Users\张小瑄\Desktop\图片\Snipaste_2022-02-26_10-20-54.jpg)]
- 当CLK信号是1的话,R和S就可设置输出Q
- 当CLK信号是0的话,无论R和S如何设置,输出Q都是不变的
通过数据信号D写入操作,一个D触发器,只能控制1比特的读写。拿N个触发器,就可以同时控制N位的读写。CPU里面的寄存器就可以通过D触发器来构造。
译码电路的实现
译码器,就是从输入的多个位的信号中,根据一定的开关和电路的组合,选出自己想要的信号。
比如3-8译码器,通过三条输入信号来选择8个不同的地址。
PC寄存器的实现
加法器的两个输入,一个始终设置成1,另外一个来自D触发器。我们把加法器的输出结果,写入到D触发器里。D触发器里面的数据在时钟信号为1的时候更新。这样我们每过一个时钟周期,就能固定的增加1了。