点击查看【bilibili】

CPU 概念

  • 程序:由一条条指令组成。程序存储在内存中。
  • 指令:指示计算机要做什么。
    • 如下图所示是一张指令表,假设 8 位指令,前 4 位代表操作码,指向相应的指令;后 4 位代表数据来自哪里,可以是寄存器或内存地址。

image.png

  • CPU的功能:中央处理单元,与RAM配合,负责执行程序
    • 数学指令(eg. 加/减):CPU 让 ALU 进行数学运算
    • 内存指令:CPU 和内存进行通信,然后读/写值
  • 微体系架构:把重点放在功能,而不是一根根线具体怎么连,当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象,这种高层次视角叫 “微体系架构“。

CPU的组成

  • 寄存器:用来 临时存数据 和 操作数据
    • 通用寄存器:存储任意数据
    • 指令地址寄存器/指令计数器:存放当前指令的内存地址(追踪程序运行到哪里了)。能自动形成下一条指令的地址(+1)
    • 指令寄存器:存储指令
    • … …
  • 运算器 ALU:负责算数和逻辑运算
  • 控制器/控制单元:控制整个 CPU 的工作,保证 程序的正确执行 以及 能够处理异常事件。
    • eg. 指令解码由控制单元的逻辑电路完成。
    • 包含 指令地址寄存器 和 指令寄存器 等
  • 时钟:负责管理CPU的节奏
    • 时钟以精确的间隔触发电信号,控制单元会用这个信号,推进 CPU 的内部操作,确保一切按步骤进行。
    • CPU “取指令→解码→执行” 中每一步的时间为一个周期,每一步的速度叫 “时钟速度“,单位是赫兹,代表 多少个周期每秒。
      • eg. 6 分钟 4 条指令,每条指令包含取指令、解码、执行这 3 个周期,则时钟速度为 4 × 3 / 360 = 0.033 赫兹
    • 超频:加快时钟速度,提升性能
    • 降频:减慢时钟速度,省电
    • 动态调整频率:很多现代处理器可以按需求 加快或减慢时钟速度

将以上组件提升一层新的抽象,变成一个独立的 CPU 组件,如下图所示。
RAM 是在 CPU 外面的独立组件,CPU 和 RAM 之间用 “地址线” “数据线” 和 “允许读/写线” 进行通信。
image.png

CPU 执行指令的流程

取指令阶段 FETCH PHASE

取指令阶段负责拿到指令。

  • 首先,指令地址寄存器连接到 RAM
  • 若当前指令地址寄存器中存储的指令地址为address,则RAM返回address对应的值(指令),并复制到指令寄存器
    • 如下图所示,初始时,各个寄存器初始值都为0,因此RAM返回地址0对应的值。

image.png

解码阶段 DECODE PHASE

  • 将指令寄存器中的指令参照指令表
    • 这里的例子,指令前四位代表操作码,后四位代表数据来源(内存或寄存器地址)

image.png

  • 指令解码由控制器进行。可通过简单的逻辑门电路对指令进行解码,如下图所示。不同的指令由不同的逻辑电路解码。

image.png

执行阶段 EXECUTE PHASE

以指令 0010 1110 为例,该指令操作码是0010,解码为 LOAD_A 指令:

  • 用”检查是否 LOAD_A 指令的电路”,可以打开 RAM 的 “允许读取线”
  • 把地址 14(1110) 传给 RAM
  • 用 “检查是否 LOAD_A 指令的电路” 启用寄存器 A 的 “允许写入线”
  • 把 RAM 地址 14 的值存储到寄存器A中
  • 指令执行结束,指令地址寄存器中的地址 +1

image.png
以指令 1000 0100 为例,该指令操作码是1000,解码为 ADD 指令;第一个地址是 01, 代表寄存器B,第二个地址是 00, 代表寄存器A。该指令代表把寄存器 B 的值,加到寄存器 A 里:

  • 启用寄存器 B(寄存器地址01),作为 ALU 的第一个输入
  • 启用寄存器 A(寄存器地址00),作为 ALU 的第二个输入
  • 传递 ADD 操作码给 ALU,使 ALU 明确其要进行的是加法操作
  • 控制单元用一个自己的寄存器暂时保存结果 0001 0001(3+4=17)
  • 关闭 ALU,然后把值写入正确的寄存器 A 。(先保存到控制单元的临时寄存器,关闭ALU后再写入寄存器A,否则会不断和自己相加)
  • 指令地址 + 1

image.png
以指令 0100 1101 为例,该指令操作码是0100,解码为 STORE_A 指令:

  • 打开 RAM 的允许写入线
  • 把地址 13(1101) 传给 RAM
  • 打开寄存器 A 的 “允许读取线”
  • 把寄存器 A 里的值,传给 RAM,保存到 RAM 地址 13
  • 指令地址 + 1

image.png