# CPU 的功能与基本结构

# CPU 的功能

  • 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制
  • 操作控制。一条指令的功能往往是由若干操作信号的组合来实现的,CPU 管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作
  • 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
  • 数据加工。对数据进行算数和逻辑运算
  • 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理

# 运算器与控制器的功能

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

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

    • 取指令:自动形成指令地址,自动发出取指令的命令

    • 分析指令:操作码译码 (分析本条指令要完成什么操作);产生操作数的有效地址

    • 执行指令:根据分析指令得到的 "操作命令" 和 "操作数地址",形成操作信号控制序列,控制运算器、存储器以及 I/O 设备完成相应的操作

    • 中断处理:管理总线及输入输出;处理异常情况 (如掉线) 和特殊请求 (如打印机请求打印一行字符)

# 运算器的基本结构

  • 算数逻辑单元:主要功能是进行算术 / 逻辑运算
  • 通用寄存器组:如 AX,BX,CX,DX,SP 等,用于存放操作数 (包括源操作数、目的操作数及中间结果) 和各种地址信息等。SP 是堆栈指针,用于指示栈顶的地址
  • 暂存寄存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有数据
    • 如:两个操作数分别来自主存和 R0,最后结果存回 R0,那么从主存中取来的操作数直接放入暂存器,就不会破坏运算前 R0 的内容
  • 累加寄存器:它是一个通用寄存器,用于暂时存放 ALU 运算的结果信息,用于实现加法运算
  • 程序状态字寄存器:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志 (OP)、符号标志 (SF)、零标志 (ZF)、进位标志 (CF) 等。PSW 中的这些位参与并决定微操作的形成
  • 移位器:对运算结果进行移位运算
  • 计数器:控制乘除运算的操作步数

专用数据通路方式:根据指令过程中的数据和地址的流动方向安排连接线路

  • 如果直接用导线连接,相当于多个寄存器同时并且一直向 ALU 传输数据

  • 解决方法:

    • 使用多路选择器根据控制信号选择一路输出

    • 用三态门可以控制每一路是否输出

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

CPU 内部单总线:将所有寄存器的输入端与输出端都连接到一条公共的通路上

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

# 控制器的基本结构

  • 程序计数器 PC:用于指出下一条指令在主存中的存放地址。CPU 就是根据 PC 的内容去主存中取指令的。因程序中指令 (通常) 是顺序执行的,所以 PC 有自增功能
  • 指令寄存器 IR:用于保存当前正在执行的那条指令
  • 指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号
  • 微操作信号发生器:根据 IR 的内容 (指令)、PSW 的内容 (状态信息) 及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构由组合逻辑型和存储逻辑型两种
  • 时序系统:用于产生各种时序信号,它们都是由统一时钟 (CLOCK) 分频得到
  • 存储器地址寄存器 MAR:用于存放所要访问的主存单元的地址
  • 存储器数据寄存器 MDR:用于存放向主存写入的信息或从主存中读出的信息

用户可见寄存器:通用寄存器、程序状态字寄存器 PSW、程序计数器 PC

用户不可见寄存器:MAR、MDR、IR、暂存寄存器

# 指令周期的数据流

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

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

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

指令周期

周期之间关系

每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等

  • 空指令:指令周期 = 取址周期
  • 加法指令 ADD:指令周期 = 取址周期 + 执行周期
  • 乘法指令 MUL:指令周期 = 取址周期 + 执行周期 (更长)
  • 具有间接寻址的指令:指令周期 = 取址周期 + 间址周期 + 执行周期
  • 带有中断周期的指令:指令周期 = 取址周期 + 间址周期 + 执行周期 + 中断周期

取址周期、间址周期、执行周期、中断周期都有 CPU 访存操作,只是访问的目的不同。

取址周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点

# 取指周期数据流

  • 当前指令地址送至存储器地址寄存器,记作:(PC)->MAR
  • CU 发出控制信号,经控制总线传到主存,这里是读信号,记作:1->R
  • 将 MAR 所指主存中的内容经数据总线送入 MDR,记作:M (MAR)->MDR
  • CU 发出控制信号,形成下一条指令地址,记作:(PC)+1->PC

# 间指周期数据流

  • 将指令的地址码送入 MAR,记作:Ad (IR)->MAR 或 Ad (MDR)->MAR
  • CU 发出控制信号,启动主存做读操作,记作:1->R
  • 将 MAR 所指主存中的内容经数据总线送入 MDR,记作:M (MAR)->MDR
  • 将有效地址送至指令的地址码字段,记作:(MDR)->Ad (IR)

# 执行周期数据流

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

# 中断周期数据流

中断:暂停当前任务去完成其他任务

为了能恢复当前任务,需要保存断点。一般使用堆栈来保存断点,这里用 SP 表示栈顶地址,假设 SP 指向栈顶元素,进栈操作是先修改指针,后存入数据。

  • CU 控制将 SP 减 1,修改后的地址送入 MAR,记作:(SP)-1->SP,(SP)->MAR。本质上是将断点存入某个存储单元,假设其地址为 a,故可记作:a->MAR
  • CU 发出控制信号,启动主存做写操作,记作:1->W
  • 将断点 (PC 内容) 送入 MDR,记作:(PC)->MDR
  • CU 控制将中断服务程序的入口地址 (由向量地址形成部件产生) 送入 PC,记作:向量地址 ->PC

# 指令执行方案

一个指令周期通常要包括几个时间段 (执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能

  • 单指令周期

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

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

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