什么是微命令?
我们需要明确什么是“微命令”。

- 指令: 是用户或程序发出的高级命令,
ADD R1, R2(将寄存器R1和R2相加) 或LOAD A, 100(将内存地址100的数据加载到寄存器A),一条指令通常需要多个时钟周期才能完成。 - 微命令: 是控制器为了执行一条指令而发出的、最基本、不可再分的控制信号,这些信号直接作用于CPU的各个部件,如控制数据在总线上的流动、打开或关闭某个寄存器的门、启动ALU进行运算等。
简单比喻:
- 指令 就像是“做一份番茄炒蛋”。
- 微命令 就是完成这道菜的具体步骤,“打开煤气灶”、“打两个鸡蛋到碗里”、“加一勺盐”、“翻炒一分钟”等等。
一条指令(如 ADD R1, R2)会被分解成一系列的微命令序列,按顺序执行:
打开R1到总线A的门(将R1的数据送到ALU的输入端A)打开R2到总线B的门(将R2的数据送到ALU的输入端B)向ALU发送“加法”控制信号(设置ALU执行加法操作)打开ALU输出到寄存器R1的门(将计算结果写回R1)将程序计数器PC的值加1(为下一条指令做准备)
什么是互斥微命令?
互斥微命令 指的是 在同一个时钟周期内,不能同时发出的微命令,如果同时发出,会导致CPU的硬件电路冲突、产生错误的结果或损坏硬件。
核心特征: 矛盾性、冲突性。

