计组笔记 P03:中央处理器

1. CPU 的功能和基本结构

CPU 的功能

  • 指令控制:完成取指令、分析指令、执行指令的操作,即程序的顺序控制。
  • 操作控制:CPU 管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
  • 时间控制:对各种操作加以时间上的控制。
  • 数据加工:对数据进行算术和逻辑运算。
  • 中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理。中断主要指 I/O 中断和硬件故障,而溢出、系统调用等输出异常。

CPU 的基本结构

  • CPU 中包含运算器和控制器,核心部件就是算术逻辑单元 ALU 和控制单元 CU。
    • 运算器中至少包含运算逻辑单元 ALU 和累加器寄存器 ACC、乘商寄存器 MQ、操作数寄存器 X;
    • 控制器中至少包含控制单元 CU 和程序计数器 PC、指令寄存器 IR;
    • 为实现对主存的存取有两个寄存器 MAR 和 MDR。
运算器

包括算术逻辑单元 ALU、暂存寄存器、累加寄存器 ACC、通用寄存器组、程序状态字寄存器 PSW、移位器、计数器 CT 等。

  • ALU:进行算术、逻辑计算。
  • 暂存寄存器:用于暂存从主存读来的数据,此数据不能放在通用寄存器中,否则会破坏其原有的内容。暂存寄存器对程序员透明。
  • ACC:暂时存放 ALU 的计算结果,也可以作为加法运算的输入端。
  • 通用寄存器组:用于存放操作数和各种地址信息。
  • 程序状态字寄存器 PSW:存放由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志 OP、符号标志 SF、零标志 ZF、进位标志 CF 等。
  • 移位器:对操作数或运算结果进行移位运算。
  • 计数器:控制乘除法运算的操作步骤。
控制器

控制器的基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。控制器有硬布线控制器和微程序控制器两种类型。

包括程序计数器 PC、指令寄存器 IR、指令译码器、存储器地址寄存器 MAR、存储器数据寄存器 MDR、时序系统和微操作信号发生器等。

  • PC:指出下一条指令在主存中的存放地址,CPU 根据 PC 中的内容去主存中取指令。PC 有自增的功能。
  • IR:存放当前正在执行的那条指令。
  • 指令译码器:对操作码字段进行译码,向控制器提供特定的操作信号。
  • MAR\MDR:存放访存的地址和数据。
  • 时序系统:产生各种时序信号,它们都是由统一时钟分频得到。
  • 微操作信号发生器:产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。

2. 指令执行过程

指令周期

一个指令周期常常包含多个机器周期,一个机器周期又包含若干时钟周期。每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。

完整的指令周期包括取指周期、间址周期、执行周期、中断周期。4 个周期中都有 CPU 访存,取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。

为了区别不同的工作周期,CPU 中内置了 4 个标志触发器 FE、IND、EX 和 INT,分别对应取指、间址、执行和中断周期,以“1”表示有效。

数据流

取指周期

取指周期的任务是根据 PC 中的内容(地址),从主存中取出指令代码并存入 IR,同时 PC 加 1。数据流如下,

  1. PC 中的地址:PC\(\rightarrow\)MAR\(\rightarrow\)地址总线\(\rightarrow\)主存;
  2. CU 发出读命令\(\rightarrow\)控制总线\(\rightarrow\)主存;
  3. 指令存入 IR:主存\(\rightarrow\)数据总线\(\rightarrow\)MDR\(\rightarrow\)IR;
  4. PC 加 1:CU 发出读命令\(\rightarrow\)PC 内容加 1。
间址周期

间址周期的任务取操作数有效地址。以一次间址为例,数据流如下,

  1. Ad(IR)(取出 IR 中存放的指令字的地址字段)\(\rightarrow\)MAR\(\rightarrow\)地址总线\(\rightarrow\)主存;
  2. CU 发出读命令\(\rightarrow\)控制总线\(\rightarrow\)主存;
  3. 有效地址存入 MDR:主存\(\rightarrow\)数据总线\(\rightarrow\)MDR。
执行周期

执行周期的任务是根据 IR 中的指令字的操作码和操作数,通过 ALU 操作产生执行结果。没有固定的数据流。

中断周期

中断周期的任务是处理中断请求。以程序断点存入堆栈为例,数据流如下,

  1. CU 控制 SP 减 1,SP\(\rightarrow\)MAR\(\rightarrow\)地址总线\(\rightarrow\)主存;
  2. CU 发出写命令\(\rightarrow\)控制总线\(\rightarrow\)主存;
  3. 将程序断点存入主存堆栈:PC\(\rightarrow\)MDR\(\rightarrow\)数据总线\(\rightarrow\)主存;
  4. 将中断服务程序的入口地址存入 PC:CU(中断服务程序的入口地址)\(\rightarrow\)PC。

指令执行方案

  1. 单指令周期。对所有的指令都选用相同数量的时钟周期来完成,指令之间串行。因此指令周期等于执行时间最长的指令的执行时间,其它指令也使用此指令周期,整个系统的运行速度降低。
  2. 多指令周期。对不同类型的指令选用不同的指令周期,指令之间串行。这样不会浪费时钟周期,但是结构比单指令周期的复杂。
  3. 流水线方案。指令之间并行执行,但各自在不同的执行步骤中。

3. 数据通路

数据通路的功能

运算器和各寄存器之间的传送路径就是中央处理器内部数据通路。数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都要加以控制。数据通路的功能是实现 CPU 内部的运算器和寄存器以及寄存器之间的数据交换。

