image-20250119222328018

CPU的功能

  • 指令控制: 完成取指令, 分析指令和执行指令的操作, 即程序的顺序控制

  • 操作控制: 一条指令的功能往往是由若干操作信号的组合来实现的. CPU管理并产生由内存取出的每条指令的操作信号, 把各种操作信号送往响应的部件, 从而控制这些部件按指令的要求进行动作

  • 时间控制: 对各种操作加以时间上的控制. 时间控制要为每条指令按时间顺序提供应有的控制信号

  • 数据加工: 对数据进行算术和逻辑运算

  • 中断处理: 对计算机运行过程中出现的异常情况和特殊请求进行处理

CPU的结构

image-20250119222339315

  • 运算器: 对数据进行加工

  • 控制器: 协调并控制计算机各部件执行程序的指令序列, 基本功能包括取指令, 分析指令, 执行指令

    • 取指令: 自动形成指令地址(PC); 自动发出取指令的命令
    • 分析指令: 操作码译码(分析本条指令要完成什么操作); 产生操作数的有效地址
    • 执行指令: 根据分析指令得到的"操作命令"和"操作数地址", 形成操作信号控制序列, 控制运算器, 存储器以及I/O设备完成相应的操作
    • 中断处理: 管理总线及输入输出; 处理异常情况(如掉电)和特殊请求(如打印机请求打印一行字符)

运算器的基本结构

  • 算术逻辑单元(ALU): 主要功能是进行算术/逻辑运算

  • 通用寄存器组(Ri): 如AX, BX, CX, DX, SP等, 用于存放操作数(包括源操作数, 目的操作数及中间结果)和各种地址信息等. SP是堆栈指针, 用于指示栈顶的地址

  • 暂存寄存器: 用于暂存从主存读来的数据, 这个数据不能存放在通用寄存器中, 否则会破坏其原有内容

  • 累加寄存器(ACC): 它是一个通用寄存器, 用于暂时存放ALU运算的结果信息, 用于实现加法运算

  • 程序状态字寄存器(PSW): 保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息, 如溢出标志(OP), 符号标志(SF), 零标志(ZF), 进位标志(CF)等. PSW中的这些位参与并决定微操作的形成

  • 移位器: 对运算结果进行移位运算

  • 计数器: 控制乘除运算的操作步数

专用数据通路方式

  • 根据指令执行过程中的数据和地址的流动方向安排连接线路

image-20250119222345390

  • 性能较高, 基本不存在数据冲突现象, 但结构复杂, 硬件量大, 不易实现

CPU内部单总线方式

  • 将所有寄存器的输入端和输出端都连接到一条公共的通路上

image-20250119222349837

  • 结构简单, 容易实现, 但数据传输存在较多冲突的现象, 性能较低

控制器的基本结构

image-20250119222354828

  • 程序计数器(PC): 用于指出下一条指令在主存中的存放地址. CPU就是根据PC的内容去主存中取指令的. 因程序中指令(通常)是顺序执行的, 所以PC有自增功能

  • 指令寄存器(IR): 用于保存当前正在执行的那条指令

  • 指令译码器(ID): 仅对操作码字段进行译码, 向控制器提供特定的操作信号

  • 微操作信号发生器: 根据IR的内容(指令), PSW的内容(状态信号)及时序信号, 产生控制整个计算机系统所需的各种控制信号, 其结构有组合逻辑型和存储逻辑型两种

  • 时序系统: 用于产生各种时序信号, 它们都是由统一时钟(CLOCK)分频得到

  • 存储器地址寄存器(MAR): 用于存放所要访问的主存单元的地址

  • 存储器数据寄存器(MDR): 用于存放向主存写入的信息或从主存中读出的信息

寄存器分类

用户可见寄存器

  • 通用寄存器

  • 数据寄存器

  • 地址寄存器

  • 条件码寄存器 / 标志寄存器

控制和状态寄存器

  • 程序计数器

  • 指令寄存器

  • 存储器地址寄存器

  • 存储器缓冲寄存器(MBR)

  • 程序状态字

    image-20250119222401584

X86体系结构: 8086的寄存器

image-20250119222406449

  • 通用寄存器

    image-20250119222413275

  • 段寄存器

    image-20250119222419774

  • 标志寄存器

    image-20250119222424863

  • 指令指针寄存器

    image-20250119222429311

  • IA-32的寄存器

    image-20250119222433291

  • X86-64的寄存器

    image-20250119222437890

指令执行过程

指令周期

  • 指令周期: CPU从主存中每取出并执行一条指令所需的全部时间

image-20250119222449392

  • 指令周期常常用若干机器周期来表示, 机器周期又叫CPU周期

  • 一个机器周期又包含若干时钟周期(也称为节拍, T周期CPU时钟周期, 它是CPU操作的最基本单位)

image-20250119222454317

  • 示例

    image-20250119222458178

  • 指令周期代码

image-20250119222504329

数据流

  • 指令周期的流程

    image-20250119222509439

取址周期

