第九章 控制单元的功能
在前面的章节中,ALU和CPU都已经介绍过了,第九章开始介绍CU。
9.1 操作命令的分析
完成一条指令分 4 个工作周期:取指周期、间址周期、执行周期、中断周期。
为了便于讨论,假设 CPU内有4个寄存器。
MAR与地址总线相连,存放欲访问的存储单元地址;
MDR 与数据总线相连,存放欲写入存储器的信息或最近从存储器中读出的信息;
PC存放现行指令的地址,有计数功能;
IR存放现行指令。
9.1.1 取指周期
取指令的过程可归纳为以几个操作。
① 现行指令地址送至存储器地址寄存器,记作PC→MAR
② 向主存发送读命令,启动主存做读操作,记作1→R
③ 将MAR (通过地址总线) 所指的主存单元中的内容 (指令) 经数据总线读至MDR内,记作M(MAR)→MDR
④ 将MDR的内容送至IR,记作 MDR→IR
⑤ 指令的操作码送至CU译码,记作 OP(IR)→CU
⑥ 形成下一条指令的地址,记作(PC)+1→PC
9.1.2 间址周期
间址周期完成取操作数有效地址的任务,具体操作如下。
① 将指令的地址码部分 (形式地址) 送至存储器地址寄存器,记作Ad(IR)→MAR
② 向主存发送读命令,启动主存做读操作,记作1→R
③ 将MAR (通过地址总线) 所指的主存单元中的内容 (有效地址) 经数据总线读至MDR内,记作M(MAR)→MDR
④ 将有效地址送至指令寄存器的地址字段,记MDR→Ad(IR)。此操作在有些机器中可省略
9.1.3 执行周期
不同指令执行周期的微操作是不同的,下面分别讨论非访存指令、访存指令和转移类指令的微操作。
1. 非访存指令
这类指令在执行周期不访问存储器。
(1) 清除累加器指令 CLA
该指令在执行阶段只完成清除累加器操作,记作0→ACC
(2) 累加器取反指令 COM
该指令在执行阶段只完成累加器内容取反,结果送累加器的操作,记
A
C
C
‾
\overline{ACC}
ACC→ACC
(3) 算术右移一位指令 SHR
该指令在执行阶段只完成累加器内容算术右移一位的操作,记作 L(ACC)→R( ACC) (表示左边的内容送到右边去),ACC
0
_{0}
0→ACC
0
_{0}
0 (ACC的符号位不变)
(4) 循环左移一位指令 CSL
该指令在执行阶段只完成累加器内容循环左移一位的操作,记作R(ACC)→L(ACC),ACC
0
_{0}
0→ACC
n
_{n}
n(或
ρ
−
1
\rho ^{-1}
ρ−1(ACC))
(5) 停机指令 STP
计算机中有一个运行标志触发器G,当G=1时,表示机器运行;当G=0时,表示停机。STP指令在执行阶段只需将运行标志触发器置 “0”,记作0→G。
2. 访存指令
这类指令在执行阶段都需要访问存储器。为简单起见,这里只考虑直接寻址的情况,不考虑其他寻址方式。
(1) 加法指令 ADD X
该指令在执行阶段需要完成累加器内容与对应于主存X地址单元的内容相加,结果送累加器的操作,具体如下:
① 将指令的地址码部分送至存储器地址寄存器,记作Ad(IR)→MAR
② 向主存发读命令,启动主存做读操作,记作1一R
③ 将MAR (通过地址总线) 所指的主存单元中的内容 (操作数) 经数据总线读至MDR内,记作M(MAR)→MDR
④ 给 ALU发送加命令,将ACC的内容和MDR的内容相加,结果存于ACC,记作(ACC) +(MDR)→ACC。
当然,也有的加法指令指定两个寄存器的内容相加,如 “ADD AX, BX”,该指令在执行阶段无须访存,只需完成 (AX)+(BX)→AX的操作。
(2) 存数指令 STA X
该指令在执行阶段需将累加器ACC的内容存于主存的X地址单元中,具体操作如下:
① 将指令的地址码部分送至存储器地址寄存器,记作 Ad(IR )→MAR
② 向主存发写命令,启动主存做写操作,记作1→W
③ 将累加器内容送至MDR,记作ACC→MDR
④ 将MDR的内容 (通过数据总线) 写入MAR (通过地址总线) 所指的主存单元中,记作MDR→M(MAR)
(3) 取数指令 LDA X
该指令在执行阶段需将主存X地址单元的内容取至累加器ACC 中,具体操作如下:
① 将指令的地址码部分送至存储器地址寄存器,记作Ad(IR)→MAR
② 向主存发读命令,启动主存作读操作,记作1→R
③ 将MAR (通过地址总线) 所指的主存单元中的内容 (操作数) 经数据总线读至MDR内,记作M(MAR)→MDR
④ 将MDR的内容送至ACC,记作 MDR→ACC
3. 转移类指令
这类指令在执行阶段也不访问存储器。
(1) 无条件转移指令 JMP X
该指令在执行阶段完成将指令的地址码部分X送至PC的操作,记作 Ad(IR)→PC
(2) 条件转移 (负则转) 指令 BAN X
该指令根据上一条指令运行的结果 (被存在ACC里) 决定下一条指令的地址,若结果为负 (累加器最高位为1,即A
0
_{0}
0=1,若结果不为负则A
0
_{0}
0=0),则指令的地址码送至PC,否则程序按原顺序执行。由于在取指阶段已完成了(PC)+1→PC,所以当累加器结果不为负 (即A
0
_{0}
0=0) 时,就按取指阶段形成的 PC执行,记作
A
0
⋅
A
d
(
I
R
)
+
A
0
‾
⋅
(
P
C
)
→
P
C
A_{0}·Ad(IR)+\overline{A_{0}}·(PC)→PC
A0⋅Ad(IR)+A0⋅(PC)→PC。(为什么不是PC+1?因为取指阶段PC已经+1了)
4. 三类指令的指令周期
由此可见,不同指令在执行阶段所完成的操作是不同的。如果将访存指令分为直接访存和间接访存两种,则上述三类指令的指令周期如下图所示。
9.1.4 中断周期
在执行周期结束时刻,CPU要查询是否有请求中断的事件发生,如果有则进人中断周期。在中断周期,由中断隐指令自动完成保护断点、寻找中断服务程序人口地址以及硬件关中断的操作。假设程序断点存至主存的0地址单元,且采用硬件向量法寻找人口地址,则在中断周期需完成如下操作:
① 将特定地址 “0” 送至存储器地址寄存器,记作0→MAR
② 向主存发写命令,启动存储器作写操作,记作1→W
③ 将PC的内容 (程序断点) 送至MDR,记作PC→MDR
④ 将MDR的内容 (程序断点) 通过数据总线写人MAR (通过地址总线) 所指示的主存单元 (0地址单元) 中,记作MDR→M( MAR)
⑤ 将向量地址形成部件的输出送至PC,记作向量地址→PC,为下一条指令的取指周期做准备
⑥ 关中断,将允许中断触发器清零,作0→EINT (该操作可直接由硬件线路完成)
如果程序断点存入堆栈,而且进栈操作是先修改栈指针,后存入数据,只需将上述①改为(SP)-1→SP,且 SP→MAR。
上述所有操作都是在控制单元发出的控制信号 (即微操作命令) 控制下完成的。
9.2 控制单元的功能
9.2.1 控制单元的外特性
1. 输入信号
(1) 时钟
为了使控制单元按一定的先后顺序、一定的节奏发出各个控制信号,控制单元必须受时钟控制,即每一个时脉冲使控制单元发送个操作命令,或发送一组需要同时执行的操作命令。
(2) 指令寄存器
现行指令的操作码决定了不同指令在执行周期所需完成的不同操作,故指令的操作码字段是控制单元的输入信号,它与时钟配合可产生不同的控制信号。
(3) 标志
控制单元有时需依赖CPU当前所处的状态 (如 ALU操作的结果) 产生控制信号,如BAN 指令,控制单元要根据上条指令的结果是否为负而产生不同的控制信号。因此 “标志” 也是控制单元的输入信号。
(4) 外来信号
例如,INTR 中断请求、HRQ 总线请求、DMA 请求。
2. 输出信号
(1) CPU内的控制信号
主要用于CPU内的寄存器之间的传送和控制ALU实现不同的操作。例如:
① Ri→Rj
② (PC)+1→PC
③ ALU的 +、-、与、或
(2) 送至系统总线 (控制总线) 的信号
例如:
上图画一横表示低电平有效。
9.2.2 控制信号举例
控制单元的主要功能就是能发出各种不同的控制信号。
前面已经给出了不同周期的具体过程,实际上在执行每一步操作时,都有控制信号在背后控制着,下面以间接寻址的加法指令 “ADD @X” 为例,进一步理解控制信号在完成一条指令的过程中所起的作用。
1. 不采用 CPU 内部总线的方式
下面几张图示意了未采用CPU内部总线方式,而采用专门通路的数据通路和控制信号的关系。
图中未画出每个寄存器的输人或输出控制门,但标出了控制这些门电路的控制信号C
i
_i
i,考虑到从存储器取出的指令或有效地址都先送至MDR再送至IR,故这里省去了IR送至MAR的数据通路,凡是需要从IR送至MAR的操作均可由MDR送至MAR代替。
(1) 取指周期
① 控制信号C
0
_0
0有效,打开PC送往MAR的控制门
② 控制信号C
1
_1
1有效,打开MAR 送往地址总线的输出门
③ 通过控制总线向主存发读命令
④ C
2
_2
2有效,打开数据总线送至MDR的输人门
⑤ C
3
_3
3有效,打开 MDR和IR之间的控制门,至此指令送至IR
⑥ C
4
_4
4有效,打开指令操作码送至CU的输出门,CU在操作码和时钟的控制下可产生各种控制信号。
⑦ 使PC内容加1 (图中未标出)
(2) 间址周期
① C
5
_5
5有效,打开 MDR 和 MAR之间的控制门,将指令的形式地址送至MAR
② C
1
_1
1有效,打开 MAR送往地址总线的输出门
③ 通过控制总线向主存发读命令
④ C
2
_2
2有效,打开数据总线送至MDR的输人门,至此,有效地址存入MDR
⑤ C
3
_3
3有效,打开 MDR和IR之间的控制门,将有效地址送至IR的地址码字段
(3) 执行周期
① C
5
_5
5有效,打开 MDR和 MAR之间的控制门,将有效地址送至MAR
② C
1
_1
1有效,打开MAR送往地址总线的输出门
③ 通过控制总线向主存发读命令
④ C
2
_2
2有效,打开数据总线送至MDR的输入门,至此,操作数存入MDR
⑤ C
6
_6
6、C
7
_7
7同时有效,打开 AC和 MDR通往ALU的控制门
⑤ 通过 CPU内部控制总线对ALU 发 “ADD” 加控制信号,完成AC的内容和 MDR 的内容相加
⑥ C
8
_8
8有效,打开ALU通往AC的控制门,至此将求和结果存入AC
2. 采用 CPU 内部总线方式
下面几个图示意了采用CPU内部总线方式的数据通路和控制信号的关系,图中每一个小圈处都有一个控制信号,它控制寄存器到总线或总线到寄存器之间的传送。
例如,IR
i
_i
i表示控制从内部总线到指令寄存器的输入控制门;PC
o
_o
o表示控制从程序计数器到内部总线的输出控制门。下标为i表示输入控制,下标为o表示输出控制,以此类推。
与不采用总线的图相比,下面几个图多了两个寄存器Y和Z,主要是由于两个原因:
一是由于访问总线是独占的,不能有两个部件同时访问总线,那么当CPU内有多个通用寄存器时,想实现任意两个寄存器之间的算逻运算,是不能同时让两个寄存器访问总线的,必须先把一个寄存器的数据存在Y中,另一个寄存器访问总线,才能实现功能。
二是由于ALU是一个组合逻辑电路,输入的同时就会产生输出,那么在其运算过程中就必须保持两个输入端不变,否则如果某个输入端变了,输出端也会瞬间就变。ALU其中一个输人可以从Y寄存器中获得,另一个输入可以从内部总线上获得。因此ALU 的输出不能直接与内部总线相连,因为其输出又会通过总线反馈到ALU的输人,影响运算的正确性,故用寄存器Z暂存运算结果,再根据需要送至指定的目标。
下面仍以完成间接寻址的加法指令 “ADD @X” 为例,分析控制单元发出的控制信号。
(1) 取指周期
① PC
o
_o
o和 MAR
i
_i
i有效,完成PC经内部总线送至MAR的操作,即 PC→MAR
② 通过控制总线 (图中未画出) 向主存发读命令,即1→R
③ 存储器通过数据总线将MAR所指单元的内容 (指令) 送至 MDR
④ MDR
o
_o
o和IR
i
_i
i有效,将 MDR的内容送至IR,即 MDR→IR,至此,指令送至IR,其操作码字段开始控制CU
⑤ 使PC内容加1 (图中未标出)
(2) 间址周期
① MDR
o
_o
o和MAR
i
_i
i有效,将指令的形式地址经内部总线送至MAR,即 MDR→MAR
② 通过控制总线向主存发读命令,即 1→R
③ 存储器通过数据总线将MAR所指单元的内容 (有效地址) 送至MDR
④ MDR
o
_o
o和IR
i
_i
i有效,将MDR中的有效地址送至IR的地址码字段,即 MDR→Ad(IR)
(3) 执行周期
① MDR
o
_o
o和MAR
i
_i
i有效,将有效地址经内部总线送至MAR,即 MDR→MAR
② 通过控制总线向主存发读命令,即1→R
③ 存储器通过数据总线将MAR所指单元的内容 (操作数) 送至MDR
④ MDR
o
_o
o和Y
i
_i
i有效,将操作数送至Y,即 MDR→Y
⑤ AC
o
_o
o和ALU
i
_i
i有效,同时CU向ALU发 “ADD” 加控制信号,使AC的内容和Y的内容相加 (Y的内容送至ALU不必通过总线),结果送寄存器Z,即 (AC)+(Y)→Z
⑥ Z
o
_o
o和AC
i
_i
i有效,将运算结果存入AC,即 Z→AC
现代计算机的CPU都集成在一个硅片内,在芯片内采用内部总线的方式可大大节省芯片内部寄存器之间的连线,使芯片内各部件布局更合理。
但是CPU内部总线并不一定好,因为总线可能会成为系统的瓶颈;为了解决总线瓶颈,可以增加总线的话,然而这样会占用更多资源。专用通路实际上也会占用很多的资源,没有办法说专用通路和CPU内部总线哪个更好。
9.2.3 多级时序系统
1. 指令周期:
CPU每取出 一条指令并执行这条指令,都要完成一系列的操作,这一系列操作所需要的时间通常叫做一个指令周期。换言之,指令周期是取出一条指令并执行这条指令的时间。由于各条指令的操作功能不同,因此各种指令的指令周期是不尽相同的。例如一条加法指令的指令周期同一条乘法指令的指令周期是不相同的 。
2. 机器周期
机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段 (如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。
(1) 机器周期的概念
机器周期可看作所有指令执行过程中的一个基准时间,机器周期取决于指令的功能及器件的速度。
(2) 确定机器周期需考虑的因素
确定机器周期时,通常要分析机器指令的执行步骤及每一步骤所需的时间。例如,取数、存数指令能反映存储器的速度及其与CPU的配合情况;加法指令能反映ALU的速度;条件转移指令因为要根据上一条指令的执行结果,经测试后才能决定是否转移,所需的时间较长。
(3) 基准时间的确定
通过对机器指令执行步骤的分析,会找到一个基准时间,在这个基准时间内,所有指令的操作都能结束。若以这个基准时间定为机器周期,显然不是最合理的。因为只有以完成复杂指令功能所需的时间 (最长时间) 作为基准,才能保证所有指令在此时间内完成全部操作,这对简单指令来说,显然是一种浪费。
进一步分析发现,机器内的各种操作大致可归属为对CPU内部的操作和对主存的操作两大类,由于CPU内部的操作速度较快,CPU访存的操作时间较长,因此通常以访问一次存储器的时间定为基准时间较为合理,这个基准时间就是机器周期。又由于不论执行什么指令,都需要访问存储器取出指令,因此在存储字长等于指令字长的前提下,取指周期也可看作机器周期。
3. 时钟周期 (节拍、状态)
一个机器周期内可完成若干个微操作 (就是前面的C
i
_i
i,例如 M(MAR)→MAR),每个微操作需一定的时间,可用时钟信号来控制产生每一个微操作命令,即将一个机器周期分成若干个时间相等的时间段,将这个时间段称为节拍、状态、时钟周期。
时钟信号可由机器主振电路 (如晶体振荡器)发出的脉冲信号经整形 (或倍频、分频) 后产生,时钟信号的频率即为CPU主频。用时钟信号控制节拍发生器就可产生节拍。每个节拍的宽度正好对应一个时钟周期。在每个节拍内机器可完成一个或几个需同时执行的操作,它是控制计算机操作的最小时间单位。
4. 多级时序系统
一个指令周期包含若干个机器周期,一个机器周期又包含若干个时钟周期 (节拍),每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。
下图分别展示了定长机器周期和不定长机器周期。其中,定长的机器周期: 每个机器周期包含4个节拍 (4个T);不定长的机器周期: 每个机器周期包含的节拍数可以为4个,也可以为3个。后者适合于操作比较简单的指令,它可跳过某些时钟周期 (如T3),从而缩短指令周期。
机器周期、节拍 (状态) 组成了多级时序系统。
5. 机器速度与机器主频的关系
机器速度可以用 MIPS (执行百万条指令数每秒) 和 CPI (执行一条指令所需的时钟周期数) 来衡量。
一般来说,CPU的主频越快,机器的运行速度也越快。在机器周期所含时钟周期数相同的前提下,两机平均指令执行速度之比等于两机主频之比。
• 时钟周期 = 1 / 主频
• 指令周期=时钟周期 × 每个机器周期所含时钟周期数 × 每个指令周期所含机器周期数
• 平均指令速度 (MIPS) = 1 / 指令周期
• 即平均指令速度与主频成正比
例如,CPU的主频为8 MHz,其平均指令执行速度为0.8 MIPS。若想得到平均指令执行速度为0.4 MIPS的机器,则只需要用主频为 (8 MHz / 0.8 MIPS) × 0.4MIPS = 4MHz 的CPU即可。
实际上机器的速度不仅与主频有关,还与机器周期中所含的时钟周期数以及指令周期中所含的机器周期数有关。同样主频的机器,由于机器周期所含时钟周期数不同,运行速度也不同。机器周期所含时钟周期数少的机器,速度更快 (因为 平均指令速度MIPS 与 每个机器周期所含时钟周期数 成反比)。
此外,机器的运行速度还和其他很多因素有关,如主存的运行速度、机器是否配有Cache、总线的数据传输率、硬盘的运行速度以及机器是否采用流水技术等。
9.2.4 控制方式
控制单元控制一条指令执行的过程实质上是依次执行一个确定的微操作序列的过程 (指令可分为很多阶段,每个阶段又对应许多微操作)。由于不同指令所对应的微操作数及其复杂程度不同,因此每条指令和每个微操作所需的执行时间也不同。通常将如何形成控制不同微操作序列所采用的时序控制方式称为CU的控制方式。常见的控制方式有同步控制、异步控制、联合控制和人工控制四种。
1. 同步控制方式
同步控制方式是指,任何一条指令或指令中任何一个微操作的执行都是事先确定的,并且都是受统一基准时标的时序信号所控制的方式。
(1) 采用定长的机器周期
以最长的微操作序列和最复杂的微操作作为标准,每个机器周期内的节拍数相同 (例如下图,每个机器周期都是4个节拍)。
(2) 采用不定长的机器周期
每个机器周期内的节拍数可以不等。这种控制方式可解决微操作执行时间不统一的问题。通常把大多数微操作安排在一个较短的机器周期内完成,而对某些复杂的微操作,采用延长机器周期或增加节拍的办法来解决。
(3) 采用中央控制和局部控制相结合的方法
这种方案将机器的大部分指令安排在统一的、较短的机器周期内完成,称为中央控制,而将少数操作复杂的指令中的某些操作 (如乘除法和浮点运算等) 采用局部控制方式来完成。
在设计局部控制线路时需要注意两点: 其一,使局部控制的每一个节拍的宽度T
∗
^*
∗与中央控制的节拍宽度相同;其二,将局部控制节拍作为中央控制中机器节拍的延续,插人中央控制的执行周期内,使机器以同样的节奏工作,保证局部控制和中央控制的同步。T
∗
^*
∗的多少可根据情况而定,对于乘法,当操作数位数固定,T
∗
^*
∗的个数也就确定了。而对于浮点运算的对阶操作,由于移位次数不是一个固定值,因此T
∗
^*
∗的个数不能事先确定。
以乘法指令为例,第一个机器周期采用中央控制的节拍控制取指令操作,接着仍用中央控制的T
0
_0
0、T
1
_1
1、T
2
_2
2节拍去完成将操作数从存储器中取出并送至寄存器的操作,然后转局部控制,用局部控制节拍T
∗
^*
∗完成重复加和移位的操作。
2. 异步控制方式
异步控制方式不存在基准时标信号,没有固定的周期节拍和严格的时钟同步,执行每条指令和每个操作需要多少时间就占用多少时间。这种方式微操作的时序由专门的应答线路控制,即当CU发出执行某一微操作的控制信号后,等待执行部件完成该操作后发回 “回答” (或 “结束” )信号,再开始新的微操作,使CPU没有空闲状态,但因需要采用各种应答电路,故其结构比同步控制方式复杂。
3. 联合控制方式
同步控制和异步控制相结合就是联合控制方式。这种方式对各种不同指令的微操作实行大部分统一,小部分区别对待的办法。例如,对每条指令都有的取指令操作,采用同步方式控制;对那些时间难以确定的微操作,如 I/O 操作,则采用异步控制,以执行部件送回的 “回答” 信号作为本次微操作的结束。
4. 人工控制方式
人工控制是为了调机和软件开发的需要,在机器面板或内部设置一些开关或按键,来达到人工控制的目的。
(1) Reset (复位) 键
按下Reset键,使计算机处于初始状态。当机器出现死锁状态无法继续运行时,可按此键。若在机器运行时按此键,将会破坏机器内某些状态而引起错误,因此要慎用。有些微型计算机未设此键,当机器死锁时,可采用停电后再加电的办法重新启动计算机。
(2) 连续或单条执行转换开关
由于调机的需要,有时需要观察执行完一条指令后的机器状态,有时又需要观察连续运行程序后的结果,设置连续或单条执行转换开关,能为用户提供这两种选择。
(3) 符合停机开关
有些计算机还配有符合停机开关,这组开关指示存储器的位置,当程序运行到与开关指示的地址相符时,机器便停止运行,称为符合停机。