确定微指令地址的两种方法

一、微程序控制器:从指令到微操作

关系图示:

                  ┌────────────────────────┐
                  │      机器指令 (如 ADD)   │
                  └────────────┬───────────┘
                               ↓ (解释执行)
                  ┌────────────────────────┐
                  │     微程序 (ADD的微程序) │
                  └────────────┬───────────┘
                               │ 存放在 "控存(CM)" 中
                               ↓
  ┌─────────────────┬─────────────────┬─────────────────┐
  │  微指令 1       │  微指令 2       │      ...        │
  └──────┬──────────┴──────┬──────────┴──────┬──────────┘
         │                  │                 │
         ↓                  ↓                 ↓
┌────────┴───────┐ ┌────────┴───────┐ ┌────────┴───────┐
│ 微命令集合 1   │ │ 微命令集合 2   │ │      ...       │
└────────┬───────┘ └────────┬───────┘ └────────┬───────┘
         │                  │                 │
         ↓                  ↓                 ↓
┌────────┴───────┐ ┌────────┴───────┐ ┌────────┴───────┐
│  微操作集合 1  │ │  微操作集合 2  │ │      ...       │
└────────────────┘ └────────────────┘ └────────────────┘

2. 微程序控制器基本工作流程

  1. 取指阶段:CPU从主存中取出一条机器指令,存入指令寄存器(IR)。这个过程本身也是由一个固定的“取指微程序”来完成的。

  2. 地址映射:指令寄存器(IR)中的操作码(OP)字段被送到一个起始和转移地址发生器(或称为微地址映射逻辑)。该部件根据操作码,生成这条指令对应的微程序的入口地址

  3. 取微指令:将该入口地址送入微程序地址寄存器 (μPC 或 μMAR)

  4. 执行微指令:根据μPC中的地址,从控存(CM)中读出相应的微指令,存入微指令寄存器 (μIR)

  5. 产生控制信号:μIR中的操作控制字段经过译码后,产生出所需的微命令,控制CPU各功能部件完成相应的微操作。

  6. 确定后继地址:μIR中的顺序控制字段,结合CPU的状态标志等信息,通过地址转移逻辑,生成下一条微指令的地址,并送回μPC。

  7. 重复步骤4-6,直到当前微程序执行完毕。微程序最后一条微指令会引导CPU返回到“取指微程序”的开头,以执行下一条机器指令。

二、微指令的编码方式

微指令的操作控制字段如果每个比特位都直接对应一个微命令(称为直接控制法水平型微指令),会导致微指令非常长,浪费宝贵的控存空间。因此,必须对其进行编码。

1. 编码方式

在第一张图中,操作控制字段 那一长串 1000...0010 就是经过编码后的结果。

三、寻址的艺术:后继微指令地址的确定

这是微程序控制器的核心和难点。如何高效、灵活地从一条微指令转移到下一条?我们结合你提供的两张图来详细分析。

方式一:增量计数法 (Sequential + Branching)

Pasted image 20250814232056.png
这种方式是早期和基础的设计,其核心思想是**“顺序执行为主,转移执行为辅”**。

原理与图解分析 (参考图一):

  1. 结构核心:在控制器中有一个微程序计数器 (μPC)

  2. 默认操作:在大多数情况下,执行完当前微指令后,μPC会自动加1(μPC <- μPC + 1),从而指向控存中的下一条微指令。这对应了图中 μPC 下方的 +1 逻辑。

  3. 转移控制:微指令中设置一个转移控制字段(或称判别测试字段,图中标记为 BrCtr)。该字段的值决定了是否要“打破”默认的 +1 规则。

  4. 图一中的 BrCtr 逻辑分析

    • BrCtr = 10按顺序执行。这是最常见的模式,此时选择 μPC + 1 的结果作为下一条微指令地址。

    • BrCtr = 00无条件转移到取指微程序。这通常是一段微程序执行结束的标志。它会强制将一个固定的地址(通常是 0000,即取指微程序的入口)载入μPC。

    • BrCtr = 01按操作码转移。这发生在取指微程序结束之后。此时,会根据指令寄存器IR中的操作码 IR(OP),通过地址产生器(图中的ROM)计算出对应指令(如ADD、SUB)的微程序的入口地址,并载入μPC。

优点

缺点


方式二:断定法 / 下地址字段法 (Dispatching / Two-Address Format)

Pasted image 20250814232119.png
为了解决增量法的冗余问题,引入了这种更为灵活的方式。其核心思想是**“每条微指令都明确指出下一条微指令的地址”**。

原理与图解分析 (参考图二):

  1. 结构核心:微指令格式被扩展,增加了一个下地址字段。去除了μPC的自增 +1 功能。

  2. 基本操作:在绝大多数情况下,下一条微指令的地址直接从当前微指令的下地址字段中获得。

  3. 转移控制转移控制字段 (BrCtr) 的作用变为“裁决”下一地址的来源,实现更复杂的多路转移(Multi-way Branch),这也是“断定法”名称的由来。

  4. 图二中的 BrCtr 逻辑分析

    • BrCtr = 10直接转移。将当前微指令的“下地址”字段的内容送入μPC。如图中地址0000的微指令,其下地址是0001,执行完0000后就跳到0001

    • BrCtr = 00无条件转移到取指微程序。和方式一类似,强制加载0000

    • BrCtr = 01断定转移 / 操作码多路转移。这是该方法最精髓的部分。它用于解决方式一的冗余问题。

      • 场景:假设所有指令的微程序第一步都是相同的(如公共的取数操作),存放在地址 P。执行完 P 之后,需要根据具体是ADD还是SUB指令,分别跳转到各自后续的微指令(比如ADD的第二步在地址 A,SUB的第二步在地址 B)。

      • 实现:当BrCtr=01时,地址转移逻辑会利用IR(OP)作为输入(如图中ROM1ROM2),直接“断定”出下一条地址是 A 还是 B,并载入μPC。这样,公共的微指令(地址P)只需要存储一份即可,ADD和SUB微程序共享了它,大大节省了控存空间。图中所示的“跳转到SUB或ADD的第二条微指令执行”就是这个意思。

优点

缺点

总结对比

特性 增量计数法 断定法 (下地址字段法)
后继地址来源 默认 μPC+1,特殊情况由转移字段指定 默认来自微指令的“下地址”字段,特殊情况由转移字段裁决
μPC功能 计数器,具备 +1 功能 仅为地址寄存器,无 +1 功能
微指令字长 较短 较长(因有下地址字段)
控存总容量 可能较大(因微指令冗余) 可能较小(因共享微程序,总条数少)
灵活性 较差 很高

关于两个ROM

“断定法”中双ROM的精确分工与协同

ROM1负责根据指令操作码(OP)生成微程序的“起始地址”,用于启动一个全新的指令周期;ROM2则负责在微程序执行中途,根据操作码(OP)实现多路分支,跳转到不同的“后续分支地址”。

详细解释与图解分析

我们再来看这张“断定法”的结构图,并结合图上BrCtr的具体注释来理解:

1. ROM1:起始地址映射器 (Initial Address Mapper)

2. ROM2:断定/分支地址映射器 (Dispatch/Branch Mapper)

3. “下地址”字段:顺序执行的保障