image-20250119222514927

  • 当前指令地址送至存储器地址寄存器, 记作: (PC) -> MAR

  • CU发出控制信号, 经控制总线传到主存, 这里是读信号, 记作: 1 -> R

  • 将MAR所指主存中的内容经数据总线送入MDR, 记作: M(MAR) -> MDR

  • 将MDR中的内容(此时是指令)送入IR, 记作: (MDR) -> IR

  • CU发出控制信号, 形成下一条指令地址, 记作: (PC) + 1 -> PC

间址周期

image-20250119222519951

  • 将指令的地址码送入MAR, 记作: Ad(IR) -> MAR 或 Ad(MDR) -> MAR

  • CU发出控制信号, 启动主存做读操作, 记作: 1 -> R

  • 将MAR所指主存中的内容经数据总线送入MDR, 记作: M(MAR) -> MDR

  • 将有效地址送至指令的地址码字段, 记作: (MDR) -> Ad(IR) [有的机器有这步]

执行周期

  • 执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果. 不同指令的执行周期操作不同, 因此没有统一的数据流向

中断周期

  • 中断: 暂停当前任务去完成其他任务. 为了能够恢复当前任务, 需要保存断点. 一般使用堆栈来保存断点 , 这里用SP表示栈顶地址, 假设SP指向栈顶元素, 进栈操作是先修改指针, 后存入数据

image-20250119222525572

  • CU控制将SP减1, 修改后的地址送入MAR, 记作: (SP) - 1 -> SP, (SP) -> MAR
  • 本质是将断点存入某个存储单元, 假设其地址为a, 故可记作: a -> MAR

  • CU发出控制信号, 启动主存做写操作, 记作: 1 -> W

  • 将断点(PC内容)送入MDR, 记作: (PC) -> MDR

  • CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC, 记作: 向量地址 -> PC

执行方案

  • 单指令周期

    • 对所有指令都选用相同的执行时间来完成. 指令之间串行执行; 指令周期取决于执行时间最长的指令的执行时间
    • 对于那些本来可以在更短时间内完成的指令, 要使用这个较长的周期来完成, 会降低整个系统的运行速度
  • 多指令周期

    • 对不同类型的指令选用不同的执行步骤来完成. 指令之间串行执行; 可选用不同个数的时钟周期来完成不同指令的执行过程
    • 需要更复杂的硬件设计
  • 流水线方案

    • 在每一个时钟周期启动一条指令, 尽量让多条指令同时运行, 但各自处在不同的执行步骤中. 指令之间并行执行

数据通路

  • 数据通路: 数据在功能部件之间传送的路径

  • 信息从哪里开始, 中间经过哪些部件, 最后传到哪里, 由控制部件产生的控制信号建立数据通路

CPU内部单总线方式

image-20250119222530952

  • 寄存器之间数据传送

    • 比如把PC内容送至MAR, 实现传送操作的流程及控制信号为:
      • (PC) -> Bus PCout有效, PC内容送总线
      • Bus -> MAR MARin有效, 总线内容送MAR
  • 主存与CPU之间的数据传送

    • 比如CPU从主存读取指令, 实现传送操作的流程及控制信号为:
      • (PC) -> Bus -> MAR PCout和MARin有效, 现行指令地址 -> MAR
      • 1 -> R CU发读命令(通过控制总线发出)
      • M(MAR) -> MDR MDRinE有效
      • MDR -> Bus -> IR MDRout和IRin有效, 现行指令 -> IR
  • 执行算术或逻辑运算

    • 比如一条加法指令, 微操作序列及控制信号为
      • Ad(IR) -> Bus -> MAR MDRout(或AdIRout)和MARin有效
      • 1 -> R CU发读命令
      • M(MAR) -> MDR MDRinE有效
      • MDR -> Bus -> Y MDRout和Yin有效, 操作数 -> Y
      • (ACC) + (Y) -> Z ACCout和ALUin有效, CU向ALU发送加命令
      • Z -> ACC Zout和ACCin有效, 结果 -> ACC
  • 示例

    • 取址周期

      image-20250119222538437

    • 间址周期: 注意这里把R0里面存放的数据直接当作了操作数而不是直接地址

      image-20250119222544084

    • 执行周期: 注意这里MAR中已经在上一周期存入了(R0)

      image-20250119222548426

专用数据通路方式

控制器

  • 基本功能

    • 定序
    • 执行

    image-20250119222553309

  • CU发出一个微命令, 可完成对应微操作. 如: 微命令1使得PCout, MARin有效, 完成对应的微操作1(PC) -> MAR

    • 根据指令操作码, 目前的机器周期, 节拍信号, 机器状态条件, 即可确定现在这个节拍下应该发出哪些"微命令"

硬布线控制器

  • 指令越多, 设计和实现就越复杂, 因此一般用于RISC(精简指令集系统)

  • 如果扩充一条新的指令, 则控制器的设计就需要大改, 因此扩充指令较困难

  • 由于使用纯硬件实现控制, 因此执行速度很快. 微操作控制信号由组合逻辑电路即时产生

    image-20250119222558701

  • 示例

    image-20250119222602892

微操作概念

image-20250119222607505

硬布线控制器设计

