Skip to content

微程序控制器

2026 大纲 五(四)控制器的功能和工作原理(微程序控制器)。

把答案先算好存起来,运行时查表

硬布线是把 f(操作码,节拍,状态) 直接出来,指令集一旦庞大又不规整,这个函数就难以设计。微程序换了个思路:答案预先算好存起来,运行时按地址查——教材称之为"存储逻辑"。

这个换法带来一个漂亮的对称:机器指令级上,用户程序放在主存、由 PC 索引;微指令级上,微程序放在控制存储器 CM、由 μAR 索引。一条机器指令的执行,就是跑一小段 CM 里的微程序。CPU 因此有内外两层取指–执行循环,"微程序"这个名字正由此而来。

四个容易混的概念先分清:微操作是最基本不可再分的操作(如 (PC)MAR);微命令是控制微操作执行的信号,与数据通路上的控制信号一一对应;微指令是一个时钟周期内可并行执行的微命令集合;微程序是实现一条机器指令的微指令序列。

🔴 微命令是因,微操作是果。 PCo 是微命令,它打开那个门所造成的"PC 内容送上总线"才是微操作。两者一一对应所以常被混用,但含义有别。

还有一对贯穿全篇的关系:相容指可以在同一时刻发出(PCoMARi,一送一收配合完成传送),互斥指不能同时发出(PCoR0o,两个源同时占总线会冲突)。这是后面编码分组的全部依据。

🔴 CM 是 ROM,而且独立于主存。 微程序出厂即定,运行期不应被程序改动——否则一个用户程序就能改写"加法指令是怎么执行的"。CM 不占主存地址空间、程序无法访问。少数机器用可写控制存储器 WCS 支持自定义指令,那是特例。

🔴 微程序慢在哪:多了一次存储器访问。它要先按 μAR 访问 CM、把微指令读出装进 μIR,然后才能输出控制信号;硬布线经几级门延迟就出来了。这是"用查表换设计复杂度"必付的代价。

交互可视化

加载可视化中...

一、微程序控制器的结构

图 5.29 微程序控制器的基本结构
图 5.29 微程序控制器的基本结构
(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)

工作流程是一个闭环:

  1. IR 中的操作码送入微地址形成部件(映射逻辑),转换出该指令微程序的入口地址
  2. 入口地址送入微地址寄存器 μAR
  3. 按 μAR 从 CM 读出一条微指令,装入微指令寄存器 μIR
  4. μIR 的操作控制字段直接输出为各条微命令,送往数据通路
  5. μIR 的顺序控制字段给出下一条微指令的地址,送回 μAR,回到第 3 步

与硬布线相比多出来的三块就是 CM、μIR、微地址形成部件:控制信号不再由组合逻辑算出,而是事先编好存进 CM,运行时一条条取出来。层次关系为

机器指令对应微程序微指令序列包含微命令

二、微指令格式:水平型与垂直型

微指令分两个主要字段:操作控制字段(本条要发哪些微命令)与顺序控制字段(下一条微指令的地址或其计算方式)。

水平型:C1 C2  Cn操作控制,每位一个微命令  A1  Ak顺序控制垂直型:微操作码操作类型 源/目的操作对象 下址顺序控制
对比项水平型垂直型
微指令字长
并行性
微程序长度
执行速度
编写难度较复杂简单

🔴 这五行不必分开记,它们只有一条主线:水平型用空间换时间,垂直型用时间换空间。 把微命令摊开成"一位一根线",字长就大、但一拍能干很多事;编码压缩之后字长小、但一拍只能干一件事。剩下四行都是这一句的推论。

水平型的最小字长 = 微命令总数 + 顺序控制字段位数。比如 20 个微命令、顺序控制 8 位,就是 20+8=28 位。

三、操作控制字段的三种编码方式

方式做法代价
直接编码(直接控制)每一位直接对应一个微命令,不需译码简单直观、速度最快;字长等于微命令总数,CM 容量大
字段直接编码互斥的微命令分组,每组内用二进制编码显著缩短字长;需字段译码器,速度略慢
字段间接编码一个字段的含义取决于另一个字段的取值可进一步压缩字长;译码更复杂、并行性更受限

字段直接编码是算题的主场,两条规则是硬的:

🔴 ① 互斥的微命令分在同一字段,相容的分在不同字段(同组内每拍只能选一个,所以只有互斥的才能同组);② 每个字段必须留一种编码(通常全 0)表示"本组这一拍不发命令",所以 k 位只能表示 2k1 个微命令,不是 2k。漏掉这个"不操作"编码,位数就会少算。

字段直接编码到底压掉多少位:20 个微命令分 4 组的逐组推算(想弄清"为什么每组要多留一个不操作编码"如何影响位数时展开)

某处理器有 20 个微命令,可分为 4 组互斥的微命令,各组分别有 3、5、8、4 个。求操作控制字段的位数。

每组要能表示"本组的微命令数 + 1 种不操作":

