
在实验室带计算机组成原理实验这些年我见过太多学生在“存储器实验”这一步翻车插线半小时拨码五分钟读回来全是 FF然后开始怀疑芯片、怀疑实验箱、怀疑人生。这个实验看起来只是“往芯片里写数据再读出来”但它其实是整门课里承上启下的关键节点——弄懂了它后面 CPU 模型机、中断、DMA 都会顺不少弄不懂实验报告抄完也就过去了脑子里什么都没留下。这篇内容不止讲“怎么把实验做完”更多是把我自己踩过的坑、学生反复问的问题、以及实验背后真正要考核的原理一次性讲透。内容以常见的 TDN-CM 这类教学实验箱为例原理对所有 SRAM 实验平台通用从芯片引脚、地址译码讲到故障排查适合正在上计算机组成原理课、准备考研复试或者想补一补存储器基础的人。1. 实验整体认识先把“存储器”三个字落到实处这个实验的全称是“存储器实验”任务核心一句话通过实验箱上的开关、按键或模型 CPU对一片静态随机存储器SRAM进行读写操作验证其工作原理。听起来简单但实际涉及的知识点覆盖了地址总线、数据总线、控制总线、三态门、时序配合几乎是后面所有实验的地基。1.1 这个实验到底在做什么做实验前很多同学有一个误区以为存储器实验是“把程序烧进去”的实验。不是。这个实验面对的是一个裸的、没有任何软件管理的 SRAM 芯片比如常用的 61162K×8 位或 62648K×8 位。你要做的是像硬件工程师一样手动把地址信号、数据信号、读写控制信号按照芯片手册的要求送到芯片引脚上让它完成“写入”和“读出”两个操作。实验一般分两个层次手动模式实验箱上的拨码开关模拟地址总线和数据总线按键模拟读写控制信号一位一位拨进数据再读回来看是否一致。自动/模型机模式把 SRAM 挂到实验箱自带的模型 CPU 总线上通过执行几条访存指令比如“把某个地址的数据取到寄存器”“把寄存器数据存到某个地址”观察 CPU 和存储器之间怎么配合工作。第二个层次实际上就是在回答那个经典问题——“CPU 和内存到底是怎么通过总线交换数据的”。这个等会儿专门展开讲。1.2 先建立一张全景图再动手很多学生做实验之所以乱是因为脑子里没有一张“数据流程全景图”。我建议你做实验前先画一张这样的图CPU / 开关组 --地址-- 地址译码器 -- SRAM 片选/列选 数据 -- SRAM 数据线(双向) 控制 -- SRAM 的 WE/OE存储器芯片本身没有“智能”它不知道数据该放哪个位置。它只认得地址线给高还是低数据线给高还是低WE写使能、OE读使能、CE片选这几个控制脚是什么电平。所以实验的全部要点就是把这四类信号正确、稳定地送到芯片上。先建立这个认知后面每一步操作你都会知道自己在拨什么、为什么这么拨。2. 核心原理补课搞懂这三件事后面全通我始终认为一个实验如果只做不想那和搬砖没区别。存储器实验里最值得搞清楚的原理有三块芯片引脚怎么工作、地址译码怎么分地址、总线连接为什么需要三态门。这三块全通了实验就是走过场。2.1 SRAM 芯片到底长什么样以 6116 为例教学实验中见得最多的是 61162K×8 位静态 RAM。所谓“2K×8”意思是它有 2048 个存储单元每个单元可以存 8 位1 字节。要访问 2048 个单元需要多少根地址线2 倍的 10 次方是 10242 倍的 11 次方是 2048所以需要 11 根地址线A0~A10。6116 的引脚功能大致如下引脚作用说明A0~A10地址输入决定访问 2048 个单元中的哪一个D0~D7数据输入/输出8 位数据总线双向CE片选低电平有效选中芯片WE写使能低电平有效允许写入OE读使能低电平有效允许读出VCC / GND电源/地一般 5V6116 的操作真值表是这个实验的核心建议背下来CEWEOE操作数据线状态HXX未选中高阻LLX写入高阻输入LHL读出输出数据LHH输出禁止高阻注意一个细节数据线是双向口。写入时数据从外部进芯片读出时数据从芯片出到总线未选中或禁止输出时则呈高阻态既不是高电平也不是低电平相当于断开。正是因为有三态输出能力存储器芯片才能直接“挂”在总线上而不干扰其他设备。2.2 地址译码怎么从一大片地址里找到你要的那一个单片 6116 只有 2K 容量但实验箱的地址总线往往有 16 根A0~A15对应 64KB 地址空间。如果直接把 A0~A10 接到芯片上那剩下来的 A11~A15 怎么办它们决定了这片存储器的“基地址”——也就是它在整个 64KB 空间里占据哪一段。这个工作由地址译码器完成实验箱里一般用 74LS138 三八译码器。举个例子。假设实验箱把 6116 的 A0~A10 直接接系统地址总线低 11 位然后用 74LS138 对高 5 位进行译码译码器输入连接信号CA15BA14AA13G1A12G2AA11低有效G2B接地这种情况下当 A15A14A13 001 且 A12 1、A11 0 时地址高 5 位就是 00101对应的地址范围是多少高 5 位二进制 00101 十进制 5左移 11 位乘以 2K5 × 0x800 0x2800所以这片 SRAM 的地址范围是0x2800 ~ 0x2FFF。如果你写程序或拨开关访问的地址不在这个范围芯片根本不会被选中数据总线永远是高阻态读回来自然全是乱码或 FF。很多“写不进去”的问题根源不在芯片而在译码逻辑。2.3 存储器与 CPU 连接为什么不能只靠一根线先把那个高频问题说清楚以存储器为中心的双总线结构里**CPU 能不能通过系统总线直接和内存交换数据答案是能而且正常情况下 CPU 访问内存就是通过系统总线进行的。**地址总线负责给出要访问的地址数据总线负责双向传数据控制总线负责宣布“这一拍是读还是写”。总线控制权和时序协调由 CPU 内部的总线控制器负责。那“直接交换”为什么还需要控制总线因为总线上不止 CPU 和内存还有外设接口、中断控制器等。如果所有设备同时往数据总线上推信号就会发生总线冲突轻则数据错乱重则烧毁芯片。所以存储器芯片的数据线都是三态结构只有 CE、OE、WE 满足条件时才输出数据CPU 也要在地址稳定之后再发读信号等数据线上电平稳定后再采样。在实验箱上这个过程会被放得很慢、很直观CPU 先把地址放到总线然后拉低读信号存储器把数据放到数据总线CPU 再把数据取走。你用示波器看总线上这几个信号的先后顺序会发现就是一条“数据流流水线”。这个实验的价值就在于此。3. 实验必备电路接线与初始化检查这部分是实操的起点。接线是整个实验里最无聊、也最容易出错的一步。我的建议是先别急着插线把实验箱说明书翻出来对着芯片插座和信号排针一个个确认再动手。3.1 接线前必须搞清楚的信号清单以常见实验箱为例你需要接的信号分四组信号类型实验箱对应排针说明地址总线A0~A10接 6116 的 A0~A10数据总线D0~D7接 6116 的 D0~D7控制信号WE、OE、CE接实验箱的手动按键或模型机控制输出电源VCC、GND5V 电源注意极性有几个接线策略上的经验先接电源和地再接地址、数据最后接控制线。控制线是“总开关”接错了最容易被忽略。地址线和数据线不要扎在一起走。虽然实验箱排针距离很近但区分开便于排查。一定要记住哪个颜色线代表哪一组信号。我见过太多学生用同一颜色线接完全部信号出问题时无从下手。实验箱上的芯片插座一般把 6116 的引脚丝印标得很清楚但如果你用的平台是面包板或 FPGA 核心板引脚映射以你所用的芯片手册为准。3.2 上电前的五步自检别急着上电先花两分钟做完这五步能省掉后面半小时排障核对芯片方向6116 这类 DIP 芯片的缺口朝上/朝插座缺口一致插反了上电就可能烧芯片。我曾经见过学生把芯片插反后依然能读出一堆随机数然后反复怀疑接线。用万用表测电源对地电阻正常应在几十欧以上如果接近 0先查电源短路再上电。检查 CE/OE/WE 的初始电平上电前建议把手动控制开关设置成 CE1未选中、WE1、OE1避免一上电芯片就往总线上输出数据或意外改写。确认地址开关全部初始为 0数据开关全部初始为 0。这样即使控制线误接最坏情况也是往 0 号单元写 0影响可控。打开电源后用万用表量芯片 VCC 和 GND 之间电压确认是 5V 左右再继续。这五步每步都不复杂但实验课上最常见的“上电就异常”基本都是这几个环节出问题。4. 完整实操从手动读写到接入 CPU这一步是实验报告里最核心的内容我把过程分成四个阶段讲手动写入、读回验证、全片测试、接入模型机运行。每个阶段都有明确的判断标准能做到哪一步、看到什么现象、现象说明什么都对得上。4.1 第一步手动模式下写入一个单元以 6116 芯片、地址范围 0x2800~0x2FFF 的接线为例目标是往 0x2800 单元写入数据 0x5A。操作顺序很讲究原则是先稳定地址和数据再给写脉冲。把地址开关拨成 0x2800 对应的二进制。0x2800 0010 1000 0000 0000低 11 位 A10~A0 000 0000 0000即全 0。这一步是在告诉芯片我要访问从译码器选中的那片区域里的 0 号单元。把数据开关拨成 0x5A也就是 0101 1010。数据线上已经准备好要写进去的内容。确认 CE 已经为低、OE 为高然后给 WE 一个低脉冲先拉低等一小段时间再拉高。为什么 WE 要“先拉低再拉高”而不是一直低着因为 SRAM 的写入是边沿/电平结合触发的WE 低电平期间数据线上的数据被锁存进存储单元WE 恢复高电平后存储单元内部保持住这个数据。如果 WE 一直低着芯片一直处于“写使能”状态外部数据一变它也变不能稳定保存。实验箱上一般有专门的手动按键或拨动开关来实现 WE 脉冲直接快速“下降-上升”即可。4.2 第二步读回验证与全片测试写入完成后不改变地址开关把 WE 拨回高电平OE 拨到低电平。此时芯片中 0x2800 单元的数据应该出现在数据总线上实验箱的 LED 灯会显示 0x5A二进制 0101 1010。如果读回的数据和写入一致说明这一轮的地址、数据、控制时序都正确。但只测一个单元不够。教材实验报告一般要求做“全片测试”也就是把 2K 个单元全部写一遍、读一遍。常见做法是先全部写 00再全部读 00再全部写 FF再全部读 FF也可以交替写入 55 和 AA因为 5501010101、AA10101010能暴露数据线中某一位固定为高或固定为低的故障。这个过程手动拨 2K 次显然不现实实验箱通常支持“地址自动加一”模式或者你直接写一个循环用模型机连续写。用 C 语言在 PC 端通过串口控制实验箱的话也可以写一段简单的测试脚本逻辑无非是for (addr 0; addr 2048; addr) { write_sram(0x2800 addr, 0x55); if (read_sram(0x2800 addr) ! 0x55) printf(fail at %04X\n, 0x2800 addr); }4.3 第三步接入模型机运行一段访存指令手动读写验证通过后接下来把 SRAM 的数据线、地址线、控制线切换到模型 CPU 的对应总线接口。实验箱上一般有跳线或拨码开关把“手动/自动”模式切换过去。这一阶段的任务是写一小段机器指令由实验箱的微程序控制器或指令执行器运行例如MOV A, [0x2800]把 0x2800 单元内容读入 A 寄存器MOV [0x2801], A把 A 寄存器内容写到 0x2801 单元。你可以在实验箱上看到CPU 先输出地址 0x2800然后数据总线上出现该单元数据A 寄存器 LED 变亮。这其实就是“CPU 通过系统总线访问内存”的直观演示。如果运行结果不对问题大概率在总线切换不干净或控制信号冲突。最典型的是“手动模式下正常的单元自动模式下读回来的数据每隔几次就错一次”这就引出了下面要讲的时序问题。4.4 用示波器看时序眼见为实如果你手里有示波器或逻辑分析仪这是全实验最震撼的环节。把探头分别接在 WE、OE、地址线任一引脚上触发条件设为 WE 下降沿你会看到地址线先变化并稳定一段时间接下来 WE 拉低WE 拉高后一段时间数据线上出现有效数据如果是读周期可以看到 OE 拉低后数据线从高阻变成有效电平。对照芯片手册上的时序图你会发现自己手动拨“快一点”“慢一点”时波形形状几乎一样只是时间尺度变了。这也是为什么 SRAM 实验简单——它不涉及刷新、不涉及页行激活地址给到、控制倍给到数据就到了。5. 经典问题与排障实录我在实验课上记录过大量学生出过的故障总结下来主要就三类读回全 FF、部分地址能用、运行不稳定。下面每一条都是真实案例。5.1 现象写进去读出来全是 FF 或者 00这个现象可以说是存储器实验的“头号杀手”。原因排查按以下顺序来排查点怎么查常见原因片选 CE用万用表量 CE 引脚电平手动模式下应能拉低译码器接线错、CE 没接对读写控制 WE/OE拨动按键看引脚电平是否正确变化控制信号接反WE/OE 互换芯片是否选中看译码器输出 Y 端是否为低高位地址线没接或接错芯片本身损坏换一片同型号芯片测试插反/静电损坏从统计上讲读回全 FF八成是 CE 没生效芯片根本没被选中数据线高阻状态下上位机读到的就是全 1。读回全 00 则可能是数据线卡在低电平或者芯片供电有问题。5.2 现象只有部分地址能用如果你发现 0x2800 好用0x2A00 一写就错多半是高位地址线的译码逻辑有局部错误。最好把地址范围按二进制展开画出哪几位发生了变化。比如 0x2800 到 0x2FFFA10~A0 全都能变说明低 11 位没问题如果 A10 这位的区间总是失败就要检查 A10 这根地址线是虚接、排针氧化还是芯片引脚损坏。另一个隐蔽原因是实验箱上有些地址线默认接了别的模块比如拨码开关没有完全断开。这种就属于“接触类”问题最好的办法是拿万用表从地址源端到芯片引脚端量通断一段一段量别凭感觉换线。5.3 现象单步读正常连续运行就乱这个现象通常是时序裕量不足造成的也是最有“含金量”的故障。手动模式下每一步都间隔几秒芯片有充分时间稳定模型机连续运行后读写操作在微秒甚至纳秒级别完成如果 SRAM 的地址建立时间、WE 低电平时间不满足手册要求就可能出现“上次地址的数据还在总线上下一次操作已经开始”的情况。排查思路用示波器观察 WE/OE 的脉冲宽度对照 6116 手册要求一般 WE 低电平时间需要大于 70ns 左右。实验箱模型机时钟不快通常能满足但如果模型机经过分频后频率异常就会出现这个问题。检查数据总线是否存在竞争。如果 OE 还没有完全释放变为高阻CPU 已经开始输出下一条数据总线上两个信号打架就会出现时好时坏。这种不稳定故障不要一开始就怀疑芯片先把时序抓出来看。你一旦习惯用示波器看总线很多“玄学”问题都会变成“时序不够”的常规问题。5.4 延伸上位机软件报“存储器空间不足”怎么处理有读者在留言里问过自己用 GX Works2 这类工业软件调试时偶尔会遇到“存储器空间不足”或者“桌面堆栈不足”的提示这是不是和实验箱有关老实说这不是实验箱硬件的问题而是 PC 端软件资源管理的问题。GX Works2 这类软件在打开大型工程、频繁编译或多次打开关闭窗口后Windows GDI 资源和栈空间可能被耗尽于是报“堆栈不足”。处理办法有这几个关闭无关软件尤其是浏览器多标签页释放系统 GDI 资源清一下系统临时目录删掉软件的临时编译文件把软件工程从机械硬盘挪到本地固态盘减少文件读写压力如果频繁出现检查 Windows 虚拟内存设置把“自动管理所有驱动器分页文件大小”打开实在不行卸载重装软件装最新补丁版。这个算题外话但既然实验课上很多同学一边连实验箱一边开着编程软件碰到这个提示会误以为是实验平台坏了所以一并说清楚。6. 实验之外从存储器实验延伸出去做完实验、拍完波形、写完报告如果到此为止那就太可惜了。这个实验的底层逻辑可以延展到很多后面更“高级”的话题这里挑三个最常见的方向聊一聊。6.1 SRAM、DRAM、EEPROM 到底差在哪实验箱上用的是 SRAM静态随机存储器它的存储原理是锁存器——每个位是一个双稳态电路只要不掉电数据就不会丢。优点是速度快、时序简单适合做教学实验缺点是集成度低、成本高做不了大容量内存条。而我们电脑里的内存条用的是 DRAM动态随机存储器存储原理是电容存储电荷。电容会漏电所以需要每隔几毫秒刷新一次这也是 DRAM 控制器的核心工作。DRAM 牺牲了刷新逻辑换来了极高的集成度。还有一些实验箱会加入 EEPROM 芯片如 AT28C16它的存储原理是靠浮栅晶体管“困住”电荷写入时在控制栅和漏极之间加高压让电子穿过绝缘层进入浮栅擦除时加反向电压把电子拉出来。浮栅里的电荷可以保持十年以上断电不丢。EEPROM 的好处是按字节擦写缺点是擦写速度慢、寿命有限常见 100 万次左右所以它适合存配置参数不适合当内存用。一句话总结SRAM 快但贵DRAM 大但需要刷新EEPROM 断电不丢但慢。理解了这三者的取舍你也就理解了计算机里为什么会有“寄存器—高速缓存—主存—磁盘”这么一长串存储层次。6.2 “直接内存交换”与 DMACPU 的让位前面提到 CPU 可以通过系统总线直接访问内存。但在实际计算机里如果硬盘、网卡每次交换数据都要 CPU 来搬运CPU 会被大量中断和处理工作占用系统性能会大幅下降。所以出现了 DMA直接存储器访问技术DMA 控制器在总线上“代替” CPU直接控制地址总线和读写信号让外设和内存之间直接交换数据。回到“以存储器为中心的双总线结构”问题上来——在这种结构里CPU 和 DMA 设备共享系统总线。CPU 访问内存是“正常访问”DMA 访问内存是“接管总线后访问”。教学实验里如果条件和时间允许可以做一下 DMA 实验的时序演示你会发现 DMA 的几个关键信号总线请求、总线允许本质上是“总线使用权”的交接仪式。这对理解多设备共享总线非常有帮助。6.3 虚拟存储器实验里地址和程序地址不是一回事在实验箱里你拨到地址总线上的 0x2800CPU 或译码器看到的也是 0x2800寻址物理位置是确定的。但在现代操作系统里C 语言指针保存的地址是虚拟地址它要经过 CPU 内部 MMU内存管理单元的页表翻译才能映射到物理内存地址。int a 42; int *p a; printf(virtual address: %p\n, p); // 你看到的是虚拟地址这个打印出来的地址并不是内存条上的物理位置。进程 A 和进程 B 可以拥有同一个虚拟地址但它们对应的物理页完全不同靠页表隔离。这就是为什么每个进程都觉得自己独占了几 GB 内存——实际上物理内存只有几 GB操作系统靠换页和缺页中断把暂时用不到的数据挪到磁盘上。从这个角度看你在实验箱上亲手对着物理地址写数据反而成了一次难得的“物理地址直通体验”。等你学到操作系统虚拟内存管理时再回头看这个实验会特别有感原来物理地址是这么一回事。7. 个人实操心得与最后提醒最后讲几个我自己的习惯可能对你们做实验、写报告有帮助。我从第一次带实验开始就要求学生“先查真值表再动线”。很多人觉得麻烦总觉得芯片手册是业余才看的。但实际上真值表就是存储器的“行为准则”——CE、WE、OE 任意组合对应什么操作看清楚这些很多问题根本不用猜。你甚至可以把真值表手抄在实验报告扉页排障时一目了然。接线这块我自己的习惯是每种信号用固定颜色红色电源、黑色地、白色地址、黄色数据、绿色控制。颜色自定关键是整套实验中保持一致。这样只要看到一根绿线就知道它是控制线排查起来脑子不用转。还有一个容易被忽视的细节实验结束关电源后再拔线。SRAM 虽然不像某些器件那样对带电插拔极其敏感但数据线在带电瞬间可能因为接触抖动产生虚假写脉冲把里面数据改得乱七八糟。下次实验一上电看到的数据不是上上次的第一个念头就是怀疑芯片坏了其实只是数据被“意外改写”了。类似这种细枝末节往往就是真实工程里最难查的 bug。另外提一句如果你在实验箱上用的是 FPGA 或 CPLD 平台存储器逻辑是写进 Verilog 代码里的这时候建议额外做一件事把芯片手册里的读写时序翻译成自己的状态机比如写周期至少拆成“地址建立、WE 拉低、保持、WE 拉高”四个状态。别小看这个练习它能把抽象的时序图变成你能控制的硬件行为对后面做复杂总线设计帮助极大。这个实验做到位了你对“CPU 怎么从内存里拿数据”的理解会从“课本上的图”变成“亲手拨出来的现象”这种把知识变成体感的过程是实验课最有价值的地方。如果你做的时候遇到其他奇怪现象也别慌先把每根信号的电平量一遍八成能找到问题。