控制器
主要功能
控制器是计算机系统的指挥中心,控制器的主要功能有:
- 指令解码:CPU 从存储器取出一个指令后,控制器负责解码这个指令,以确定要执行的操作和涉及的操作数。
- 生成控制信号:基于解码的指令,控制器生成一系列的控制信号,这些信号会驱动其他计算机部分(如算术逻辑单元、寄存器和存储器)按预期执行相应的操作。
- 时序控制:通过先后发出不同的控制信号,确保指令的逻辑正确被执行,
根据控制器产生微操作控制信号方式的不同,控制器可以分为硬布线控制器和微程序控制器。
用极为通俗的例子来对比,控制器就是 CPU 的“大脑”:
- 输入:控制器接收机器指令作为输入
- 输出:它需要在大约每个“嘀嗒”(也就是每个时钟周期)发出各种微命令,这些微命令就像是给 CPU 各个零件下达的最小指令(比如“让寄存器 A 把数据送出去”、“让算术单元执行加法”)。
组成
要理解控制器的组成,就要从其功能出发,大体来说,控制器的组成也可以分为三个组件:
- 指令控制器:负责取指和译码,并且形成下一条指令的地址。
- 时序控制器:产生计算机运行所需的各种时序信号。控制指令的执行节奏,确保各个部件协调工作。
- 控制信号发生器:根据指令译码器的输出,产生具体的控制信号。这些控制信号用于控制计算机各个部件的微操作。
指令控制器
指令控制器由 CS:IP 获取当前要执行的指令地址。 其中 CS 为程序段寄存器,标记了进程代码段(.code)的开始,IP 为指令指针寄存器,标记了当前指令在代码段内的偏移。
获取当前指令地址后,输入输出控制电路从内存中读取指令放入指令寄存器中。 然后修改 IP 寄存器的值,使 CS:IP 指向下一条指令的地址。
时序控制器
时序控制器的作用是为每条指令按时间顺序提供控制信号。时序控制器包括时钟发生器和倍频定义单元,其中时钟发生器由石英晶体振荡器发出非常稳定的脉冲信号,就是 CPU 的主频;而倍频定义单元则定义了 CPU 主频是存储器频率(总线频率)的几倍。
晶体振荡器利用石英晶体的压电效应,当施加电压时,晶体在特定频率下可以产生稳定的振荡。 晶体振荡器产生精确的频率信号,作为电子设备的时钟源。这个时钟信号就像一个“节拍器”,控制着设备内部各个部件的协调运作。
晶体振荡器产生的频率信号直接决定了电子设备的时钟周期。一个指令周期中包含 取指令 和 执行指令 这两个 CPU 周期,而 CPU 周期又由多个时钟周期组成。
假设当前要执行 MOV R1, [addr]
这条指令,其功能就是找到内存中 addr 地址的数据,并且将其传输到寄存器 R1 中,这条指令的执行包含以下几个步骤:
- 将地址传入 MAR 中。
- 存储器从 MAR 中读取地址,并且读取数据,存入 MDR。
- 从 MDR 中取出数据,通过 CPU 内的数据总线传输到寄存器 R1 中。
上述过程的执行需要保证严格的时序关系,先后关系不可颠倒,否则会导致指令执行的出错。
通过这个简单的例子是为了说明这样一个原理:在 CPU 内部,一条指令的执行也会被拆分为若干的子过程,这些子过程需要满足严格的时序关系,而这种时序关系就是由时序控制器进行控制的。
控制信号发生器
控制信号发生器负责接收指令译码器的结果,并且在每个时钟周期内产生 控制信号。
其中控制信号可以是 CPU 内的控制信号,通过 CPU 内总线传输至 CPU 内其他部件。 也可以是 CPU 外的控制信号,发送至系统的控制总线,用于协调计算机其他设备与 CPU 的交互。
控制信号
控制信号是由控制信号发生器生成和发出的电信号,这些信号用于指挥 CPU 内部的各种操作。例如,控制信号可以指示算术逻辑单元(ALU)执行加法还是减法,或者指示寄存器进行读写操作。
类型
其实控制信号的种类很多,但就目前阶段而言,会考察的可以被总结为三类控制信号:
- 内存读写信号:对内存或 IO 设备进行读写,比如
MemR
和MemW
分别表示对内存进行读和写。 - 寄存器选择信号:选择特定的寄存器进行读写操作,比如
Rin
和Rout
分别表示读寄存器和写寄存器。 - ALU 操作码信号:选择算术逻辑单元(ALU)执行哪种运算,如加法、减法、与、或等,比如
ALUop = Add
表示让 ALU 执行加法操作。
寄存器传送语言
控制信号决定了计算机指令的执行顺序和数据流动。计算机内部组件根据控制信号执行相应操作,数据流动通常用寄存器传输语言(Regsiter Transfer Language, RTL)描述。
RTL 有多种表示方式,试题中会考察的是伪代码表示,这种表示方式常用于体系结构的教学。
这节先说明一下 RTL 伪代码表示的常见符号以及基本语法结构,下一节会以一个实际的例子说明一下 RTL 和控制信号的编写。
常见元件和符号
RTL 中用一些符号来表示 CPU 中的基本元件:
元件/符号 | 含义 |
---|---|
R1, R2, ... | 通用寄存器 |
PC | 程序计数器 |
IR | 指令寄存器 |
MAR | 内存地址寄存器 |
MDR | 内存数据寄存器 |
M[x] | 内存中地址为 x 的数据单元 |
← | 数据从右边到左边 |
, | 并行操作 |
if | 条件执行 |
基本语法结构
赋值符号用 ←
表示寄存器传送,区别于一般的编程语言中的 =
,←
右边为源寄存器,←
左边为目标寄存器。
// 将 R2 和 R3 的加和结果送入寄存器 R1(即执行加法后写入 R1)。
R2 ← R1
有的 RTL 伪代码中对于源寄存器的读取用 ()
包围起来:R2 ← (R1)
,这种表示和 R2 ← R1
具有相同的含义。
具体采用哪种写法需要具体情况具体分析,根据题目给出的条件。
用逗号表示多个操作同时发生(在同一时钟周期)。
// 在一个时钟周期内执行两个操作:
// 1) 将 PC 的值 +4,使其指向下一条指令的地址。
// 2) 将当前指令的地址读取到
PC ← PC + 4, MAR ← PC
顺序操作使用多行,每一行一个时钟周期:
// 在连续三个时钟周期分别执行
MAR ← PC
MDR ← M[MAR]
IR ← MDR
存储器访问存储器访问需要用 MAR
指定地址,用 MDR
存储输入输出的数据。
// 读存储器:
MAR ← PC
MDR ← M(MAR)
// 写存储器:
MAR ← R1, MDR ← R2
M(MAR) ← MDR
指令的控制信号
指令的执行包含取指、译码、执行、访内和写回阶段,在这五个阶段中控制单元会发出不同的控制信号,以实现指令的执行。
以指令 ADD R0, (R1)
为例,说明一下指令执行阶段四个阶段的控制信号以及相应的功能,功能用寄存器传送语言给出描述。
取指和译码阶段
在该阶段中:PC 提供了当前需要读取指令的地址,从相应地址读取指令后,增加 PC 的值,使其指向下一条指令的地址,接着通过译码部件完成译码。
该阶段主要包含如下表所示的控制信号:
时钟 | 功能 | 控制信号 | 解释 |
---|---|---|---|
C1 | MAR ← PC | PCout , MARin | 从 PC 中读取指令地址至 MAR 中 |
C2 | MDR ← M(MAR) | MemR , MDRin | 存储器从 MAR 地址所在的内存单元读取数据 并加载到 MDR 中 |
C3 | MUXop ← PCIncr | PCIncr | 在二路选择器中生成值 1 添加入 ALU 的一端 |
C4 | T2 ← PC + 1 | MARout , T2in , Add | ALU 计算下一条指令的地址 |
C5 | PC ← T2 | T2out , PCin | 将计算得到的地址加载进 PC 中 |
C6 | 指令译码 | 无 | 由指令译码器件完成 |
不同指令的取值和译码阶段的
执行、访存和写回阶段
通过译码得到的控制信号,可以控制指令的执行和写回,对于 ADD R0, (R1)
为例,该阶段包含如下控制信号:
时钟 | 功能 | 控制信号 | 解释 |
---|---|---|---|
C7 | MAR ← R1 | R1out ,MARin | 将 R1 中的内容加载进 MAR |
C8 | MDR ← M(MAR) | MemR , MDRin | 存储器从 MAR 地址所在的内存单元读取数据 并加载到 MDR 中 |
C9 | T1 ← R0 | R0out , T1in | 将 R0 的内容存储在暂存器 T1 |
C10 | T2 ← MDR + T1 | MDRout , MUXop , Add , T2in | 将MDR 的内容存储进入ALU 另一个入口执行加法操作 并将结果存储进入 T2 |
C11 | R0 ← T2 | T2out , R0in | 将计算结果写回 R0 |
控制器种类
控制器的种类分为硬布线控制器和微程序控制器,这里了解即可。简而言之,硬布线控制器就是通过硬件的方式实现控制信号的输出,微程序控制器对指令的 OP 字段进行进一步编码,通过软件的方式实现控制信号的输出。
硬布线控制器
硬布线控制器(Hardwired Controller)是一种通过物理连接逻辑门、触发器、译码器等硬件电路元件来生成控制信号的控制器。它本质上是一个有限状态机(Finite State Machine, FSM),其控制逻辑通过电路的实际布线来固定实现。
结构
上图展示了硬布线控制器的基本结构,简单来说,其逻辑结构可以概括为:
输入端:接收指令信息(通过译码器转换),时序信息(时钟脉冲产生的节拍),以及来自执行部件的状态反馈信息(如运算结果的标志位)。
核心部分:一个由大量组合逻辑门电路(与门、或门、非门等)构成的网络。这个网络是预先设计好的,其内部连接是固定的。
输出端:根据当前的输入信号组合,通过这个固定的逻辑网络,直接生成一系列微操作控制信号。
简单来说,它就像一个复杂的“查表器”,不过这个“表”是用硬件电路固化下来的。当特定的输入信号组合出现时,就立即产生对应的输出控制信号。
特点
- 硬件实现:控制逻辑直接通过物理电路(如印刷电路板上的导线、焊接点)来实现,而不是通过软件程序。
- 固定功能:一旦设计和制造完成,其功能就基本固定。如果需要修改控制逻辑,通常需要物理地改变电路结构,例如重新布线、更换芯片等。
- 高速性:由于控制信号是通过组合逻辑电路直接生成的,没有额外的指令解释和软件开销,因此硬布线控制器通常具有非常高的执行速度。信号生成延迟主要取决于门电路的数量和传播延迟。
- 设计复杂性:对于复杂的控制逻辑,硬布线控制器可能会变得非常复杂,难以设计和验证。
微程序控制器
微程序控制器(Microprogrammed Controller)是一种与硬布线控制器相对的 CPU 控制单元设计方法。它不直接通过组合逻辑电路生成控制信号,而是将复杂的控制逻辑存储在一种特殊的存储器 —— 控制存储器(Control Memory, CM) 中。
微程序控制器的 核心思想 是用“程序”来控制“程序”的执行。CPU 的每一条机器指令,都被分解成一系列更小的、更基本的微操作(Micro-operation)。这些微操作的序列,构成了该机器指令的微程序(Microprogram)。
结构
上图给出了一个微程序控制器的基本结构,其中包含以下组件:
- 指令寄存器 (IR):收并存储从主存储器中取出的机器指令。指令通常包含操作码(OP)和其他信息。
- 起始和转移地址形成部件:这是微程序控制器的大脑。
- 根据指令的操作码,生成该机器指令对应微程序的起始地址。
- 根据当前微指令的“下地址”信息和外部标志信号,计算出下一条微指令的地址。
- 它计算出的微指令地址被送入微程序计数器。
- 微程序计数器 (µPC):接收 “起始和转移地址形成部件” 产生的微指令地址,并将其保存。它类似于 CPU 的程序计数器,但它指向的是控制存储器中的微指令地址。
- 控制存储器 (Control Storage):这是微程序控制器的核心存储单元。
- 输入:接收来自 µPC 的微指令地址。
- 功能:根据 µPC 提供的地址,从中读取出对应的微指令。
- 输出:读取到的微指令被送入微指令寄存器(µIR)。
- 微指令寄存器 (µIR):用于存放从控制存储器中读出的当前正在执行的微指令。一条微指令通常包含两部分:
- 微命令(Microcommand)字段: 这是微程序控制器的最终输出,直接控制CPU内部各部件的微操作(例如,使能寄存器、控制ALU操作、控制总线传输等)。图中标示为“微命令”并有多个向外的箭头。
- 下地址字段(Next Address): 这个字段指示了下一条微指令的地址生成方式或直接给出下一条微指令的相对/绝对地址。这个“下地址”信息被送回“起始和转移地址形成部件”,用于计算下一条微指令的地址。
微程序控制器的 工作流程 如下:
- 指令译码:机器指令的操作码被译码,得到该指令对应微程序的起始地址。
- 地址寻址:微地址寄存器(µPC)根据这个起始地址,从控制存储器中取出微指令。
- 微指令执行:取出的微指令被送入微指令寄存器(µIR)。微指令包含两部分:
- 微命令:直接控制 CPU 各部件的微操作。
- 下地址:指示下一条微指令的地址。
- 循环:根据下地址信息(并结合 CPU 状态),计算出下一条微指令的地址,送回µPC,重复以上过程,直到完成当前机器指令的所有微操作。
微指令编码方式
微指令编码方式是指如何组织微指令中各个字段,以便有效地表示和控制 CPU 中的各种微操作。不同的编码方式在灵活性、控制速度、微指令长度等方面有不同的权衡。
主要有以下三种微指令编码方式:
- 直接编码方式(Direct Control Microprogramming),也叫做水平编码(Horizontal Microprogramming)
- 字段直接编码方式(Field Decoding Microprogramming),也叫做垂直编码(Vertical Microprogramming)
- 混合编码方式(Hybrid Microprogramming)
在直接编码方式中,微指令的微命令字段中的每一位都直接对应并控制 CPU 中的一个特定微命令或硬件操作。当某一位的值为 ‘1’ 时,对应的微命令被激活;当为 ‘0’ 时,则不激活。这种方式的特点是无需译码器,微指令的输出可以直接驱动控制线。
举个实际例子,假设我们有一个简单的 CPU,其中包含控制寄存器 A 加载、寄存器 B 加载、ALU 加法操作、ALU 减法操作、总线选择等微命令。在直接编码方式下,一条微指令的微命令字段可能长这样:
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
含义 | RA_load | RB_load | ALU_ADD | ALU_SUB | BUS_A | BUS_B | … | … |
如果一条微指令的这个字段是 1 1 1 0 1 0 0 0
,则表示同时执行:将数据加载到寄存器 A (RA_load)
、将数据加载到寄存器 B (RB_load)
、执行 ALU
加法 (ALU_ADD)
、以及选择总线 A (BUS_A)
。
直接编码方式的 特点 如下:
- 高并行性:一条微指令可以同时激活多个互不冲突的微命令,实现高度并行的微操作。
- 高速性:由于无需经过译码,控制信号生成路径最短,执行速度最快。
- 微指令长度长:随着需要控制的微命令数量增加,微指令的位数会线性增长,导致控制存储器容量需求大。
- 设计复杂:设计者需要精确控制每一个独立的控制位,对微程序编写者要求较高。
字段直接编码方式将微指令的微命令字段逻辑地划分为若干个独立的组(或称字段)。每个字段内部包含一组互斥的微命令(即在同一时刻,该字段内只能激活一个微命令)。不同字段之间则包含相容的微命令(可以同时激活)。每个字段本身被编码为一个值,这个值经过译码器后,才能激活该字段内对应的具体微命令。
继续上面的例子,在字段直接编码方式下,微指令的微命令字段可能被划分为多个字段,例如:
字段 | F1 (寄存器操作) | F2 (ALU 操作) | F3 (总线选择) | … |
---|---|---|---|---|
位数 | 2 位 | 2 位 | 1 位 | |
编码值 | 00: 无操作 | 00: 无操作 | 0: 无操作 | |
01: | RA_load | 01: ALU_ADD | 1: BUS_A | |
10: | RB_load | 10: ALU_SUB |
如果一条微指令的这个字段是 01 | 01 | 1
,则表示:
- F1
编码为 01
,经过译码器后激活 RA_load
微命令。
- F2
编码为 01
,经过译码器后激活 ALU_ADD
微命令。
- F3
编码为 1
,经过译码器后激活 BUS_A
微命令。在这里,RA_load
和 RB_load
是互斥的,ALU_ADD
和 ALU_SUB
是互斥的,但 RA_load
和 ALU_ADD
可以并行。
字段直接编码方式的特点如下:
- 微指令长度短:通过字段内部编码共享位,大大减少了微指令的位数,从而节省控制存储器空间。
- 设计相对简单:微程序设计者只需选择字段中的某个编码值,无需关心具体的单个控制位。
- 并行性受限:同一字段内的微命令不能并行执行,因为它们是互斥的。不同字段间的微命令可以并行。
- 控制速度稍慢:由于需要经过译码器才能生成实际控制信号,会引入额外的延迟。
混合编码方式是直接编码方式和字段直接编码方式的结合,旨在综合两者的优点。它将微指令的微命令字段划分为若干部分:
- 一部分字段采用直接编码方式:用于控制那些经常同时发生、对时序要求高且彼此不冲突的关键微命令。这部分保持了高并行度和快速响应。
- 另一部分字段采用字段直接编码方式:用于控制那些互斥或并行性要求不那么高的微命令,以有效缩短微指令的整体长度。
通过这种混合设计,可以在保证较高并行度的同时,有效降低对控制存储器容量的需求。
特点
相比于硬布线控制器,微程序控制器特点如下:
- 灵活性:由于控制逻辑是存储在存储器中的,所以更改控制逻辑只需要更改存储的微指令,而无需更改硬件。
- 简化设计:对于复杂的控制逻辑,使用微指令可能会简化设计和验证过程。
- 性能:通常比硬布线控制器慢,因为它需要从控制存储器中读取微指令。
- 易于修改和扩展:添加新的指令或修改现有的指令相对容易。
- 速度较慢:相比硬布线控制器,微程序控制器需要额外的存储器访问(读取微指令)和地址计算(形成下一微地址)时间。这使得它的执行速度相对较慢。
指令、微指令、微命令
在计算机的 CPU 中,要完成一个复杂的任务,需要层层分解为更基本、更具体的动作。指令、微指令和微命令正体现了这种自顶向下的控制层次结构。
- 指令:程序员编写的高级语言程序经过编译、汇编后,最终形成并能被 CPU 直接识别和执行的最小功能单位。
- 微指令:它是微程序控制器中的一个字,存储在特殊的控制存储器中。一条机器指令的执行过程,被分解为一系列更小的、更基本的步骤,每个步骤对应一条或多条微指令。
- 微命令:计算机中最基本的、不可再分的、由硬件电路直接完成的操作。
回顾一下微程序控制器的 结构,对于控制器来说:输入是机器指令,输出是每个时钟周期不同的微命令。这种控制的实现机制是基于控制存储器(Control Memory, CM)。控制存储器内部存储着预先定义好的微指令序列。
所以一个指令对应一个微程序,一个微程序中包含多个微指令,每个微指令对应一系列微操作。下图展现了三者的层次关系:
复杂任务
↓
多条机器指令 (Instruction) 组成程序
↓ (一条机器指令)
一个微程序 (Microprogram)
↓ (一个微程序)
多条微指令 (Microinstruction) 组成微程序
↓ (一条微指令)
多个并行微命令 (Microcommand)
↓
驱动硬件完成最基本的操作
在上文的 指令的控制信号 部分,我们详细阐述了指令 ADD R0, (R1) 所对应的微操作序列。为了进一步帮助各位读者理解指令、微指令、微命令三者之间的区别与联系,本节将通过以下表格,具体说明该指令(相当于一个微程序)各阶段的微指令和微命令:
时钟 | 功能 | 对应的微指令(简化) | 包含的微命令 |
---|---|---|---|
C1 | MAR ← PC | 微指令 A | PCout , MARin |
C2 | MDR ← M(MAR) | 微指令 B | MemR , MDRin |
C3 | MUXop ← PCIncr | 微指令 C | PCIncr |
C4 | T2 ← PC + 1 | 微指令 D | PCout , Add , T2in |
C5 | PC ← T2 | 微指令 E | T2out , PCin |
C6 | 指令译码 | 微指令 F | (硬件译码逻辑) |
C7 | MAR ← R1 | 微指令 G | R1out , MARin |
C8 | MDR ← M(MAR) | 微指令 H | MemR , MDRin |
C9 | T1 ← R0 | 微指令 I | R0out , T1in |
C10 | T2 ← MDR + T1 | 微指令 J | MDRout , T1out_to_ALU_input , Add , T2in |