数据通路的基本结构

数据通路的基本结构主要有两种:CPU 内部单总线方式、CPU 内部三总线方式。

  • CPU 内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上,这种结构比较简单,但数据传输存在较多的冲突现象,性能较低。
  • CPU 内部三总线方式:同时在多个总线上传送不同的数据,提高效率。

上述两种方式很难在流水线上实现。可采用专用数据通路方式,根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能高,但硬件量大。

数据通路上的数据流举例:

  • 寄存器之间数据传送,以将 PC 中的内容送至 MAR 为例,
    1. PC\(\rightarrow\)Bus,PCout 有效,PC 的内容送至总线;
    2. Bus\(\rightarrow\)MAR,MARin 有效,总线内容送至 MAR。
  • 主存与 CPU 之间的数据传送,
    1. PC\(\rightarrow\)Bus\(\rightarrow\)MAR,PCout 和 MARin 有效;
    2. 1\(\rightarrow\)R,CU 发出读命令;
    3. MEM(MAR)\(\rightarrow\)MDR,MDRin 有效,主存内容读入 MDR;
    4. MDR\(\rightarrow\)Bus\(\rightarrow\)IR,MDRout 和 IRin 有效,指令存入 IR。
  • 执行算术或逻辑运算,以加法运算为例,
    1. Ad(IR)\(\rightarrow\)Bus\(\rightarrow\)MAR,MDRout 和 MARin 有效,获取有效地址;
    2. 1\(\rightarrow\)R,CU 发出读命令;
    3. MEM(MAR)\(\rightarrow\)MDR,MDRin 有效,操作数存入 MDR;
    4. MDR\(\rightarrow\)Bus\(\rightarrow\)Y,MDRout 和 Yin 有效,操作数存入寄存器 Y;
    5. (ACC)+(Y)\(\rightarrow\)Z,ACCout 和 ALUin 有效,结果存入寄存器 Z;
    6. Z\(\rightarrow\)ACC,Zout 和 ACCin 有效,结果存入 ACC。

4. 运算器 ALU

ALU 是组合逻辑电路,进行多种算术运算和逻辑运算。加减乘除都可以归结为加法运算。

使用逻辑电路实现二进制加法:以求一位二进制相加为例,

  • 半加器:加和 \(= A \ \ \mathrm{XOR} \ \ B\),进位 \(= A \ \ \mathrm{AND} \ \ B\)
  • 全加器:加和\(= A \ \ \mathrm{XOR} \ \ B \ \mathrm{XOR} \ \ C_{in}\),进位\(C_{out}= A \ \ \mathrm{AND} \ \ B + (A \ \ \mathrm{XOR} \ \ B) \ \ \mathrm{AND} \ \ C_{in}\)

多位的加法器分为串行加法器、并行加法器。

  • 串行加法器只有一个全加器,数据逐位串行送入加法器中进行计算,速度非常慢。
  • 并行加法器有多个全加器,同时对多位数据进行计算。将传递进位信号的逻辑线路连接起来构成的进位网络称为进位链,有串行进位和并行进位之分,
    • 串行进位,又称为行波进位,将\(n\)个全加器串接起来使用,进行两个\(n\)位数的相加,进位信号是逐级形成的,因此\(n\)越大进位时间越长。
    • 并行进位,各级进位信号是同时形成的,每一位的逻辑实现不同,硬件构造也不同,硬件设计会很复杂。
    • 分组并行进位,将\(n\)位全加器分成若干个小组,小组内的各位之间并行进位,小组间可并行也可串行。有两种情况:单重分组时组内并行、组件串行,双重分组时组内并行、小组间并行、大组间串行。

对于乘除法,有阵列乘法器、阵列除法器提高运算速度。

5. 控制器 CU

控制器的功能

  • 从主存中取指令,并指出下一条指令在主存中的位置。
  • 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。
  • 指挥并控制 CPU、主存、输入和输出设备之间的数据流动方向。

控制器可分为硬布线控制器和微程序控制器,两类控制器中的 PC 和 IR 是相同的,但确定和表示指令执行步骤的方法,以及给出控制个部件运行所需要的控制信号的方案是不同的。

  • 硬布线控制器:将所有微指令所需的原件连接起来,以硬件来实现指令的控制。

  • 微程序控制器:以程序的方式实现微指令。

6. 指令流水线

将一个指令周期分成 5 个步骤:取指令、读寄存器、ALU 运算、访存、写回寄存器,以流水线的方式执行指令。因此须在流水线的级之间添加寄存器。

流水线冒险

  • 结构冒险:因缺乏硬件支持而导致的问题。如同一时刻两条指令对同一寄存器操作。结构冒险需要在设计流水线时避免。
  • 数据冒险:没有及时对寄存器的数据更新导致的问题。如当前指令所读寄存器正是上一条指令需要写回的寄存器,数据没有得到更新。避免数据冒险的方法可以在原有数据通路上增加旁路(ALU 运算得到结果后就给下一条指令使用,不等到写回阶段),或者在指令间增加空指令。
  • 控制冒险:因程序分支时没有进行判断就进入某个分支导致的问题。避免数据冒险的方法可以在遇到分支指令时阻塞流水线,或者对分支进行预测,预测失败后回退。
posted @ 2020-07-29 23:09  ixtwuko  阅读(587)  评论(0编辑  收藏  举报