分析每个阶段的微操作序列(取址, 间址, 执行, 中断 四个阶段)

确定哪些指令在什么阶段, 什么条件下会使用到的微操作

image-20250119222612797

选择CPU的控制方式

采用定长机器周期还是不定长机器周期? 每个机器周期安排几个节拍?

  • 假设采用同步控制方式(定长机器周期), 一个机器周期内安排3个节拍

安排微操作时序

如何用3个节拍完成整个机器周期内的所有微操作

  • 原则

    • 微操作的先后顺序不能随意更改
    • 被控对象不同的微操作, 尽量安排在一个节拍内完成
    • 占用时间较短的微操作, 尽量安排在一个节拍内完成, 并允许有先后顺序
  • 示例

    • 取址周期

      image-20250119222620769

      • M(MAR) -> MDR: 从主存取数据, 用时较长, 因此必须一个时钟周期才能保证微操作的完成

      • MDR -> IR: 是CPU内部寄存器的数据传送, 速度很快, 因此在一个时钟周期内可以紧接地完成OP(IR) -> ID. 也就是可以一次同时发出两个微命令

    • 间址周期

      image-20250119222625494

    • 执行周期

      image-20250119222710041

电路设计

确定每个微操作命令的逻辑表达式, 并用电路实现

  • 列出操作时间表

  • 写出微操作命令的最简表达式

  • 画出逻辑图

微程序控制器

基本结构

image-20250119222716821

  • 控制存储器CM

    • 用于存放各指令对应的微程序, 控制存储器可用只读存储器ROM构成
  • CMAR

    • 微地址寄存器, 接收微地址形成部件送来的微地址, 为在CM中读取微指令做准备
  • 地址译码器

    • 将地址码转化为存储单元控制信号
  • CMDR

    • 用于存放CM中取出的微指令, 它的位数同微指令字长相等
  • 微地址形成部件

    • 产生初始微地址和后继微地址, 以保证微指令的连续执行
  • 顺序逻辑

    • 根据某些机器标志和时序信息确定下一条微指令的存放地址

工作原理

image-20250119222723562

image-20250119222728399

微指令的设计

微程序控制单元设计

指令流水线

基本概念

  • 指令执行过程划分为不同阶段, 占用不同的资源, 就能使多条指令同时执行

    image-20250119222733289

性能指标

  • 吞吐率: 单位时间内流水线所完成的任务数量, 或是输出结果的数量

    image-20250119222738489

  • 加速比: 完成同一批任务, 不使用流水线所用的时间与使用流水线所用的时间的比

    image-20250119222742779

  • 效率: 流水线的设备的利用率

    image-20250119222800072

影响因素 / 冒险

  • 五段式流水线

    image-20250119222806289

结构相关(资源冲突)

  • 由于多条指令在同一时刻争用同一资源而形成的冲突称为结构相关

image-20250119222812095

  • 解决办法

    • 后一相关指令暂停一周期

      image-20250119222817638

    • 资源重复配置

      • 数据存储器 + 指令存储器

        image-20250119222823304

    • 同一存储器提供分时处理

      image-20250119222829892

数据相关(数据冲突)

  • 在一个程序中, 存在必须等前一条指令执行完才能执行后一条指令的情况

image-20250119222835676

  • 解决办法

    • 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期, 直到数据相关问题消失后在继续执行. 可分为**硬件阻塞(stall)软件插入(NOP)**两种方法

      image-20250119222841902

      效率低下, 流水线失去意义

      image-20250119222847945

      如果计算机的结构发生了变化, 需要更新软件

    • 数据旁路技术: ALU的输出会被送回ALU的输入, 即遇到数据相关的指令后不需要等上一条指令结果存入寄存器后再取出, 而是直接从ALU的输出中取出 (一条指令需要使用之前指令的访存结果)

    image-20250119222857837

    • 编译优化: 通过编译器调整指令顺序来解决数据相关 (交换指令顺序)

      image-20250119222902654

控制相关(控制冲突)

  • 当流水线遇到转移指令和其他改变PC值的指令而造成断流时, 会引起控制相关

image-20250119222908242

  • 解决办法

    • 转移指令分支预测: 简单预测(永远猜true或false), 动态预测(根据历史情况动态调整)

    • 预取转移成功和不成功两个控制流方向上的目标指令

    • 加快和提前形成条件码

      image-20250119222912344

    • 提高转移方向的猜准率

分类

  • 部件功能级流水线, 处理机级流水线, 处理机间级流水线

  • 单功能流水线, 多功能流水线

  • 动态流水线, 静态流水线

  • 线性流水线, 非线性流水线

多发技术

超标量技术

  • image-20250119222919352同一时刻, 发出多条

  • 每个时钟周期内可并发多条独立指令要配置多个功能部件

  • 不能调整指令的执行顺序

  • 通过编译优化技术, 把可并行执行的指令搭配起来

超流水技术

image-20250119222925090

  • 一个时钟周期再分段

  • 在一个时钟周期内一个功能部件使用多次

  • 不能调整指令的执行顺序

  • 靠编译程序解决优化问题

超长指令字

六段式流水线

image-20250119222931243