为什么会互斥?
互斥通常源于CPU硬件的物理限制,一个物理部件在同一个时刻通常只能处于一种状态或执行一种操作。
常见的互斥场景:
-
数据总线的控制:
- 场景: CPU内部有多个寄存器(如R1, R2, R3, ...),它们都需要连接到一条公共的数据总线上。
- 互斥微命令:
打开R1到总线的门(将R1内容输出到总线)打开R2到总线的门(将R2内容输出到总线)
- 冲突: 如果这两个命令同时发出,R1和R2的数据会“打架”,同时驱动同一条总线,导致数据混乱(电平冲突),这是绝对不允许的。在任何时刻,只能有一个源部件将数据放到总线上。
-
ALU的操作:
(图片来源网络,侵删)- 场景: 算术逻辑单元可以执行多种运算,如加法、减法、与、或、非等。
- 互斥微命令:
ALU_ADD(设置ALU执行加法)ALU_SUB(设置ALU执行减法)
- 冲突: ALU的控制信号线是互斥的,你不能同时告诉ALU“你做加法”和“你做减法”,这会导致ALU的输出结果不可预测。
-
部件的读写操作:
- 场景: 一个存储单元(如寄存器或内存单元)在同一个时钟周期内,通常不能既被读又被写。
- 互斥微命令:
对寄存器R1执行读操作对寄存器R1执行写操作
- 冲突: 这会导致逻辑上的混乱,你不知道最终R1里应该保持原来的数据(如果读优先),还是被新写入的数据覆盖(如果写优先),读和写操作必须分时进行。
与互斥相对的概念:相容微命令
为了更好地理解互斥,我们引入它的对立面——相容微命令。
相容微命令 指的是 可以在同一个时钟周期内同时发出,并且不会产生冲突的微命令,这些命令通常作用于不同的、互不干扰的硬件部件。
例子:
-
场景: 在执行
ADD R1, R2指令时。 -
相容微命令:
打开R1到总线A的门打开R2到总线B的门向ALU发送“加法”控制信号将程序计数器PC的值加1
-
分析:
R1到总线A和R2到总线B是相容的,因为它们连接的是总线的不同输入端,没有冲突。设置ALU为加法是独立的,它不干扰数据在总线上的传输。PC加1是一个独立的操作,与当前的ALU运算和数据传输可以并行进行(在采用流水线等技术的CPU中)。
互斥与相容的关系:
| 特性 | 互斥微命令 | 相容微命令 |
|---|---|---|
| 定义 | 不能在同一时钟周期同时发出 | 可以在同一时钟周期同时发出 |
| 关系 | 相互排斥,有冲突 | 相互兼容,无冲突 |
| 硬件基础 | 控制同一个物理部件或资源 | 控制不同的、独立的物理部件或资源 |
| 例子 | 同时打开R1和R2到总线 | 同时打开R1到总线A和R2到总线B |
互斥微命令的意义与应用
理解互斥微命令至关重要,主要体现在控制器的设计上。
控制器如何处理互斥微命令?
控制器是CPU的“大脑”,负责生成所有微命令,它必须确保互斥的微命令永远不会被同时激活,这通常通过 编码 的方式来实现。
-
编码法:
- 原理: 将所有互斥的微命令归为一组,用二进制编码来表示,在任何一个时钟周期,这一组编码中只有一位是有效的(用“1”表示选中)。
- 例子: 假设有4个互斥的微命令
C1, C2, C3, C4,它们是4个寄存器的输出使能信号,我们可以用2位二进制数来控制它们:00: 无操作 (或全部关闭)01: 激活C110: 激活C211: 激活C3100: 激活C4(需要3位编码)
- 优点: 大大减少了控制器需要输出的控制线数量,如果不编码,4个互斥信号需要4根线;而编码后只需要2根线。
- 缺点: 增加了译码器的开销,控制器输出编码后,需要外部的硬件(译码器)将其解码为具体的微命令信号。
-
不采用编码(直接控制法):
- 原理: 每个微命令都有一根独立的控制线。
- 缺点: 对于互斥的微命令组,这种方式会造成硬件资源的极大浪费,有16个互斥的微命令,就需要16根控制线,而编码法只需要4根。
实际应用:微指令格式
在微程序控制的CPU中,控制器通过执行“微指令”来产生微命令,一条微指令包含多个字段,每个字段对应一组相容或互斥的微命令。
- 字段编码: 每个字段内部包含的是一组 互斥 的微命令,因此字段内部需要进行编码。
- 字段间相容: 不同的字段之间,其微命令通常是 相容 的,因此可以并行发出。
一个简化的微指令格式示例:
| 微操作字段1 | 微操作字段2 | 下一微地址字段 | ... |
|---|---|---|---|
| (控制ALU操作) | (控制总线数据源) | (下一条微指令的地址) | |
ADD=1, SUB=0 |
R1=1, R2=0, MEM=0 |
0001 |
在这个例子中:
- 字段1 (ALU控制):
ADD和SUB是 互斥 的,所以它们被放在一个字段里,用编码表示(01代表ADD,10代表SUB)。 - 字段2 (数据源):
R1和R2是 互斥 的,所以也被放在一个字段里编码。 - 字段1和字段2之间:
ADD操作和选择R1作为数据源是 相容 的,所以它们可以同时出现在同一条微指令中,在同一个时钟周期内执行。
| 概念 | 核心思想 | 例子 |
|---|---|---|
| 微命令 | 控制器发出的、最基本、不可再分的控制信号,用于驱动CPU硬件执行具体操作。 | 打开R1到总线的门、ALU_ADD |
| 互斥微命令 | 在同一时钟周期不能同时发出的微命令,会导致硬件冲突或逻辑错误。 | 同时打开R1和R2到总线;同时设置ALU为加法和减法。 |
| 相容微命令 | 在同一时钟周期可以同时发出的微命令,作用于不同部件,无冲突。 | 同时打开R1到总线A和R2到总线B;同时进行ALU加法和PC自增。 |
| 设计方法 | 将互斥的微命令分组,采用 编码 方式生成控制信号,以减少硬件成本。 | 用2位编码 00, 01, 10, 11 来控制4个互斥的寄存器输出使能。 |
理解互斥微命令是掌握CPU控制器工作原理的基石,它揭示了硬件设计的内在约束,并指导我们如何高效、正确地设计控制逻辑,让成千上万个微命令协同工作,最终完成用户程序的一条条指令。
