菜鸟科技网

互斥微命令为何需互斥?

什么是微命令?

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

互斥微命令为何需互斥?-图1
(图片来源网络,侵删)
  • 指令: 是用户或程序发出的高级命令,ADD R1, R2 (将寄存器R1和R2相加) 或 LOAD A, 100 (将内存地址100的数据加载到寄存器A),一条指令通常需要多个时钟周期才能完成。
  • 微命令: 是控制器为了执行一条指令而发出的、最基本、不可再分的控制信号,这些信号直接作用于CPU的各个部件,如控制数据在总线上的流动、打开或关闭某个寄存器的门、启动ALU进行运算等。

简单比喻:

  • 指令 就像是“做一份番茄炒蛋”。
  • 微命令 就是完成这道菜的具体步骤,“打开煤气灶”、“打两个鸡蛋到碗里”、“加一勺盐”、“翻炒一分钟”等等。

一条指令(如 ADD R1, R2)会被分解成一系列的微命令序列,按顺序执行:

  1. 打开R1到总线A的门 (将R1的数据送到ALU的输入端A)
  2. 打开R2到总线B的门 (将R2的数据送到ALU的输入端B)
  3. 向ALU发送“加法”控制信号 (设置ALU执行加法操作)
  4. 打开ALU输出到寄存器R1的门 (将计算结果写回R1)
  5. 将程序计数器PC的值加1 (为下一条指令做准备)

什么是互斥微命令?

互斥微命令 指的是 在同一个时钟周期内,不能同时发出的微命令,如果同时发出,会导致CPU的硬件电路冲突、产生错误的结果或损坏硬件。

核心特征: 矛盾性、冲突性。

互斥微命令为何需互斥?-图2
(图片来源网络,侵删)

为什么会互斥?

互斥通常源于CPU硬件的物理限制,一个物理部件在同一个时刻通常只能处于一种状态或执行一种操作。

常见的互斥场景:

  1. 数据总线的控制:

    • 场景: CPU内部有多个寄存器(如R1, R2, R3, ...),它们都需要连接到一条公共的数据总线上。
    • 互斥微命令:
      • 打开R1到总线的门 (将R1内容输出到总线)
      • 打开R2到总线的门 (将R2内容输出到总线)
    • 冲突: 如果这两个命令同时发出,R1和R2的数据会“打架”,同时驱动同一条总线,导致数据混乱(电平冲突),这是绝对不允许的。在任何时刻,只能有一个源部件将数据放到总线上。
  2. ALU的操作:

    互斥微命令为何需互斥?-图3
    (图片来源网络,侵删)
    • 场景: 算术逻辑单元可以执行多种运算,如加法、减法、与、或、非等。
    • 互斥微命令:
      • ALU_ADD (设置ALU执行加法)
      • ALU_SUB (设置ALU执行减法)
    • 冲突: ALU的控制信号线是互斥的,你不能同时告诉ALU“你做加法”和“你做减法”,这会导致ALU的输出结果不可预测。
  3. 部件的读写操作:

    • 场景: 一个存储单元(如寄存器或内存单元)在同一个时钟周期内,通常不能既被读又被写。
    • 互斥微命令:
      • 对寄存器R1执行读操作
      • 对寄存器R1执行写操作
    • 冲突: 这会导致逻辑上的混乱,你不知道最终R1里应该保持原来的数据(如果读优先),还是被新写入的数据覆盖(如果写优先),读和写操作必须分时进行。

与互斥相对的概念:相容微命令

为了更好地理解互斥,我们引入它的对立面——相容微命令

相容微命令 指的是 可以在同一个时钟周期内同时发出,并且不会产生冲突的微命令,这些命令通常作用于不同的、互不干扰的硬件部件。

例子:

  • 场景: 在执行 ADD R1, R2 指令时。

  • 相容微命令:

    1. 打开R1到总线A的门
    2. 打开R2到总线B的门
    3. 向ALU发送“加法”控制信号
    4. 将程序计数器PC的值加1
  • 分析:

    • R1到总线AR2到总线B 是相容的,因为它们连接的是总线的不同输入端,没有冲突。
    • 设置ALU为加法 是独立的,它不干扰数据在总线上的传输。
    • PC加1 是一个独立的操作,与当前的ALU运算和数据传输可以并行进行(在采用流水线等技术的CPU中)。