微命令数需表示的状态数位数
133+1=4log24=2
255+1=6log26=3
388+1=9log29=4
444+1=5log25=3
操作控制字段=2+3+4+3=12 

直接编码需要 20 位,压缩了 40%。若忘了留"不操作"编码,第 3 组会按 log28=3 位算,整个字段少 1 位——而少的这一位意味着该字段每拍都被迫激活一个微命令,控制器失去"什么都不做"的能力。

四、下一条微指令的地址从哪来

方式做法
断定方式(下地址字段法)微指令中设专门的下地址字段,直接给出后继微地址
计数器方式类似 PC 自增,μAR+1(微程序顺序执行时)
条件转移根据状态条件(CF、ZF 等)在两个地址中选一个
由操作码映射每条机器指令开始时,由操作码转换出微程序的入口地址

断定方式要算下地址字段的位数,这是本篇最爱考的一处:

🔴 下地址字段位数=log2(微指令总条数),而 微指令总数=指令条数×每条指令的微指令数+公共取指微程序的条数取指与指令种类无关、全机共用一份,所以是"加"上去不是"乘"进去。

🔴 指令条数不等于微指令条数。 拿"32 条指令"直接取 log232=5 是本节最典型的错法。CM 的容量同理按微指令总数算:单元数 微指令总数,每单元的位数 = 微指令字长

另外记一条时间换算:每条微指令通常占一个时钟周期,所以 机器指令周期=该指令的微指令条数×微指令周期

下地址字段位数的完整推算,含两种典型错法各错在哪(想核对自己会不会漏算公共取指微程序时展开)

某机采用微程序控制器,共 32 条指令,公共的取指微程序含 2 条微指令,各指令对应的微程序平均由 4 条微指令组成,采用断定法确定下条微指令地址。求下地址字段至少几位。

微指令总数=32×4+2=130下地址字段位数=log2130=8 (27=128<130256=28)

两处容易算错:① 漏掉公共取指微程序的 2 条,得 log2128=7;② 把"32 条指令"直接当成微指令数,得 log232=5

之所以是"加 2"而不是"每条指令各含一份取指":取指过程与指令种类无关,写成一段公共的取指微程序由所有指令共用,各指令的微程序只含自己的执行部分,执行完跳回公共取指入口。

五、微程序设计步骤

  1. 分析每条机器指令的功能,写出微操作序列
  2. 将同一时钟周期可并行的(相容的)微操作归并为一条微指令
  3. 编写微指令序列,即微程序
  4. 确定每条微指令的下址字段
  5. 将全部微程序固化进控制存储器

考点速记

  1. 核心思路是函数难算就把答案存起来:CM(ROM,独立于主存、程序不可访问、不占主存地址空间)存放全部控制信号,运行时按 μAR 查;层次为机器指令 → 微程序 → 微指令 → 微命令,微命令是因、微操作是果
  2. 水平型用空间换时间、垂直型用时间换空间,五项对比全由这条主线推出;字段直接编码的分组原则是互斥同组、相容异组,且每组要留一个"不操作"编码,故 k 位只能表示 2k1 个微命令。
  3. 下地址字段位数 =log2(微指令总数),微指令总数要加上公共取指微程序——指令条数不等于微指令条数;微程序控制器慢在多一次访存,胜在改 ROM 即可修改指令功能,适合 CISC。

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 给若干互斥类的微命令个数,问操作控制字段至少几位:逐组按 log2(本组微命令数+1) 算再相加。⚠️ 那个 +1 是"本组这一拍不发命令"的编码,漏了整个字段会少位。
  • 给指令条数、公共取指微程序条数、每条指令的平均微指令数,问下地址字段至少几位:先算 指令条数×每条微指令数+取指微程序条数 得微指令总数,再取对数向上取整。⚠️ 两处常错:漏掉公共取指那几条;或把指令条数直接当微指令数。
  • 挑关于主存储器(MM)与控制存储器(CS)的错误叙述:常设的错点是"CS 按内容访问"——CS 和 MM 一样按地址访问(由 μAR 给地址)。而"MM 在 CPU 外、CS 在 CPU 内""MM 存指令和数据、CS 存微指令""MM 用 RAM 和 ROM、CS 用 ROM"三条都对。
  • 问 CPU 能理解并直接执行的是哪几种指令微指令与机器指令。伪指令是给汇编器看的命令、根本不生成机器码;汇编指令要先由汇编程序翻译成机器指令。

易错:字段编码时漏掉"不操作"编码,把 k 位当成能表示 2k 个微命令。

易错:算下地址字段时漏掉公共取指微程序,或直接拿指令条数取对数。

易错:认为控制存储器是按内容访问的。它按地址访问,由 μAR 索引。

易错:把伪指令或汇编指令当成 CPU 能直接执行的。

教材出处
  • 微程序控制器的基本结构(图 5.29):袁春风《计算机组成与系统结构》第 3 版 §5.3 多周期处理器,印刷页 p157

相关知识

硬布线控制器单总线数据通路多周期数据通路指令周期

真题练习