我们知道,在 冯·诺依曼 的提出的计算机模型中,计算机是由五大部分组成:运算器、控制器、存储器、输入设备、输出设备。

其中,运算器和控制器一般会放在一起,即我们的 CPU (中央处理器),负责指令读取和计算。

指令一般分为三类,R 型:进行算术操作、逻辑操作;I 型:进行数据传输、条件分支;J 型:地址跳转。

有了这些基础,那么完整的 CPU 是怎么运转起来的呢。

指令周期

来看下一条指令被执行的过程中,经历了哪些阶段。

  1. 控制器获取指令。从 PC 寄存器里找指令地址,根据地址再从内存获取具体指令。
  2. 控制器将指令译码。根据指令,解析成要进行哪些操作(R、I、J类指令操作)。
  3. 运算器将指令执行。R、I 型一般由 ALU 算术逻辑单元处理,就是运算器处理,简单的跳转指令还是由控制器直接执行。
  4. 循环 1 ~ 3。

指令周期

除了指令周期,CPU 中还有两个常见的周期。

一是 Machine Cycle,机器周期或者 CPU 周期。一般把从内存里面读取一条指令的最短时间,称为 CPU 周期。

另一个是 Clock Cycle,也就是时钟周期以及我们机器的主频。一个 CPU 周期,通常会由几个时钟周期累积起来。

对于一个指令周期来说,我们取出一条指令,然后执行它,至少需要两个 CPU 周期。取出指令至少需要一个 CPU 周期,执行至少也需要一个 CPU 周期,复杂的指令则需要更多的 CPU 周期。

三个周期的关系

数据通路

我们已经知道 CPU 由运算器,控制器,寄存器,以及总线来将他们串起来。那么在硬件层面,需要哪些电路呢。

首先就是 ALU 和各种组合逻辑电路,实际就是一个没有状态的,根据输入计算输出结果的第一个电路。

第二,需要有一个能够进行状态读写的电路元件,也就是我们的寄存器。能够存储一次运算的结果,需要的时候拿出来使用。

第三,需要由一个“自动”的电路,按照固定的周期,不停地实现 PC 寄存器自增,自动地去执行“Fetch - Decode - Execute“的步骤。

第四,我们需要有一个“译码”的电路。无论是对于指令进行 decode,还是对于拿到的内存地址去获取对应的数据或者指令,我们都需要通过一个电路找到对应的数据。

把这四类电路,通过各种方式组合在一起,就能最终组成功能强大的 CPU 了。

总结

本文介绍了 CPU 运转的指令周期和需要的数据通路,以及完成通路功能所需要的四种电路,分别是,ALU 这样的组合逻辑电路、用来存储数据的锁存器和 D 触发器电路、用来实现 PC 寄存器的计数器电路,以及用来解码和寻址的译码器电路。

虽然 CPU 已经是由几十亿个晶体管组成的及其复杂的电路,但是它仍然是由这样一个个基本功能的电路组成的。只要搞清楚这些电路的运作原理,你自然也就弄明白了 CPU 的工作原理。