互斥与相容的关系:

特性 互斥微命令 相容微命令
定义 不能在同一时钟周期同时发出 可以在同一时钟周期同时发出
关系 相互排斥,有冲突 相互兼容,无冲突
硬件基础 控制同一个物理部件或资源 控制不同的、独立的物理部件或资源
例子 同时打开R1和R2到总线 同时打开R1到总线A和R2到总线B

互斥微命令的意义与应用

理解互斥微命令至关重要,主要体现在控制器的设计上。

控制器如何处理互斥微命令?

控制器是CPU的“大脑”,负责生成所有微命令,它必须确保互斥的微命令永远不会被同时激活,这通常通过 编码 的方式来实现。

  1. 编码法:

    • 原理: 将所有互斥的微命令归为一组,用二进制编码来表示,在任何一个时钟周期,这一组编码中只有一位是有效的(用“1”表示选中)。
    • 例子: 假设有4个互斥的微命令 C1, C2, C3, C4,它们是4个寄存器的输出使能信号,我们可以用2位二进制数来控制它们:
      • 00: 无操作 (或全部关闭)
      • 01: 激活 C1
      • 10: 激活 C2
      • 11: 激活 C3
      • 100: 激活 C4 (需要3位编码)
    • 优点: 大大减少了控制器需要输出的控制线数量,如果不编码,4个互斥信号需要4根线;而编码后只需要2根线。
    • 缺点: 增加了译码器的开销,控制器输出编码后,需要外部的硬件(译码器)将其解码为具体的微命令信号。
  2. 不采用编码(直接控制法):

    • 原理: 每个微命令都有一根独立的控制线。
    • 缺点: 对于互斥的微命令组,这种方式会造成硬件资源的极大浪费,有16个互斥的微命令,就需要16根控制线,而编码法只需要4根。

实际应用:微指令格式

在微程序控制的CPU中,控制器通过执行“微指令”来产生微命令,一条微指令包含多个字段,每个字段对应一组相容或互斥的微命令。

  • 字段编码: 每个字段内部包含的是一组 互斥 的微命令,因此字段内部需要进行编码。
  • 字段间相容: 不同的字段之间,其微命令通常是 相容 的,因此可以并行发出。

一个简化的微指令格式示例:

微操作字段1 微操作字段2 下一微地址字段 ...
(控制ALU操作) (控制总线数据源) (下一条微指令的地址)
ADD=1, SUB=0 R1=1, R2=0, MEM=0 0001

在这个例子中:

  • 字段1 (ALU控制)ADDSUB互斥 的,所以它们被放在一个字段里,用编码表示(01代表ADD,10代表SUB)。
  • 字段2 (数据源)R1R2互斥 的,所以也被放在一个字段里编码。
  • 字段1和字段2之间ADD 操作和 选择R1作为数据源相容 的,所以它们可以同时出现在同一条微指令中,在同一个时钟周期内执行。

概念 核心思想 例子
微命令 控制器发出的、最基本、不可再分的控制信号,用于驱动CPU硬件执行具体操作。 打开R1到总线的门ALU_ADD
互斥微命令 在同一时钟周期不能同时发出的微命令,会导致硬件冲突或逻辑错误。 同时打开R1和R2到总线;同时设置ALU为加法和减法。
相容微命令 在同一时钟周期可以同时发出的微命令,作用于不同部件,无冲突。 同时打开R1到总线A和R2到总线B;同时进行ALU加法和PC自增。
设计方法 将互斥的微命令分组,采用 编码 方式生成控制信号,以减少硬件成本。 用2位编码 00, 01, 10, 11 来控制4个互斥的寄存器输出使能。

理解互斥微命令是掌握CPU控制器工作原理的基石,它揭示了硬件设计的内在约束,并指导我们如何高效、正确地设计控制逻辑,让成千上万个微命令协同工作,最终完成用户程序的一条条指令。

分享:
扫描分享到社交APP
上一篇
下一篇