三大周期

指令周期

计算机每执行一条指令的过程,可分解为这几个步骤。

  1. Fetch(取得指令),从 PC 寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中,然后把 PC寄存器自增,好在未来执行下一条指令。
  2. Decode(指令译码),也就是根据指令寄存器里面的指令,解析成要进行什么样的操作,是 RIJ 中的哪一种指令,具体要操作哪些寄存器、数据或者内存地址。
  3. Execute(执行指令),也就是实际运行对应的 R、I、J 这些特定的指令,进行算术逻辑操作数据传输或者直接的地址跳转
  4. 重复进行 1~3 的步骤。其实就是一个永不停歇的“Fetch – Decode – Execute”的循环,我们把这个循环称之为 指令周期(Instruction Cycle)

指令周期


指令周期(Instruction Cycle)

  在取指令的阶段,我们的指令是放在存储器里的,实际上,通过 PC 寄存器和指令寄存器取出指令的过程,是由控制器(Control Unit)操作的。指令的解码过程,也是由控制器进行的。一旦到了执行指令阶段,无论是进行算术操作、逻辑操作的 R 型指令,还是进行数据传输、条件分支的I型指令,都是由算术逻辑单元(ALU)操作的,也就是由运算器处理的。不过,如果是一个简单的无条件地址跳转,那么我们可以直接在控制器里面完成,不需要用到运算器。

在这里插入图片描述


不同步骤在不同组件之内完成

机器周期

Machine Cycle,机器周期也称CPU周期。CPU内部的操作速度很快,但是访问内存的速度却要慢很多。每一条指令都需要从内存里面加载而来,所以一般把从内存里面读取一条指令的最短时间,称为 CPU 周期。

时钟周期

  Clock Cycle,时钟周期。一个CPU 周期,通常会由几个时钟周期累积起来。一个 CPU 周期的时间,就是这几个Clock Cycle的总和
主频 = 时钟频率,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍。时钟周期为主频的倒数

T

=

1

/

f

T=1/f

T=1/f
在这里插入图片描述

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

建立数据通路

数据通路就是处理器单元,它通常由两类元件,操作元件和存储元件组成。
操作元件,也叫组合逻辑元件(Combinational Element),其实就是我们的ALU。它们的功能就是在特定的输入下,根据下面的组合电路的逻辑,生成特定的输出。
存储元件,也有叫状态元件(State Element)的。比如我们在计算过程中需要用到的寄存器,无论是通用寄存器还是状态寄存器,其实都是存储元件。
通过数据总线的方式,把它们连接起来,就可以完成数据的存储、处理和传输了,这就是所谓的建立数据通路了。

控制器

  控制器,可以把它看成只是机械地重复“Fetch – Decode – Execute“循环中的前两个步骤,然后把最后一个步骤,通过控制器产生的控制信号,交给 ALU 去处理。但控制器的电路其实特别复杂
  一方面,所有 CPU 支持的指令,都会在控制器里面,被解析成不同的输出信号。我们之前说过,现在的 Intel CPU 支持 2000 个以上的指令。这意味着,控制器输出的控制信号,至少有 2000 种不同的组合。
运算器里的 ALU 和各种组合逻辑电路,可以认为是一个固定功能的电路。控制器“翻译”出来的,就是不同的控制信号。这些控制信号,告诉 ALU 去做不同的计算。可以说正是控制器的存在,让我们可以“编程”来实现功能,能让我们的“存储程序型计算机”名副其实。
在这里插入图片描述


指令译码器将输入的机器码,解析成不同的操作码和操作数,然后传输给 ALU 进行计算

CPU所需要的硬件电路

  要想搭建出来整个 CPU,需要在数字电路层面,实现这样一些功能。

ALU

  首先是 ALU ,它实际是一个没有状态的,根据输入计算输出结果的第一个电路。

