计算机组成原理课上,存储器实验基本是每个人都躲不过去的一道坎。多思计组虚拟实验室里的存储器实验,就是把一块 6116 芯片搬到屏幕上,让你亲手拨地址、拨数据、按控制信号,把一个数写进去再读出来。很多人第一次打开实验面板时会被满屏开关和指示灯吓住,其实核心就一件事:弄清楚地址线、数据线、控制线三者怎么配合。这篇文章面向刚接触这个实验的新手,我会把 6116 的引脚逻辑、读写时序、虚拟面板操作流程和常见故障全部拆开讲,你看完照着做一遍,基本就能把这个实验吃透。
我指导过不少学弟学妹做这个实验,发现大家卡住的地方往往不是“不会拨开关”,而是不理解背后的信号关系。所以这篇写得会比较啰嗦,每个步骤都会告诉你为什么这么做,而不是只给一套“照着点”的流程。实验做完之后你还会发现,存储器的读写逻辑和后面运算器、数据通路实验是连着的,这一步地基打得牢不牢,直接影响后面几周的心情。
1. 动手前先弄懂:实验到底要做什么
1.1 虚拟实验平台到底在模拟什么
多思计组虚拟实验室把真实实验箱上的操作搬到了屏幕上,本质上是把 CPU 和存储器之间的连接抽象成三组信号:地址总线、数据总线、控制总线。6116 是一片 2K×8 的静态 RAM,2K 表示有 2048 个存储单元,8 表示每个单元能存 8 位二进制数,也就是一个字节。地址线上给 11 位地址,2 的 11 次方正好是 2048,所以它需要 11 根地址线;数据线上传 8 位数据,所以有 8 根数据线;控制线则决定当前是读还是写。
虚拟实验的任务,就是让你亲手操作这三组信号,观察存储器的完整行为。你在面板上看到的地址开关对应地址总线,数据开关对应数据总线,CE、OE、WE 这几个开关对应控制总线。拨开关的过程就是在向总线发送电平信号,指示灯就是总线上的电平反馈。这个逻辑想清楚之后,整个实验就不再是“乱点一通”,而是有明确目标的信号操作练习。
1.2 为什么偏偏用 6116 讲存储原理
你可能想问,都什么年代了,为什么还在用 6116 这种老芯片做教学实验。答案很简单:它足够简单,又足够典型。
6116 是经典的静态随机存储器,也就是 SRAM。它靠六管存储单元锁存数据,只要不掉电,数据就能一直保持,不需要像 DRAM 那样周期性刷新。这对教学来说非常友好,你写入一个数之后可以慢慢观察,不用担心数据因为没刷新而消失。它的控制信号也很有代表性:片选 CE 负责决定芯片是否工作,输出使能 OE 负责决定数据是否输出,写使能 WE 负责决定是否写入。这三种信号的组合,几乎涵盖了所有简单存储器的基本控制逻辑。
换一颗更大更复杂的芯片,引脚多了,新手容易迷失在细节里;换一颗更简单的寄存器堆,又体现不出“地址寻址”这个概念。6116 的 2K 容量刚好够你理解地址译码,8 位数据宽度又和大多数教学 CPU 的总线宽度一致,所以它在计算机组成原理实验课里几乎是标配。
1.3 实验开工前必须掌握的几个关键词
第一个词是“低有效”。6116 的 CE、OE、WE 三个控制信号都是低电平有效,也就是说,要让某个功能生效,对应引脚必须接低电平,也就是开关拨到 0。新手最容易在这里翻车,总以为开关拨 1 才是“开”。记住:在 6116 的世界里,拨 0 才是让芯片听你指挥。
第二个词是“高阻态”。数据线是双向的,它既能输出数据也能输入数据。当芯片没有被选中,或者处于既非读也非写的状态时,数据引脚对外表现为高阻态,相当于和外部电路“断开”,谁也不驱动。这个状态对避免总线冲突至关重要,后面我会专门展开讲。
第三个词是“建立时间和保持时间”。真实芯片在工作时,地址和数据信号必须提前稳定一小段时间,写入信号结束后还要再保持一小段时间,否则数据就可能写错。虚拟实验为了让操作看得清楚,不会在这些纳秒级参数上为难你,但你在实验报告里画时序图时,必须把这些窗口画出来。
把这些基础概念过一遍,再去看实验面板,你会觉得那些开关和指示灯突然有了含义,而不是一堆乱七八糟的控件。
2. 吃透 6116:引脚、真值表与读写时序
2.1 11 根地址线、8 根数据线和 3 根控制线
打开实验面板之前,先把芯片引脚的作用看清楚。6116 的引脚分成三类:地址线、数据线、控制线,另外还有电源和地。
| 引脚 | 方向 | 作用 |
|---|---|---|
| A0-A10 | 输入 | 11 位地址线,可寻址 2K 个存储单元 |
| D0-D7 | 双向 | 8 位数据线,读时输出数据,写时接收数据 |
| CE | 输入 | 片选信号,低电平有效,高电平时芯片不参与操作 |
| OE | 输入 | 输出使能,低电平有效,决定是否把数据放到数据总线上 |
| WE | 输入 | 写使能,低电平有效,低电平时执行写入 |
| VCC / GND | 电源 | 5V 供电与地 |
这里有一个很关键的概念:数据线是双向的。你往存储器里写数据时,数据是从外部流向芯片;你从存储器读数据时,数据是从芯片流向外部。同一个引脚,在不同时刻扮演不同角色,靠的就是控制信号来切换方向。CE 决定芯片是否“上线”,OE 决定输出电路是否打开,WE 决定是否进入写模式。
把三个控制信号组合起来,就能得到一组真值表,这是整个实验的理论核心:
| CE | WE | OE | 当前操作 | D0-D7 状态 |
|---|---|---|---|---|
| 1 | X | X | 芯片未选中 | 高阻 |
| 0 | 1 | 0 | 读 | 输出存储数据 |
| 0 | 0 | 1 | 写 | 外部数据输入 |
| 0 | 0 | 0 | 写(WE 优先) | 外部数据输入 |
| 0 | 1 | 1 | 选中但未读未写 | 高阻 |
注意看第二行和第三行,读操作要求 OE=0、WE=1,写操作要求 WE=0,OE 此时不起决定作用。很多教材会把写操作简写成“CE=0 且 WE=0 时写入”,但你在实验面板上实际操作时,最稳妥的做法是写操作时把 OE 置 1,避免读输出和外部写入同时抢数据总线。
2.2 读操作:三组信号的“正确姿势”
读操作说白了就是三件事:先把地址送到地址线上,再把芯片“打开”,最后从数据线上把结果拿走。在多思平台上,地址开关拨好,就相当于地址线上有了电平组合;CE 拨 0,相当于告诉芯片“你被选中了”;WE 拨 1,相当于告诉芯片“我不是要写你”;OE 拨 0,相当于告诉芯片“把你肚子里那个单元的内容放到数据线上去”。三个条件都满足,数据指示灯就会显示存储内容。
读操作有一个很容易被忽略的点:地址必须先稳定,然后再给读信号。如果数据灯刚亮你就去拨地址,拨动过程中会有一些中间状态的地址出现,芯片可能把别的存储单元的内容也输出一下,造成视觉上的闪烁。真实芯片上,地址变化到数据稳定输出需要一段存取时间,虚拟实验里灯几乎是瞬间亮,但操作的先后顺序还是要养成习惯:先地址,后控制信号。
我在指导别人做实验时经常强调一个动作:读的时候,眼睛先看地址开关,确认无误,再看 CE、OE、WE 三个状态,最后才看数据指示灯。这个顺序看起来很基础,但能避免大量低级错误。
2.3 写操作:比读多一个关键动作
写操作比读操作多一个关键动作:把 WE 从 1 拨到 0,再拨回 1。这个从高到低再回到高的过程,就是一次写脉冲。数据并不是在 WE 变成 0 的瞬间写进去的,而是在 WE 由 0 变 1 的上升沿被锁存进存储单元。
你可以把这个过程类比成盖章:WE 拉低是“章压下去”,WE 拉高是“章抬起来”,真正留下痕迹的是抬起来那一下。所以操作时不要一直把 WE 按在 0 上不放,写完要记得拉回 1,不然芯片一直处在写模式,数据线上永远是外部开关的内容,你根本看不出存储结果。
写操作的完整顺序是:先拨地址,让地址线稳定;再拨数据,让数据线上出现要写入的值;然后把 CE 拉低,OE 置 1,WE 拉低;等一小会儿,再把 WE 拉高。WE 上升沿到来时,数据总线上的值被锁进对应地址的存储单元。
有一个时序细节值得写在实验报告里:地址建立时间指的是地址必须先于 WE 下降沿稳定一段时间;数据建立时间指的是数据必须在 WE 上升沿之前就绪。如果你先拉低 WE 再拨数据,放在真实芯片上很可能写入错误数据。虚拟实验不一定严格模拟这种错误,但养成“先数据后脉冲”的习惯没有坏处。
2.4 高阻态:数据总线不“打架”的关键
高阻态这个词听着抽象,其实特别重要。想象一条走廊只能容纳一个人说话。6116 的 8 根数据线就是这条走廊,外部数据开关是一拨人,6116 内部存储单元是另一拨人。读的时候,内部的人需要走到走廊里喊话,外部数据开关必须全体闭嘴;写的时候,外部的人要往走廊里喊话,内部存储单元的输出必须闭嘴。两边如果同时开嗓,谁的话都听不清,反映到电路上就是总线冲突,严重时甚至可能损坏芯片。
高阻态就是“闭嘴”状态,引脚对外表现为既不是稳定的高电平,也不是稳定的低电平,而是相当于断开。正是因为有了高阻态,双向数据总线才能在不同时刻被不同设备安全驱动。
在实验操作中,写数据之前,你要确保 6116 的输出端已经进入高阻态,否则外部数据开关给的数据驱动不过去。具体操作就是让 WE=0,或者让 OE=1,芯片输出电路不工作,数据总线完全交给外部开关控制。这个细节很多教材只一笔带过,但恰恰是实验中出现各种诡异现象的头号原因。
3. 全流程实操:从初始化到批量读写验证
3.1 进入实验面板,先做一件事:清空所有状态
多思计组虚拟实验室的界面不同版本可能略有差异,但存储器实验面板的核心布局基本一致:左侧或上方是 6116 芯片图示,中间是地址开关和数据开关,右侧是控制信号开关,下方或旁边是数据指示灯和存储内容查看窗口。
打开实验后,不要急着写入,先把所有开关恢复到初始状态:CE 置 1,让芯片处于未选中状态;WE 置 1,OE 置 1,让芯片既不读也不写。这一步相当于让所有总线静默,避免上电瞬间的随机状态干扰你的判断。
然后看一眼数据指示灯。6116 上电后存储内容是随机的,虚拟实验里可能表现为全 0、全 1 或者一堆无规律的值,这都是正常的,不代表实验出了问题。正因为初始值不可预知,实验的第一步永远是“先写后读”,而不是直接读某个地址指望它里面有特定数据。
3.2 第一次写入:向 000H 地址写 5AH
以向 000H 地址写入 5AH 并读回验证为例,完整走一遍流程。
第一步,拨地址。000H 转成二进制是 00000000000,A0-A10 全部拨到 0。如果面板上的地址开关标的是十六进制,直接拨成 0 也行;如果标的是二进制,就一位一位拨到 0。
第二步,拨数据。5AH 拆成高四位和低四位:5 对应二进制 0101,A 对应二进制 1010,合起来就是 01011010。数据开关 D7 到 D0 从高位到低位依次拨成 0、1、0、1、1、0、1、0。新手最快的转换方式是四位一组,先转高四位,再转低四位,不容易错。
第三步,给控制信号。CE 置 0,OE 置 1,WE 置 0。此时芯片被选中,处于写模式,数据线上的 01011010 在 WE 拉高的时刻被锁进 000H 单元。保持状态两三秒后,把 WE 拉回 1,写入完成。
第四步,读回验证。把 OE 从 1 拨到 0,WE 保持 1,CE 保持 0,此时芯片切换到读模式。看数据指示灯,应该显示 01011010。如果显示的值不是它,先不要慌,跳到下一章的排查环节,按顺序检查所有开关状态。
3.3 连续读写多个地址,验证存储器的“记忆”能力
单个地址写读成功之后,不要急着收工,建议至少测四个有代表性的值:00H、FFH、5AH、A5H。为什么要选这四个?00H 是 8 位全 0,FFH 是 8 位全 1,可以一次性检查每位是否能正常置 0 和置 1;5AH 和 A5H 的高低四位正好相反,能检查相邻数据线之间有没有相互干扰。
操作步骤和第一次完全一样:先拨地址,再拨数据,然后 CE=0、OE=1、WE=0,停一下,WE 拉回 1,再切到读模式验证。每次操作完,把结果填进记录表里。我建议你手动画一张类似下面的表,实验报告也能直接用:
| 地址(HEX) | 写入数据(HEX) | 读回结果(HEX) | 结论 |
|---|---|---|---|
| 000 | 5A | 5A | 写读正常 |
| 001 | 00 | 00 | 写读正常 |
| 002 | FF | FF | 写读正常 |
| 003 | A5 | A5 | 写读正常 |
如果你贪快,想一次把所有地址写完再统一读,也不是不行,但那样一旦出错很难定位是写入阶段的问题还是读取阶段的问题。新手老老实实“写一个读一个”,效率反而更高。
3.4 用三个小实验观察存储器的保持特性
读写验证通过后,可以做几个小实验加深理解。
第一个实验:把 CE 置 1,让芯片未选中,然后随意拨动地址开关,拨出一个和刚才完全不同的地址。此时数据指示灯应该变成高阻态,面板上可能表现为指示灯全灭或者熄灭。接着把地址拨回 000H,CE 拨 0,OE 拨 0,WE 拨 1,你会发现读出的还是 5AH。这说明只要不掉电,片选信号不选中芯片,存储内容会一直保持。
第二个实验:连续读同一个地址很多次,比如对着 000H 连续读十几次。你会发现数据灯每次都显示同样的值,没有任何变化。这就是静态 RAM 的非破坏性读出。和 DRAM 读完后需要回写不同,SRAM 读出操作本身不会破坏存储内容。
第三个实验:把 CE=0、WE=1、OE=1,芯片被选中但没有读也没有写。此时数据线是高阻态,数据灯不应该亮。这个状态对应真值表里的“选中但未读未写”。理解了这个状态,后面理解总线隔离就顺理成章了。
这三个实验看起来简单,却是让你把存储器的行为从“看别人讲解”变成“自己验证过”的关键一步。
4. 信号灯不听话?常见问题与排查技巧
4.1 写入后读出来全是 FF 或 00
现象:往某个地址写了一个数,切到读模式验证,结果数据灯不是全 1 就是全 0,和写入值完全对不上。
最常见的原因是 CE 一直是 1,芯片压根没被选中。很多新手潜意识里觉得开关拨到 1 才是“激活”,但 6116 的控制信号全是低有效,CE 必须为 0 芯片才工作。先检查 CE 是不是拨在 1 上。
第二个常见原因是写入动作没真正发生。比如你拨了 WE=0,但马上又拨回 1,中间停留时间太短,虚拟实验里可能看不出问题,真实芯片上就可能写失败。虽然虚拟平台不一定会模拟这种时序错误,但操作习惯必须正确:WE 拉低后保持一会儿再拉高,给写脉冲留出完成的窗口。
排查顺序建议:先看 CE,再看 WE,最后看 OE。逐一检查三个控制开关状态,对着真值表对比,八成能发现是哪一步没做对。
4.2 数据指示灯卡死,拨数据开关没反应
现象:数据指示灯锁定在某个值,不管怎么拨数据开关,灯都不跟着变,好像开关失效了。
这说明数据总线正被 6116 的输出电路牢牢占住。什么情况下会这样?当你处于读状态时,OE=0 且 WE=1,芯片把存储单元的数据输出到数据线上,此时数据总线由芯片内部驱动。外部数据开关虽然也在连接总线上,但它的驱动能力抢不过芯片,所以拨了也没用。
解决办法很简单:写操作前先把 OE 置 1,或者把 WE 拉低,让输出端进入高阻态,把总线控制权交还给数据开关。这是一个非常经典的“总线使用权”问题,理解了它,后面做运算器实验时遇到三态门相关的问题也会很有感觉。
4.3 一拨地址开关,数据灯就跟着乱跳
现象:地址开关拨动过程中,数据指示灯开始无规律闪烁,看起来像灵异事件。
本质上是芯片在“不稳定的地址”上做了读操作。你拨开关是有过程的,在这个过程中地址线上会短暂出现各种中间组合,每一个组合都可能对应一个存储单元,芯片就会把这些内容轮流输出到数据线上,造成乱跳。
正确操作顺序是:先让 CE 置 1,把芯片隔离掉,再去拨地址开关。等所有地址位都稳定了,再把 CE 拨回 0,然后给出读信号。这样芯片永远只看到一个稳定的最终地址,而不是拨动过程中的中间状态。真实实验箱上,这个毛病还会因为机械开关抖动而更明显,所以这个好习惯越早养成越好。
4.4 读出的内容张冠李戴,换地址没用
现象:往 000H 写了数据,读的时候怎么也读不出来,但往其他地址乱写乱读,偶尔能对上。怀疑是芯片坏了,其实多半是拨错了地址位。
11 位地址线在面板上分布范围较广,有的版本把开关按 A10 到 A0 排列,有的版本按 A0 到 A10 排列,新手如果没看丝印,很容易把高位当成低位。比如你心里想拨 000H,但 A0 位实际被拨成了 1,读出来的就是 001H 的内容。
排查方法是回到最基础:从 000H 开始,每次只让地址加 1,也就是只改变最低位,观察读出的内容变化。如果最低位变了但读出的内容没变,说明地址线接反了或拨错了位置。把地址开关逐位理清,问题自然消失。
4.5 快速定位问题的排查思路表
把上面几个典型问题整理成一张表,实验现场照着查,效率会高很多:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 写入后读回全 FF | CE 一直为 1,芯片未选中;或写入未真正发出 | 检查 CE 是否置 0;重新执行一次完整写脉冲 |
| 写入后读回全 00 | 写入数据前数据开关没拨对;或始终处于写模式 | 写之前核对数据开关;写完后把 WE 拉回 1 |
| 数据灯卡死,拨开关无效 | 芯片一直处于读输出状态,总线被占用 | 写操作前把 OE 置 1 或 WE 拉低,释放总线 |
| 拨地址时数据乱跳 | 芯片在地址不稳定期间持续读 | 先 CE=1 隔离,地址稳定后再 CE=0 |
| 读出的内容对不上地址 | 地址位拨错或高低位顺序看反 | 从 000H 开始逐次加 1,核对最低位变化 |
| 写完立刻读是对的,过一会儿读不对 | 操作过程中开关被误碰 | 检查当前开关状态是否仍是读模式 |
这张表建议截图保存。实验现场出问题时,从第一行开始逐项核对,比漫无目的地乱点开关有效得多。
5. 多思虚拟平台的实操心得与进阶建议
5.1 虚拟实验与实物实验箱的差异
在虚拟平台上做实验,最大的好处是不会烧东西、不会接错线、随时可以重置。但也正因为它太“干净”,有些真实世界的问题它模拟不出来,比如机械开关抖动、导线接触不良、信号在长走线上的反射和延迟。
我在带学生做实验时经常提醒:虚拟平台能通过的实验,拿到真实实验箱上不一定一次成功。虚拟实验忽略了电路噪声和开关抖动,你在平台上养成操作习惯,到了实物环境会省很多事。反过来,虚拟平台都做不对的,实物环境基本也做不对。所以不要小看这个“模拟器”,它是你把原理内化的最佳练习场。
虚拟平台对时序参数的处理也比较理想化。真实 6116 有地址存取时间、WE 脉宽最小要求,虚拟实验基本不会为这些细节为难你。但实验报告里画时序图时,该标的建立时间、保持时间还是要标,这是老师考察你是否真正理解读写的关键点。
5.2 容易被忽略的好用功能
多思计组虚拟实验室里,有几个功能新手往往没注意到,但用好了会省很多时间。
第一个是存储内容查看窗口。实验面板之外,通常有一个能直接浏览 2K 地址空间的窗口,你可以立刻看到哪个地址存了哪个值。做完一批写入之后,不用一个个地址读,打开窗口扫一眼就能确认结果。这个窗口特别适合用来调试“读不出来”的问题,它能告诉你芯片里到底写了什么。
第二个是手动脉冲或单步触发。有些版本提供写入脉冲按钮,点一下就会产生一个标准的 WE 脉冲信号,比手动拨开关更接近真实时序。如果你觉得手动拨 WE 老是掌握不好节奏,可以试试这个功能。
第三个是实验状态保存。写了一半想去吃饭,直接存档,回来接着做,不用重新拨一遍开关。这个功能适合做批量读写这类耗时任务。
第四个是总线波形查看。部分版本会显示 CE、WE、OE、地址和数据的时序波形图,实验报告需要画时序图时,直接截图是非常有力的素材。
5.3 做实验记录与写实验报告的小建议
实验记录别只截图面板,那是偷懒,复盘时根本没信息量。比较好的做法是每步操作都记录成一张表:地址、写入数据、控制信号状态、读回数据、结论。这张表既是你的操作日志,也是实验报告的主体内容。
写实验报告时,至少要包含三样东西:一是地址-数据对照表,证明你做了哪些写读验证;二是读周期和写周期的时序图,手动画一遍也好,从平台截图也好,要能体现地址稳定、写脉冲、数据有效这几个关键阶段;三是调试记录,把你遇到的“写入后读不出”“总线卡死”这类问题和解决过程写进去。老师看到调试记录,比看到一张完美无瑕的“顺利通过”更有好感,因为它说明你真的动手并思考了。
最后说一点个人经验。我做这个实验之前一直觉得存储器就是“往格子里面装东西”,做完之后才意识到,真正难的不是装东西,而是决定什么时候让谁说话。控制信号的低有效、高阻态、写脉冲上升沿锁存,这一整套逻辑才是存储系统设计的精髓。如果你能把 6116 这块芯片的读写时序彻底搞明白,后面做运算器、做数据通路实验时,很多概念都会顺很多。实验做完后,不要急着关平台,花十分钟把真值表里那五个控制组合挨个试一遍,对信号的理解会有一个质的提升。