计算机组成原理实验指南:从基础部件到微程序控制器的完整实战
简介这是一份《计算机组成原理实验教程》PDF文档面向计算机专业本科生或自学数字系统与计算机硬件基础的读者聚焦基本运算器实验帮助理解运算器的组成结构、工作原理以及算术、逻辑、移位运算的控制方式。文档基于TD-CMA实验系统展开覆盖实验系统硬件布局图、实验注意事项、实验目的、实验设备、实验原理和实验步骤并附有运算器逻辑功能表表1-1与ALU外围接线图详细说明了S3⋯S0和CN控制信号对运算结果的影响以及进位标志FC、零标志FZ的锁存与观测方法。实验操作部分给出了按图1-4连接实验电路、将时序单元KK2置为单拍档、KK1/KK3置为运行档再通过ST按钮产生T4上升沿向暂存器A/B置数并根据功能表设置控制信号、观察数据总线LED显示结果的完整流程还配有联机软件数据通路图辅助验证。整个资源仅含1个PDF文件大小1.63MB便于直接下载与打印也适合课前预习和实验现场对照。目前已有243人学习使用对正在开展计算机组成原理课程实验或准备相关考核的同学是一份精炼且可操作的参考资料。1. 第一次进计组实验室的人都在同一块板上栽过跟头第一次进计组实验室大多数人对着实验箱的第一反应是这一堆跳线和指示灯跟书架上那本唐朔飞《计算机组成原理》有什么关系等通电、拨码、看灯一路跑到微程序控制器实验才意识到教材里抽象的总线竞争、建立时间、控制信号全是这块板子上真实可见的电平时序。这类实验教程的典型主线是线性推进运算器→存储器→寄存器与总线→微程序控制器→整机模型前几轮用开关和 LED 观察单部件行为后几轮拼成能跑机器指令的小计算机。适合三类人预习实验课的本科生、408 复试要补动手能力的考生、自学只刷题没连过线的实战派。教程不厚真正值钱的是每轮实验背后的信号时序。2. 读懂实验平台与整机骨架三个派别、一张总图、一种时序习惯先解决一个实际操作前绕不开的问题你到底在什么设备上做计组实验。2016 年前后国内高校的配置差异很大但基本落在三条路线上选型直接决定了后续每个实验的写法。2.1 三种主流实验路线实验箱、FPGA 与纯仿真的选型路线一是 74 系列芯片实验箱。以 TD-CMA、TEC-5 这类教学实验箱为代表板上排布着 74LS181 运算器、6116/6264 静态 RAM、2816 EPROM 控制存储器以及 74LS245 三态总线条。部件之间的连接靠杜邦线完成数据用拨码开关输入结果用 LED 显示。这类平台和白中英、唐朔飞两套主流教材的指令系统贴合最紧教程里的连线图可以直接照抄。优点是每个芯片都是真实器件你能用逻辑笔和示波器量到 TTL 电平竞争、毛刺这类仿真里永远见不到的物理现象缺点是飞线容易松动排障成本高。路线二是 FPGA 开发板加 Verilog。用硬件描述语言把 ALU、寄存器堆、控制器写出来综合后下载到板子。优点是不再耗时于接线和电气问题缺点是接触不到真实芯片的驱动特性和时序竞争而且时序约束这个概念对新手极不友好。如果拿到的是这种平台教程里的连线图要“翻译”成信号列表每个使能端变成一组 reg 或 wire后面讲字段译码时会给出对应关系。路线三是纯仿真软件。Logisim、头歌这类虚拟实验平台打开浏览器就能搭电路、跑时钟适合预习和课前验证结论。很多学生用 Logisim 把模型机搭得有模有样但仿真器默认信号是理想化的——没有毛刺、没有建立时间而这两样恰恰是真实实验里最频繁的翻车点。| 平台 | 上手成本 | 可观察的物理现象 | 与教材指令系统的耦合度 | 常见环境 | | 74系列实验箱 | 高需逐根接线 | 电平竞争、毛刺、负载效应 | 最高 | TD-CMA、TEC-5 | | FPGA开发板 | 中需写Verilog | 受限偏逻辑层次 | 中 | Quartus、Vivado | | 纯仿真软件 | 低 | 无 | 取决于模型精度 | Logisim、头歌 |选平台不是选择题而是预算题学校配什么就用什么。但无论哪个平台教程第 1、2 章的整机电路总图必须吃透因为那是后续所有实验的共同坐标系。2.2 整机电路骨架单总线结构如何串起五大部件所有计组实验教程的第一张重头图逻辑上都应该是模型机结构总图。这张图的典型画法是一条数据总线 DBUS 横在下方运算器 ALU、寄存器堆 R0~R3、程序计数器 PC、地址寄存器 MAR、指令寄存器 IR以及外部主存储器 RAM全部挂在这条总线上。每个部件与总线之间隔着一组三态门由独立的输出使能信号控制。这里最核心的约束是“单总线”三个字任一时刻只能有一个部件向总线发送数据。所以每轮实验本质上都在训练同一件事——判断当前时钟周期里哪个使能信号该拉高、哪个必须保持低电平。举个例子执行“PC→BUS”这条微命令时PC 的输出使能 PC_O 必须为高其余挂在总线上的部件输出全部保持高阻态一旦两个部件同时被使能总线立即进入竞争状态LED 显示乱码整个实验报“数据不对”。我的习惯是让学生读图时先找三样东西电源与地VCC/GND的分布、各芯片片选与输出使能引脚的编号、时钟开关的连接位置。找到这三个再拿教程末尾的整机连线清单逐根核对跳线九成接线故障都能定位。2.3 操作面板读法拨码开关、LED 极性与时钟源动手之前还必须扫掉一个认知障碍——面板。一台典型实验箱的前面板分几个功能区数据输入区是一排 8 位或 16 位拨码开关用于把初始数据置入寄存器或存储器数据显示区是与数据总线对应的 LED地址与指令区用于设置存储器地址或直接输入微地址控制区有清零、单步、连续、读写切换等按键时钟源则区分手动按键和自动脉冲。有一个细节必须最先确认LED 是低电平点亮还是高电平点亮。不同型号实验箱正好相反教程的功能说明里会写明但很多人跳读这一页结果把结果完全看反。另一个常见坑是单步时钟与连续时钟的混用。运算器、存储器实验应该用单步时钟按一次键打一个脉冲等 LED 稳定再记录微程序控制器实验则需要连续时钟配合示波器观察各控制信号的相对关系。教程的实验步骤里一般会标注建议的时钟方式照做能省掉大量误判。提示上电后先按一次总清零把 PC、微地址计数器、各寄存器复位到已知状态。否则你看到的是上一次实验遗留的随机状态整个排障会被误导。3. 运算器、存储器与寄存器堆三个基础实验一次把时序与使能练透基础实验一般按“部件—总线—控制”的顺序排布每一轮都在为整机联调攒经验。下面按最常见的实验箱配置把三个必做实验的操作要点和最容易错的地方拆开讲。3.1 ALU 实验功能选择码、进位输入与组间串行进位运算器实验是第一轮动手。目标很朴素给定操作数 A 和 B通过功能选择码让 ALU 完成加、减、与、或、异或用 LED 看结果。教学平台使用 74LS181 这类 TTL ALU 芯片时功能由六个引脚决定S3~S0 四个功能选择端M 端决定算术/逻辑模式Cn 是低位进位输入。最容易被忽视的就是 M 和 Cn 的配合。做加法时 M 必须为低电平、Cn 必须为低电平此时相当于最低位有进位输入 0结果才与功能表一致如果 Cn 悬空或者被拨到高电平结果会整体少 1。我见过不少学生对着功能表怎么都对不上计算结果最后发现只是 Cn 拨反了。多片 74181 级联做 16 位运算时低位组的进位输出 Cn4 要送到高位组的进位输入 Cn这就是组间串行进位——电路简单但延迟逐级累加。实验教程的选做部分通常会让你换用 74182 先行进位发生器对比一次值得做能直观感受到延迟从哪来。如果走 FPGA 路线等价的功能验证可以这样写module alu_testbench; reg [3:0] a, b, s; reg m, cin; wire [3:0] y; alu uut (.a(a), .b(b), .s(s), .m(m), .cin(cin), .y(y)); initial begin // 加法A5, B3, 期待 Y8 a 4d5; b 4d3; s 4b1001; m 1b0; cin 1b0; #10; // 减法A5, B3, 期待 Y2 a 4d5; b 4d3; s 4b0110; m 1b0; cin 1b1; #10; // 逻辑或A5(0101), B3(0011), 期待 Y7(0111) s 4b1111; m 1b1; #10; $stop; end endmodule这段代码不是完整工程只是验证思路把功能选择码、模式端、进位输入做成例化信号逐个组合核对。参数说明s 的取值必须对照所用 ALU 的功能表74LS181 的真值表在每本教材附录里都有别凭记忆填m1 时 Cn 不参与逻辑结果赋任意值均可但建议固定拉低避免悬空每条激励后加 #10 等待组合电路稳定再做断言。仿真全对再上板查线时间能省一半。3.2 存储器实验地址、数据、写使能的先后顺序不可乱存储器实验是第二个必经关卡。多数实验箱用 6116 或 6264 静态 SRAM容量分别是 2K×8 和 8K×8实验要求通常是在若干地址写入数据再读回校验。SRAM 的读写由三条信号线决定地址线、数据线、写使能 WE。正确的写入顺序是先给地址并确认地址 LED 无误再给数据然后拉低 WE 保持足够时间最后恢复 WE 为高。顺序不能反原因是 SRAM 的写时序要求数据有效信号必须覆盖 WE 下降沿和上升沿附近的建立与保持窗口如果 WE 先拉低、数据后到写入的就是不确定值。手工拨码动作慢这个坑不容易暴露但在自动时钟连续运行时立刻现形——写入的数据随机出错。用示波器量 WE 引脚时检查两点低电平脉宽是否达到数据手册最小值6116 一般要求不小于几十纳秒实验箱时钟频率通常远低于此很少真正超标但习惯要养成WE 边沿与地址/数据边沿之间有没有因导线过长导致的畸变。教程的存储器实验一般还会安排一个“破坏性读出”观察项读操作后原数据保持不变这是 SRAM 与 DRAM 的根本区别答题和面试都爱问。写操作的完整步骤可以固定成五拍每次照着做置地址拨地址开关到目标单元看地址 LED 确认。置数据拨数据开关到待写入值。拉低 WE拨写开关使 WE 有效手工模式保持约一秒。恢复 WE拨回高电平完成写入。读回校验切读模式重发同一地址对比数据 LED。3.3 寄存器堆与三态门总线冲突是整机联调的第一道坎第三个基础实验是寄存器堆和总线传输核心器件是 74LS245。这是一片双向三态缓冲器DIR 决定传输方向OE 决定是否启用输出。寄存器堆的每个寄存器输出都要过一组三态门才接到数据总线写入靠寄存器写使能读出靠三态门使能二者必须互斥。实验里最常见的错误是在同一个总线周期内置了两个输出使能总线上的多个驱动源互相“打架”LED 显示不亮不灭的中间电平。用逻辑笔量总线引脚会看到一段既不是干净高电平也不是干净低电平的浮空争吵状态。解决办法是拿教程的整机连线图逐个确认三态门 OE 的来源——它们必须来自微程序控制器或实验箱的功能键而不是被拨码开关直接驱动。拨码开关直驱三态门在单部件实验里勉强能用到了整机联调阶段就是定时炸弹。防止复发的方法是做一张“总线占用表”每行一条微指令每列一个输出使能信号检查表中每一行只允许一个输出使能为有效电平。这张表画清楚第四章的微程序编码就成功了一半。4. 微程序控制器实验把机器指令翻译成微命令序列的完整闭环微程序控制器是计组实验的分水岭。考研复习时刷王道计组讲义微程序那节背得滚瓜烂熟真坐到实验箱前填 EPROM 微码还是两眼一抹黑——讲义教你怎么答概念题实验教你怎么让这些位去驱动真实电路。4.1 两级映射机器级操作码与控制存储器微地址微程序控制器的核心思想是每一条机器指令对应控制存储器EPROM里的一段微程序微程序由若干条微指令组成每条微指令在同一时钟周期内并行输出一组微命令。实验报告必须理清的两级映射第一级机器指令级。操作码指定操作类型比如 1001 表示 ADD0110 表示 JMP。第二级微指令级。控制存储器的地址指定一条微指令微指令的各个字段直接驱动运算器、存储器、总线的使能端。落到实验操作上流程通常是用十六进制把每条微指令编码写入 EPROM在面板上拨入机器指令操作码控制器自动完成“取指→译码→执行”。要交的报告里必须画两条链机器指令的地址转移图以及每条微指令的字段值表。地址转移图画错微程序流程一定跑不对这是整章实验评分的重头。4.2 微指令编码直接控制、字段译码与分组依据微指令的字段设计直接决定控制存储器字长和实验工作量的级别两种编码方式需要对比着理解。直接控制编码也叫水平型编码每个微命令占一个二进制位一条 30 位的微指令可以包含 30 种微命令。优点是输出几乎没有译码延迟时序最透明适合教学缺点是指令系统一大字长迅速膨胀手写编码表时极易出错而且每轮实验要拨的开关位数非常多。字段译码方式把互斥的微命令分进同一组用较少的二进制位代替一组独热位控制器内部用译码器还原。例如 8 个互斥命令可以压成 3 位。优点是字长大幅缩短缺点是增加一级译码延迟且分组不合理时会把本不互斥的命令错误合并。教程一般会给出推荐分组按“运算器控制组、存储器控制组、总线控制组、PC 控制组”划分照这个分组写编码出错率最低。字段译码之后74LS245 的 DIR、74LS181 的功能选择码 S3~S0、寄存器写使能都由译码器的输出引脚驱动。这正好回答了 2.1 里 FPGA 平台怎么“翻译”连线图的问题把原理图里的每根控制线映射为 Verilog 里控制寄存器的每一位即可。4.3 加法指令的微程序走查分支微指令与下地址字段用一个最小例子把流程串起来。假设模型机指令系统里有 ADD R0, R1操作码 1001控制存储器字长 16 位高 8 位微命令字段低 4 位下地址字段一位测试条件位 T。T0 时下一条微指令地址由低 4 位直接给出T1 时下地址由操作码经译码电路决定这就是分支微指令。| 微地址 | 微命令高8位示意 | T | 下地址 | 操作含义 | | 00H | PC→总线MAR←总线 | 0 | 01 | 取指PC 送地址寄存器并自增 | | 01H | RAM→总线IR←总线 | 0 | 02 | 读存储器指令送入 IR | | 02H | 按操作码分支 | 1 | 依操作码 | 译码ADD 进 20H | | 20H | R1→总线Y←总线 | 0 | 21 | 取第一个操作数 | | 21H | R0→总线ALUADD→R0 | 0 | 00 | 运算结果回写返回取指 |这张表就是要写进 EPROM 的稿子。注意 02H 这条T1下地址不是固定的而是由指令操作码译码得到这就是硬件的“条件跳转”。实验中发现指令永远只执行第一条、后续不跳转多半是 T 位定义接反或者译码 ROM 对应地址没有写入。用 Verilog 描述同一分支逻辑常见写法always (*) begin case (ir[7:4]) // 操作码高4位 4b1001: next_ua 8h20; // ADD - 微入口 0x20 4b0110: next_ua 8h30; // JMP - 微入口 0x30 default: next_ua 8h00; // 未定义操作码回到取指 endcase end参数说明ir[7:4] 的位宽取决于教学机的指令字长实际以教程给出的指令格式为准default 分支必须保留否则综合工具会推断出 latch上板后表现是微地址乱跳。给控制存储器烧录时至少要放一条“全 0 微命令 无条件回到 00H”的兜底项否则上电时微地址计数器落在随机地址芯片看着就像坏了。提示烧录微码前先确认 EPROM 的片选和写使能引脚没被跳线短接很多“微程序跑不动”的故障最后都发现是烧录模式没切回运行模式。5. 计组实验避坑手册五类高频故障的现象、原因与对策实验课翻车是常态关键是翻车之后能不能快速定位。下面五类故障覆盖了从基础实验到整机联调的绝大多数现场事故每一条都按“现象—原因—解决”的顺序写可以直接当排查清单用。5.1 芯片发烫冒烟电源接反与器件插错方向现象上电几秒后某颗芯片明显烫手甚至能闻到糊味断电再上电功能依旧异常。 原因最常见两种。一是连线把 5V 和 GND 短路引到了芯片引脚二是芯片插入插座时方向反了缺口朝向与插座标记不一致导致电源接到地或输出端。 解决立即断电用万用表蜂鸣档量故障芯片 VCC 与 GND 引脚的电阻接近 0 说明内部已击穿只能更换。之后把整条通路上的跳线拍照留存再拆线逐根核对电源线。芯片冒烟属于不可逆的物理损坏实验箱提供的备用芯片数量有限这条纪律不能省。5.2 总线数据冲突LED 半亮不亮的中电平现象数据总线上同一个位对应的 LED 发出暗淡且不稳定的光逻辑笔测量不显示干净的高或低。 原因两个以上三态门同时使能输出。多个驱动源在总线上互相竞争总线电平被钳在 TTL 阈值附近所以灯既不像高电平也不像低电平。 解决先用万用表电压档量总线确认电压在 1V 到 2V 之间而非 0V 或 5V 的干净值然后逐个断开可疑部件的输出使能观察示波器上是否恢复完整高低电平。重点检查 74LS245 的 OE 引脚是否被错误接地常亮或者与其他信号短接。日常预防就是做 3.3 提到的“总线占用表”每行只允许一个输出使能。5.3 存储器写入后读回错误先查顺序再查极性现象连续写入多个地址读回的数据部分正确部分错位或者读出的总是上一次写入的旧值。 原因写时序不满足是头号嫌疑——先拉低 WE 再送数据导致数据建立时间不够或者地址在数据之后变化写进了错误单元。另一个常见原因是面板 LED 极性判断反了记录的数据和实际写入的数据互为反码。 解决把写操作放慢成“地址→数据→WE 拉低→等待→WE 拉高”五拍每拍用电压表确认后再进下一步。针对 LED 极性先用已知数据做交叉验证写全 0 读全 0、写全 1 读全 1如果显示取反说明面板是低电平点亮实验记录表要按反码转换。5.4 手动单步正常、连续运行必错时钟与启动信号问题现象单步执行每条指令都正确切到自动连续时钟后程序跑到中间就乱甚至死循环。 原因连续时钟下多个异步事件同时发生单步时钟掩盖了信号间的竞争冒险。最常见是启动信号没有与时钟同步按键抖动被控制器当成多次启动其次是微地址锁存器的置数端和时钟端由同一个按键驱动按一下既打时钟又改地址锁存的是旧地址还是新地址取决于亚稳态的胜负。 解决把启动按键换成由时钟上升沿同步的电路或者养成固定操作顺序先按总清再拨到连续模式闭合运行开关最后打开时钟输出。先复位、后运行十秒内能排除这一大类故障中最常见的一种。5.5 仿真全对、上板全错毛刺、扇出与悬空引脚现象Logisim 或 ModelSim 仿真结果完全正确代码下载到 FPGA 或接到实物实验箱后输出不稳定或全错。 原因仿真器默认信号无延迟、无噪声真实电路存在组合逻辑毛刺比如 ALU 进位链上的竞争还有扇出超限一个信号驱动太多负载导致电平抬不上去以及未用输入引脚悬空引入的干扰。 解决给关键控制信号加一级输出寄存器打一拍这是 FPGA 设计里最通用的一招能消除大部分时序类故障扇出不足就在信号后加缓冲器或换驱动能力更强的引脚所有未用输入显式接地或上拉不允许悬空。这一条教程正文通常不会写满但它是我在各种平台上都见过的通用翻车点。注意排障顺序永远是“电源→时钟→逻辑→接线”。先确认每颗芯片电源正常再确认时钟存在且频率符合预期然后用逻辑笔看控制信号是否随单步按键逐位变化最后才怀疑连线。跳过前两步直接改逻辑大概率是浪费时间。6. 从验证走向设计给自己加一条指令并完整验收一轮做完教程里的所有验证型实验最值得投入的一轮练习是“给自己加一条指令”。选一个空闲操作码比如 1010 定义为 SUB R0, R1按四步推进先画数据通路确定 R1 进 ALU、R0 经总线进 ALU 另一侧、结果回写 R0 的完整路径再分配微命令在现有微指令字段表里找空闲位或复用相容位接着定微程序入口和分支在译码地址处填入新入口并把新增的几行微码写进控制存储器最后单步走查逐拍记录控制信号并核对与设计是否一致。验收标准可以定三条连续运行同一程序十次结果一致单步与连续两种模式结果一致把 WE、ALU 功能选择等关键信号引到示波器上能观察到与预期相符的脉冲序列。三条全过这条指令才算真正“造”出来了。我布置过一次“加一条 JZ 条件转移指令”的选做作业一个学生仿真全对、上板就错最后定位到他把条件判断信号接成了 ALU 输出的最高位而不是零标志位。教科书上“Z 标志由零检测电路产生”一句话落到真实电路里需要你自己加判断逻辑修正那一刻他才真正把数据通路和控制器串到了一起。这种从“看懂教程”到“改得动硬件”的差距只能靠完整走一轮设计型实验来弥合。一个长期有用的习惯每轮实验结束前给当前接线拍一张照片备份一版微指令编码表并标注修改日期下一次实验开始前先恢复现场再动手。实验课最大的敌人不是难而是“不知道上一轮改了什么”。希望这些方法和教训能帮到你少烧几块芯片多看几条干净的波形。本文还有配套的精品资源点击获取