寄存器

  第二,需要有一个 能够进行状态读写的电路元件,也就是我们的寄存器。我们需要有一个电路,能够存储到上一次的计算结果。这个计算结果并不一定要立刻拿到电路的下游去使用,但是可以在需要的时候拿出来用。常见的能够进行状态读写的电路,就有锁存器(Latch),以及 D 触发器(Data/Delay Flip-flop)的电路。

程序计数器

  第三,需要有一个“自动”的电路,按照固定的周期,不停地实现 PC 寄存器自增,自动地去执行“Fetch – Decode – Execute”的步骤。希望有一个“自动”的电路,不停地去一条条执行指令。
  我们看似写了各种复杂的高级程序进行各种函数调用、条件跳转。其实只是修改 PC 寄存器里面的地址。PC 寄存器里面的地址一修改,计算机就可以加载一条指令新指令,往下运行。实际上,PC 寄存器还有一个名字,就叫作程序计数器。顾名思义,就是随着时间变化,不断去数数。数的数字变大了,就去执行一条新指令。所以,我们需要的就是一个自动数数的电路。

译码器

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

组合逻辑电路

  只需要给定输入,就能得到固定的输出。这样的电路,称之为组合逻辑电路(Combinational Logic Circuit)。

时序逻辑电路

时序逻辑电路解决的问题

  第一个就是自动运行的问题。时序电路接通之后可以不停地开启和关闭开关,进入一个自动运行的状态。这个使得控制器不停地让 PC 寄存器自增读取下一条指令成为可能。
  第二个是存储的问题。通过时序电路实现的触发器,能把计算结果存储在特定的电路里面,而不是像组合逻辑电路那样,一旦输入有任何改变,对应的输出也会改变。
  第三个本质上解决了各个功能按照时序协调的问题。无论是程序实现的软件指令,还是到硬件层面,各种指令的操作都有先后的顺序要求。时序电路使得不同的事件按照时间顺序发生。

时钟信号的硬件实现

  想要实现时序逻辑电路,首先需要的就是一个时钟CPU 的主频是由一个晶体振荡器来实现的,而这个晶体振荡器生成的电路信号,就是我们的时钟信号(Clock Signal)
  在下面这张图里你可以看到,在原先一般只放一个开关的信号输入端,放上了两个开关。一个开关 A,一开始是断开的,由我们手工控制;另外一个开关 B,一开始是合上的,磁性线圈对准一开始就合上的开关 B。
  于是,一旦合上开关 A,磁性线圈就会通电,产生磁性,开关 B 就会从合上变成断开。一旦这个开关断开了,电路就中断了,磁性线圈就失去了磁性。于是,开关 B 又会弹回到合上的状态。这样一来,电路接通,线圈又有了磁性。我们的电路就会来回不断地在开启、关闭这两个状态中切换。

在这里插入图片描述


开关 A 闭合(也就是相当于接通电路之后),开关 B 就会不停地在

开和关之间切换, 生成对应的时钟信号

  这个不断切换的过程,对于下游电路来说,就是不断地产生新的 0 和 1 这样的信号。如果你在下游的电路上接上一个灯泡,就会发现这个灯泡在亮和暗之间不停切换。这个按照固定的周期不断在 0 和 1 之间切换的信号,就是时钟信号(Clock Signal)
在这里插入图片描述


时钟信号示意图

  上面这种电路,相当于把电路的输出信号作为输入信号,再回到当前电路。这样的电路构造方式,叫作反馈电路(Feedback Circuit)
  上面这个反馈电路一般可以用下面这个示意图来表示,在一个输出结果接回输入的反相器(Inverter),也就是所谓的非门
在这里插入图片描述


通过一个反相器实现时钟信号

通过 D 触发器实现存储功能

推荐阅读

  1. 如果想要了解数据通路,可以参看《计算机组成与设计 硬件软件接口》的第 5 版的 4.1 到 4.4 节。

参考-极客时间-徐文浩-深入浅出计算机组成原理


版权声明:本文为weixin_31948131原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_31948131/article/details/109599015