简介《实验7 微程序控制器》是一份面向计算机组成原理课程学习者的实验报告类文档适合本科生及相关方向研究者配合虚拟实验系统理解微程序控制器的组成与工作过程。压缩包内仅含1个docx文件大小约485KB内容围绕控制存储器、微地址寄存器、地址转移逻辑及微指令格式展开并给出实验电路图与微程序流程图。文档结合74LS175、EPROM2716等元器件说明梳理IN、ADD、STA、JMP四条机器指令与微程序的对应关系附有微指令二进制代码表、实验步骤和思考题便于读者按图搭建虚拟电路、观察微指令执行流程并完成实验报告。目前已有651人学习适合用作课程实验预习、过程对照与报告撰写参考。1. 先把地图铺开微程序控制器在整机控制链上的位置微程序控制器这部分初看是“几片芯片加一张流程表”复习时最容易散成一地零件。它其实是计算机组成原理里少有的能把指令系统、控制存储器、微指令、时序串成一条线的内容。在虚拟实验系统里把电路搭完、单步跑过一遍才会真正想通一条机器指令对应一段微程序一段微程序拆成若干条微指令一条微指令就是 24 位二进制每一位都在直接指挥某个部件的开或关。整个实验只有 16 个可编址单元、四条机器指令规模很小但控制器的取指—译码—执行闭环、顺序与分支两种下址方式全在里面。这份笔记按硬件骨架、微指令格式、微程序流程、易错点、复习清单五层往上走适合正在做这个实验或期末要考控制器一章的人照着对表。2. 硬件骨架控制存储器、微地址寄存器与地址转移逻辑微程序控制器的电路图第一眼看上去线很多其实只有三块存微指令的、存微地址的、算下一条地址的。把这三块认清楚图 7-1 上剩下的开关和指示灯都只是观察窗口。这一章按“谁存什么、谁给谁信号”的顺序拆。2.1 三片 2716 拼出的控制存储器2K×24 位是怎么来的单片 2716 是 2K×8 位的 EPROM11 根地址线 A10~A08 根数据线。一位数据装不下一条 24 位的微指令所以要把三片并起来三片的地址引脚全部并联片选和读信号也并联数据输出各自出一字节按 Q0~Q7、Q8~Q15、Q16~Q23 拼成 24 位。这样从外面看它就是一块 2K×24 位的控制存储器地址给一个值一次吐出整条微指令。实验中并没有真的用满 2K。A4~A10 这七根高位地址线全部接地恒为 0只有 A3~A0 参与寻址所以实际能用的是 16 个单元每个单元 24 位原文写的“16×3 字节”就是这么来的。这个细节很容易被当成“多余的线接一下省事”其实它是有意的高位固定保证地址永远不会跑到没编程的区域去16 个单元刚好放得下四条机器指令的微程序。CE 和 OE 也都接地。2716 的 CE 是片选为 0 时芯片正常工作OE 是读信号CE 为 0 且 OE 为 0 时执行读操作。两个都恒置 0意味着这块控制存储器永远处在“被选中且在读”的状态地址一变输出就跟着变没有写、没有等待。这也是微程序控制器的一个本质特征微程序是设计机器时就固化好的运行期只读不写。注意2716 输出里带#后缀的信号是低电平有效不带的为高电平有效。读代码表时把这两类信号混着看是后面所有错误的源头。虚拟实验系统把三片 2716 合并成了一个虚拟 EPROM 组件外部只暴露一组地址和 24 位输出 Q0~Q23。这样连线上看不出“三片”的结构但位序仍然是三片拼接后的顺序读表 7-3 时不能按单片 8 位去切。2.2 微地址寄存器 74LS175CLR 与 T1 的分工74LS175 是 4 位数据锁存器在这里的角色是微地址寄存器输出 μA3~μA0 直接接到控制存储器的地址脚上。它有两个控制端最关键CLR清零信号低电平有效。为 0 时输出强制为 0000控制存储器随之输出 00 号微指令这就是微程序的入口。T1微地址加载信号在 T1 的上升沿把地址转移逻辑算出的新微地址锁存进来。这两者构成了整个控制器的时间骨架。上电瞬间 CLR0地址被摁在 00H把 CLR 置 1 之后每个 T1 上升沿推进一条微指令。实验步骤里专门有一条“将 CLR 设置为 1否则微地址寄存器会一直处于清零状态”看着像废话实际是最容易卡住人的一步CLR 忘了放开单击多少次 start地址都停在 00输出永远是同一条微指令屏幕上什么变化都没有。还有一点值得单独记这个实验的电路里没有微命令寄存器。控制存储器输出的 24 位直接就是全机的控制信号中间不隔一级。省掉这一级的代价是输出会随时序晃动好处是电路简单、现象直观单步走的时候每条微指令发了哪些命令一目了然。复习时如果被问“为什么可以不要微命令寄存器”答案就落在“简化电路、教学演示优先”上而不是它理论上不必要。2.3 地址转移逻辑P1 与 IR7~IR5 怎么选出下一条地址转移逻辑由两级与门、或门搭成输入有三组当前微指令里的后续微地址 μA3~μA0、判别位 P1、指令操作码 IR7~IR5输出是下一条微指令的地址。它的规则只有两条判别位 P1下一条微指令地址含义0直接取 μA3~μA0顺序执行微程序线性往下走1由 IR7~IR5 经简单变换得到分支跳到该操作码对应微程序的入口P10 的那条分支很好理解就是把微指令里自带的 4 位地址原样送进 74LS175。P11 才是这套设计的精髓它不再看微指令自己写的地址而是转身去看指令寄存器里的操作码把操作码做一次简单变换后当地址用。变换的意义在于把“操作码”和“微程序入口”绑定起来硬件不需要查表几根线与门就能算出入口。完整的时序闭环可以这样顺一遍T1 上升沿到来新地址锁进 74LS175控制存储器立刻输出该地址的微指令这条微指令的 24 位里高 19 位作为控制信号发往各部件第 4 位的 P1 和低 4 位的 μA 送进地址转移逻辑逻辑电路据此算出下一个地址等下一个 T1 上升沿再锁存。只要时序信号连续发出微指令就按这个节奏一条接一条吐出来用单步方式就是人工一下一下给 T1。提示IR5~IR7 在本实验中并没有真的接到指令寄存器输出而是接到数据开关上靠手动拨码给操作码。这是教学妥协分析原理时仍按“它来自指令寄存器”来理解。3. 24 位微指令格式19 位操作控制字段加 5 位顺序控制字段微指令格式是这一章最像“背多分”、实际上最需要理解的部分。24 位怎么切、每一位管什么、为什么这么切决定了后面能不能读懂表 7-3 那一大片 0 和 1。3.1 操作控制字段 19 位直接表示法的代价与好处这颗微指令采用全水平型字长 24 位其中操作控制字段占 19 位全部用直接表示法不经过译码器——每一位对应一个微命令该位为 1 就发出这个命令为 0 就不发。好处很直接并行能力强。一条微指令可以同时打开好几个部件比如同时让 ALU 做运算、把结果送上总线、写进寄存器一条顶好几条用微程序自然短。坏处同样直接字长长。19 个微命令就要 19 位微命令再多一点控制存储器位宽就压不住了。作为对比垂直型微指令字短但一条只能干一件事还得靠译码器把编码翻成命令微程序条数暴涨。混合型介于两者之间把微命令分组组内用字段译码。考试里问“水平型与垂直型的区别”落点就在并行性、字长、微程序长度、是否需要译码器这四项上。表 7-1 和表 7-3 是同一个东西的两种排法表 7-1 按功能分组把操作码相关的、寄存器加载相关的、总线相关的归在一起表 7-3 是实际写进 EPROM 的位序。读二进制一定按表 7-3 的位号来理解功能分组再看表 7-1两边对照着看容易错位。3.2 顺序控制字段 5 位μA3~μA0 与判别位 P1低 5 位是顺序控制字段4 位给后续微地址 μA3~μA01 位给判别位 P1。4 位地址意味着最多 16 条微指令这个上限刚好卡住实验规模取指段 4 条四条机器指令的执行段分掉剩下的 12 条一个不多一个不少。这 4 位和 74LS175 的 4 位输入是同一组线所以微地址寄存器不需要更多位宽。P1 单独拎出来是因为它要参与地址转移逻辑的判断P1 为 0 时 μA 有效P1 为 1 时 μA 被忽略、改由操作码决定下址。这里有个常见误解以为 P11 时 μA 字段就没用了。实际上 μA 字段仍然占着那 4 位只是这一拍不参与下址计算它可能被用作别的用途也可能就是设计时留空。读表时看到 P11 的微指令低 4 位还有值不要以为表印错了。3.3 字段对照表与一段能自查的解码脚本把表 7-3 的位序整理成一张对照表背这一张就够了位号字段有效电平作用23~20S3 S2 S1 S0高ALU 运算功能选择19M高ALU 工作模式选择18Cn高进位输入控制17CE高计数/使能类控制16WE高写使能15LOAD高通用装载控制14LDR0高装入 R013LDDR1高装入暂存器 DR112LDDR2高装入暂存器 DR211LDIR高装入指令寄存器10LDPC高装入程序计数器9LDAR高装入地址寄存器8ALU→BUS高ALU 输出送上总线7PC→BUS高PC 输出送上总线6SW→BUS高开关量送上总线5R0→BUS高R0 输出送上总线4P1高判别位决定是否分支3~0μA3~μA0高后续微地址手工对 16 行二进制太容易错位写几行脚本代劳更稳# 按表 7-3 的位序把 24 位微指令二进制串拆成字段字典 FIELD_MAP { 23: S3, 22: S2, 21: S1, 20: S0, 19: M, 18: Cn, 17: CE, 16: WE, 15: LOAD, 14: LDR0, 13: LDDR1, 12: LDDR2, 11: LDIR, 10: LDPC, 9: LDAR, 8: ALUBUS, 7: PCBUS, 6: SWBUS, 5: R0BUS, 4: P1, 3: uA3, 2: uA2, 1: uA1, 0: uA0, } def decode(word: str) - dict: word word.replace( , ) # 容忍手抄时夹的空格 assert len(word) 24, 一条微指令必须是 24 位 bits {FIELD_MAP[i]: word[23 - i] for i in FIELD_MAP} # 低 4 位拼成下一条微地址转成实验中惯用的两位八进制 raw .join(bits[fuA{k}] for k in (3, 2, 1, 0)) bits[next_oct] format(int(raw, 2), 02o) # 收集这一拍真正发出的控制命令方便肉眼核对 bits[active] [k for k, v in bits.items() if v 1 and k not in (S3, S2, S1, S0, M, Cn, P1)] return bits print(decode(100101101100000011100010))word[23 - i]这行的意思是位号 23 对应字符串第 0 个字符位号 0 对应第 23 个字符因为二进制串是从高位往低位写的。next_oct把 μA3~μA0 拼起来再转八进制和流程图上标的地址保持同一进制。active把全 1 的字段挑出来单步实验时可以拿它跟指示灯对照——灯亮的集合应该和这个列表完全一致不一致就说明地址跳错了或者表抄错了。拿 06 号微指令那串100101101100000011100010跑一遍S 字段是 1001LDR0 和 LOAD 为 1R0→BUS 为 1下址 μA 是 0010八进制 02。这组信号的含义是让 ALU 做一次加法、结果经总线写回 R0正是 ADD 指令“R0(A)→R0”的执行动作。能这样反推出来说明字段表真的记住了。4. 微程序流程四条机器指令的取指段与执行段怎么走格式记住了接下来要回答的是“这 16 条微指令分别属于谁、按什么顺序串起来”。这一章把指令格式、取指公共段、执行段和地址进制四件事连起来讲。4.1 四条机器指令与操作码到微程序入口的映射实验只做四条指令规模小但指令格式的差异很典型助记符机器码长度功能IN000 XXXXX8 位开关量送 R0ADD001 XXXXX A16 位R0(A)→R0STA010 XXXXX A16 位R0→(A)JMP011 XXXXX A16 位A→PC跳转到 A 处执行高 3 位是指令操作码正好对上 IR7~IR5 三根线IN 只有操作码没有内存地址所以是 8 位另外三条带 8 位地址 A是 16 位。这个“8 位 vs 16 位”的差异不是随便定的IN 的数据来源是开关而不是主存不需要地址字段。关键在映射关系操作码 000、001、010、011 并不是直接等于微程序入口地址而是经过地址转移逻辑的简单变换后才成为入口。P11 的那一拍硬件把 IR7~IR5 取过来变换一下当地址用。所以复习时被问“操作码怎么找到对应微程序”答案分两步先由取指段最后一条微指令把 P1 置 1再由地址转移逻辑对操作码做变换得到入口地址。4.2 公共取指段00 到 03 这四条微指令在干什么四条机器指令的取指过程完全相同所以共用一段微程序占据 00、01、02、03 四个单元。这一段是整个流程里唯一“所有指令都要走”的部分也是分析任何一条指令微程序的起点。00 号微指令的作用是把 PC 送上总线并打入地址寄存器为读主存做准备01、02 依次完成读数、送指令寄存器等动作03 号是取指段的收尾它的 P1 位为 1μA 字段为 0000——注意这里 μA 虽然是 0但因为 P11它不生效真正决定下址的是此刻 IR7~IR5 上的操作码。这解释了一个实验里非常典型的现象把操作码开关拨成不同组合前面 00~03 四条微指令的输出完全一样从第四条之后才开始分岔。如果观察到 00 到 03 就变了那是地址转移逻辑接错了如果拨了操作码但一直不分支先查 P1 位有没有被正确置 1。取指段还有一个隐含动作PC 加一。执行完一条指令后要能回到取指段重新开始PC 必须指向下一条指令这个“回到 00”的收尾通常由执行段最后一条微指令完成它的下址指回 00 或者指回取指段的某一条。分析流程时如果发现某条微指令 P10 且 μA 指向 00 附近多半就是这条“回取指”的收尾指令。4.3 执行段与八进制地址为什么流程图上的数字是八进制从 04 开始是各指令的执行段。执行段每条指令占几个单元不完全一样IN 最简单把开关量送进 R0 就结束ADD 要取操作数、做加法、写回STA 要把 R0 写进内存JMP 只改 PC。所以流程图 7-2 上四个分支的方框数并不相等。微地址用八进制标不是随手选的。μA 正好 4 位4 位二进制恰好对应 1 位八进制0000到1111就是八进制的00到17一望即知不需要像十六进制那样两位对四位、还要记 A~F。整个控制存储器 16 个单元八进制两位数就写完了流程图方框右上角标一个数就是一条微指令。读流程图有个笨办法但很有效一个方框 一条微指令 一个 CPU 周期方框之间的箭头就是 μA 字段或 P1 分支的结果。把图上的箭头逐条翻译成“这条的 P1 是 0 还是 1、μA 是多少”整张图就变成了表 7-3 的可视化版本。反过来从表 7-3 的二进制反推箭头也能验算自己有没有读错位。思考题里那个“四条指令的微程序能否在控制存储器中随意安排位置”是最值得展开的一问。答案是不能理由有三层其一操作码到入口地址的映射由地址转移逻辑的固定接线决定硬件只会算出那几个地址把微程序挪走就找不到了其二微程序内部的分支依赖固定的 μA 值前面的微指令写死了后面的地址挪动会拆散这些引用其三为了简化硬件设计时刻意让某些微程序的相对位置有约束比如共用收尾段、共用取指段。一句话微程序的地址在硬件设计阶段就被固化了运行期和实验期都不能改。5. 易错点排查微程序控制器实验里最容易翻车的五处这一章是血泪经验区。下面五条都是单步调试时真会卡住人的地方按“错在哪—为什么错—怎么改”的顺序写对号入座比从头重做快得多。5.1 易漏点一CLR 忘了从 0 放回 1为什么漏实验步骤里“预设置 CLR 置 0”和“将 CLR 设置为 1”隔了好几步中间还要开电源、看指示灯很容易把后面这一步当成可选项跳过。而且 CLR0 时电路看起来完全正常电源灯亮微指令也有输出。怎么补把它做成固定动作。上电后第一件事是确认地址显示为 00、输出是 00 号微指令第二件事立刻把 CLR 拨到 1再开始单击 start。判断依据很简单CLR 仍为 0 时无论单击多少次 start微地址始终是 00输出纹丝不动。看到“点了没反应”先看 CLR而不是先去查接线。5.2 易漏点二把微程序和机器指令程序当成一回事为什么漏两个都叫“程序”都存放在存储器里画出来的流程图长得也像概念上容易糊成一层。怎么补用存储层次把它们劈开。机器指令程序存在主存里由程序员编写运行时可以改微程序存在控制存储器里由设计机器的人固化在 EPROM 中运行期只读。一条机器指令对应一段微程序一段微程序由若干条微指令组成一条微指令是一个 CPU 周期。三层关系是“指令 → 微程序 → 微指令”不能跳层。考试里问“微指令与指令的区别与联系”就从存储介质、编写者、是否可改、执行粒度这四个维度答。5.3 易漏点三P11 时还去读 μA 字段当下址为什么漏读表时习惯性把低 4 位当“下一条地址”看到 P11 那几行低 4 位还有非零值就以为下址是它。怎么补养成先看 P1 再看 μA 的读表顺序。P10 才轮到 μA 说话P11 时 μA 整段失效下址由 IR7~IR5 变换得到。验证方法很直接把操作码开关拨成不同值如果 P11 那条微指令之后地址跟着操作码变了说明自己读对了如果地址只跟 μA 走说明把分支看成了顺序。5.4 易漏点四以为 A4~A10 接地只是省事为什么漏电路图上七根线一起接地视觉上像“这些脚用不上接个地了事”没人会去想它其实限制了容量。怎么补把它和“只有 16 个单元”这件事绑在一起记。A3~A0 四根线给出 16 个地址高位全部为 0所以地址空间就是 00 到 17八进制。这直接决定了微程序最多 16 条也决定了四条指令的执行段怎么分配。被问“控制存储器实际容量是多少”答“16×24 位”而不是 2K×24 位。5.5 易漏点五地址进制混用八进制抄成十六进制为什么漏流程图用八进制标地址写代码或记笔记时手一滑写成0x10看着像“第 10 号”实际是第 16 号早就超出 16 个单元了。怎么补全程统一用八进制两位数00到17不加前缀不换算。看到010就念“八号”看到014就念“十二号”。表 7-3 里的地址列本来就是八进制抄的时候连前导 0 一起抄010不要写成10一省就错。6. 复习清单从字段编码到实验排障的查漏补缺表考前或实验前照着下面这张表过一遍能过就基本稳了过不了的格子就是回去补的地方。模块必须能默写的内容自检方式控制存储器3 片 2716 拼成 2K×24A3~A0 寻址实际 16 单元说出 A4~A10 为何接地微地址寄存器74LS175 四位CLR 低有效T1 上升沿锁存画出 CLR0 → 00H 的时序地址转移逻辑P10 走 μAP11 走 IR7~IR5 变换值给定操作码说出入口地址微指令格式24 位 19 位操作控制 5 位顺序控制默写位号对照表指令系统IN/ADD/STA/JMP 对应 000/001/010/011写出四条机器码与长度取指段00~03 公共03 号 P11 分岔解释为何前四条输出不随操作码变排障顺序也固定下来别乱试第一步看 CLR 是否已置 1第二步看微地址显示是否随 start 递增第三步看 T1 有没有真的产生上升沿第四步看输出 24 位与表 7-3 是否逐位一致第五步才去查地址转移逻辑的接线。前四步都是“看一眼就知道”的真正需要动线的只有最后一步把顺序倒过来做会浪费大量时间。再补一个自查习惯每读完一条微指令就用 3.3 那段脚本跑一遍把active列表和亮着的指示灯对一次。对不上不一定是自己读错也可能是开关拨错或某根线虚接但至少能把“我理解的”和“电路在做的”摆到台面上比。我第一次做这个实验时卡了快四十分钟原因就是 CLR 一直留在 0屏幕上地址不动我却在反复检查地址转移逻辑的门电路越查越怀疑人生。从那以后我每次上电都强制走一遍“地址是否为 00 → CLR 是否已置 1 → 单击 start 地址是否加一”这三步再往下做别的。这份笔记里的字段表和排障顺序都是从那次翻车里整理出来的希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?