控制器
主要功能
控制器是计算机系统的指挥中心,控制器的主要功能有:
- 指令解码:CPU 从存储器取出一个指令后,控制器负责解码这个指令,以确定要执行的操作和涉及的操作数。
- 生成控制信号:基于解码的指令,控制器生成一系列的控制信号,这些信号会驱动其他计算机部分(如算术逻辑单元、寄存器和存储器)按预期执行相应的操作。
- 时序控制:通过先后发出不同的控制信号,确保指令的逻辑正确被执行,
根据控制器产生微操作控制信号方式的不同,控制器可以分为硬布线控制器和微程序控制器。
组成
要理解控制器的组成,就要从其功能出发,大体来说,控制器的组成也可以分为三个组件:
- 指令控制器:负责取指和译码,并且形成下一条指令的地址。
- 时序控制器:产生计算机运行所需的各种时序信号。控制指令的执行节奏,确保各个部件协调工作。
- 控制信号发生器:根据指令译码器的输出,产生具体的控制信号。这些控制信号用于控制计算机各个部件的微操作。
指令控制器
指令控制器由 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 字段进行进一步编码,通过软件的方式实现控制信号的输出。
硬布线控制器
定义:硬布线控制器是通过组合逻辑电路来实现的,通常使用逻辑门、多路复用器、解码器等组合电路元件。
特点:
- 性能:因为是硬件实现,所以通常速度较快。
- 固定功能:一旦设计和实现完成,修改它就比较困难,需要改变物理电路。
- 设计复杂性:对于复杂的控制逻辑,硬布线控制器可能会变得非常复杂,难以设计和验证。
微程序控制器
定义:微程序控制器基于存储的微指令集来实现控制逻辑。它使用一块称为“控制存储器”或“微指令存储器”的特殊存储器来存储微指令。每一个微指令定义了一系列的控制信号。
特点:
- 灵活性:由于控制逻辑是存储在存储器中的,所以更改控制逻辑只需要更改存储的微指令,而无需更改硬件。
- 简化设计:对于复杂的控制逻辑,使用微指令可能会简化设计和验证过程。
- 性能:通常比硬布线控制器慢,因为它需要从控制存储器中读取微指令。
- 易于修改和扩展:添加新的指令或修改现有的指令相对容易。
微命令是计算机硬件控制的基础指令,用于控制某些硬件单元完成某种操作。
一条机器指令对应一个微程序,一个微程序由数条微指令构成,每个微指令可以包含数个微命令。
微指令编码方式- 直接编码方式
微指令的微命令字段中每一位代表一个特定的微命令。每个位可以独立控制一个硬件操作,值为 1 表示激活该微命令,值为 0 表示不激活。
- 字段直接编码方式
字段直接编码方式将微指令的微命令字段分成若干小段(字段),每个字段包含一组 互斥 的微命令(即同一时刻只能执行该字段中的一个微命令),不同字段之间包含 相容 的微命令(可以同时执行)。每个字段独立编码,编码值对应字段内的一个微命令或空操作。