实验(二):从手动读写到程序自动执行——深入理解CP226实验仪上的存储器控制
1. 从手动操作到程序自动执行的技术跃迁
第一次接触CP226实验仪时,我完全被面板上密密麻麻的开关和指示灯震撼到了。作为计算机组成原理的经典教学设备,这台机器完美还原了冯·诺依曼架构的核心部件。最让我着迷的是主存储器EM的手动读写过程——通过拨动K15-K0开关设置地址,用K23-K16开关输入数据,再配合MAREN、EMWR等控制信号,就能完成最原始的"存储程序"操作。
存储器读写本质上就是三件事:告诉设备要操作哪个位置(地址)、传递要处理的数据(数据总线)、说明操作类型(控制信号)。在CP226上,这三个要素分别对应:
- 地址设置:通过X2X1X0开关组合选择MAR寄存器
- 数据输入:8位数据开关组K23-K16
- 控制信号:MAREN(地址写入)、EMWR(存储器写)等
记得第一次尝试将55H写入10H单元时,我反复检查了三遍开关位置。当按下STEP键看到EM数码管亮起55H的瞬间,突然理解了计算机最底层的存储机制——原来那些高级语言里的变量赋值,本质上就是这样的电信号传递。
2. 存储器的双面角色:数据与指令的容器
在模型机中,存储器EM扮演着双重角色。通过对比实验可以清晰看到这种分化:
| 场景 | 地址来源 | 数据流向 | 典型控制信号组合 |
|---|---|---|---|
| 指令读取 | PC | EM→IR→CU | PCOE=0, EMRD=0 |
| 数据存取 | MAR | EM↔累加器A | MAROE=0, EMEN=0 |
关键差异在于地址提供者:当PC输出地址时,EM作为指令存储器;当MAR输出地址时,EM变身数据存储器。这解释了为什么实验要求中强调"不允许PC和MAR同时输出地址"——就像不能同时用两个遥控器操作一台电视。
实测中我发现个有趣现象:执行"LDA 10H"指令时,前一步PC提供的地址10H被当作指令位置,下一步MAR提供的同一个10H却成了数据地址。这种"地址重载"正是存储程序思想的精髓所在。
3. 控制信号的交响乐
控制信号就像乐队的指挥,协调各个部件的工作节奏。通过示波器观察,我记录了典型写操作时各信号的时序:
// 写入EM的时序关系 always @(posedge STEP) begin MAREN <= 0; // 地址锁存 #10 EMEN <= 0; // 存储器使能 #5 EMWR <= 0; // 写信号 #20 // 保持时间 MAREN <= 1; EMEN <= 1; EMWR <= 1; // 复位 end三个关键时序要点:
- 地址信号要先稳定(MAREN最先有效)
- 写信号必须晚于数据稳定(EMWR最后拉低)
- 所有信号复位前要保持足够持续时间
曾因EMWR信号过早生效导致写入失败,数码管显示FFH(默认值)。后来用单步模式逐步调试,发现是STEP按键释放太快,信号维持时间不足。这个坑让我深刻理解了时序控制的重要性。
4. 从单步执行到连续运行
手动操作虽直观,但效率太低。CP226的小键盘编程功能实现了质的飞跃:
- 指令编码:每个按键对应特定操作码
- 例如"1"对应LDA,"2"对应ADD
- 地址输入:通过数字键输入十六进制地址
- 自动执行:RUN键启动连续运行
编写一个将两个数相加的程序:
MOV A, [10H] // 取第一个数 ADD A, [11H] // 加第二个数 MOV [12H], A // 存结果程序自动执行时,控制信号的产生方式发生根本变化:
- 手动模式:由实验者拨动开关产生
- 自动模式:由微程序控制器按节拍自动生成
- 信号时序:严格遵循时钟周期的上升沿触发
通过逻辑分析仪捕捉到的信号波形显示,自动执行时各控制信号间隔精确到100ns,远快于手动操作的秒级间隔。这就是自动化带来的效率提升。
5. 存储器实验的深层启示
完成这个实验后,我梳理出三点核心认知:
层次化抽象:从开关比特到高级语言的跨越
- 底层:电信号的开/关(1/0)
- 中层:十六进制机器码
- 高层:人类可读的编程语言
控制信号的本质:硬件功能的软件化定义
- 同一组电路通过不同控制信号实现不同功能
- 微程序将硬件操作编码为可存储的指令
计算机的自指特性:
- 程序作为数据存储在EM中
- 指令读取又改变EM中的数据状态
- 这种循环引用是图灵完备性的基础
记得调试一个循环程序时,PC寄存器不断跳转的样子就像在追逐自己的尾巴。这种"自食其尾"的特性,或许正是智能的原始形态。每次实验结束关闭电源前,我总会手动写入一段小程序让它自
