ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

存储器原理实验:SRAM读写时序、地址译码与故障排查

2026/10/7 1:11:26 拓冰建站 浏览量
存储器原理实验:SRAM读写时序、地址译码与故障排查 第一次做存储器原理实验我把数据开关拨成 1010 1010确认地址线接好按下写脉冲再切到读状态看着 LED 上跳出来的却是 1111 1111。八位数据全错成高电平那一刻我盯着实验台愣了半分钟——不是写不进去是写进去了但读出来不对这两个现象背后的排查方向完全相反。计算机组成与体系结构这门课里存储器原理实验是我认为最容易接线半小时、排错两小时的一个也是最能让人真正理解地址、数据、控制三总线到底怎么协同工作的一个。它不复杂但它把课本上画得干干净净的框图拆成了会虚接的导线、会打架的片选、会算错的地址。这篇文章就把我前后折腾了几轮的经验整理出来从芯片引脚语义、存储扩展计算、地址译码方案一直到上机连线和故障排查尽量把每一步为什么要这么做讲清楚适合刚接触这门实验的同学也适合已经做过但没完全搞明白的同学。1. 存储器原理实验到底在验证一件什么事1.1 别把它当成插线练习很多人做这个实验的第一反应是照着指导书把线插完看到 LED 亮了就签字走人。但如果你只做到这一步你其实只是验证了线插对了会亮这个物理常识跟存储器原理没多大关系。这个实验真正要你亲手验证的东西只有一句话CPU 给出地址和控制信号存储器芯片在正确的时刻把数据放上总线或者从总线取走数据。拆开来看它包含三个必须同时成立的条件地址要对你给的地址必须唯一地指向某一个存储单元不能指向两个也不能哪都不指片选要对在整个存储系统里只有被地址选中的那一片或那几片芯片才能响应其他芯片必须闭嘴时序要对读和写是两种完全不同的总线会话写的时候是芯片收数据读的时候是芯片发数据两者绝不能在同一时刻发生。实验台上那些拨码开关、LED、单脉冲按钮其实就是把 CPU 在纳秒级完成的这套动作拉长成你能用手操作的秒级流程。你按一次写脉冲等于 CPU 执行了一次写总线周期你切到读状态看 LED等于 CPU 执行了一次读总线周期。理解了这层映射整个实验就从插线变成了手动模拟 CPU 访问内存。1.2 实验台上那几个模块分别扮演什么角色不同学校的实验箱型号不一样但模块划分基本是同一套逻辑。以常见的计算机组成原理实验台为例通常包含下面几块我用表格整理一下各自的角色。模块典型器件在实验中扮演的角色地址寄存器74LS273 / 74LS374暂存你要访问的地址提供稳定的地址线地址译码74LS138 / 74LS139把高位地址翻译成片选信号决定选谁数据寄存器74LS273 / 74LS374暂存要写入或刚读出的数据驱动 LED 显示总线收发74LS245控制数据总线的方向避免读写信号打架存储体6116 / 2114真正存放数据的 SRAM 芯片时序控制单脉冲 / 时钟源产生写脉冲、读脉冲提供时间基准这里有一个非常关键的点地址寄存器、数据寄存器这些外围模块本身也是芯片也有自己的使能端。很多人排错查到怀疑人生最后发现不是存储芯片的问题而是数据寄存器没被正确使能导致数据根本没送到总线上。所以排查问题时脑子里要始终有这张数据从哪来、经过谁、到哪去的链路图。2. 先啃硬骨头SRAM 芯片的引脚语义与读写时序2.1 6116 和 2114 的引脚逐个拆解实验里最常出现的两款 SRAM 是 61162K×8 位和 21141K×4 位。它们的引脚数量不同但语义是一套。6116 是 24 脚封装核心引脚如下A0A1011 根地址线2^11 2048对应 2K 个存储单元这就是2K×8里的 2K 是怎么来的D0D78 根双向数据线这就是×8的含义CE或 CS片选低电平有效只有它为低时芯片才搭理你OE输出使能低电平有效控制读的时候数据能不能送上总线WE写使能低电平有效控制写的时候能不能把总线数据吃进去VCC / GND电源和地。2114 是 18 脚1K×4 位A0A910 根地址线2^10 1024对应 1K 个单元I/O1I/O4只有 4 根数据线这就是×4CS片选低有效WE写使能低有效。注意 2114 没有独立的 OE读和写的切换完全靠 WE 和 CS 配合。记住一个规律地址线条数决定单元数量数据线条数决定每单元位数。你以后看到任何存储芯片型号先数这两组线容量基本就能推出来。提示6116 的 OE 和 WE 不能同时有效。如果两个都为低芯片内部会出现读写冲突输出状态不确定表现出来就是数据乱跳。这是实验中最常见的人为时序错误之一。2.2 写周期和读周期为什么控制信号的先后顺序有讲究先看写周期。一次正确的写操作顺序应该是这样的地址线先稳定下来把要写的单元选好片选 CE 拉低芯片被激活数据线送上要写的数据并保持稳定WE 产生一个低电平脉冲脉冲结束时上升沿数据被锁存进存储单元WE 恢复高电平CE 可以拉高写周期结束。为什么 WE 的脉冲要在数据稳定之后才给因为 SRAM 单元锁存数据靠的是 WE 的边沿和内部时序如果数据还在变化时 WE 就翻转锁进去的可能是一半旧一半新的数据。这就是上机时我明明拨对了数据写进去却是错的的典型原因——手拨开关的速度和按脉冲的时机没配合好。读周期则相反地址稳定CE 拉低WE 保持高电平关键读的时候 WE 必须是高芯片内部把对应单元的数据驱动到数据线上数据寄存器或 LED 采样、显示读完 CE 拉高芯片释放数据线。读周期最大的坑是WE 忘了拉高。很多人写完数据就直接切换去看 LEDWE 还挂在低电平位置这时候芯片处于写状态数据线是被芯片当输入用的读出来的自然是乱码或者全高电平——这就是我开头遇到的那个1010 1010 读成 1111 1111的最可能原因。2.3 三态门与总线冲突数据总线上的抢麦克风数据总线是共享的。地址总线、数据总线上同时挂着存储器、数据寄存器、CPU 等多个设备它们凭什么能共用一根线答案是三态门。普通逻辑门输出只有高、低两种状态三态门多了一个高阻态相当于把输出脚从电路上拔下来。当某个设备不该说话时它的输出进入高阻等价于断开。片选信号干的就是这件事——没被选中的芯片数据线全部进入高阻不干扰别人。如果片选逻辑写错了导致两片芯片同时被选中就会出现总线冲突一个输出高电平、一个输出低电平两者直接对拼轻则数据乱跳、读出来不确定重则电流过大发热。表现到实验现象上通常是读出来的数完全不规律每次都不一样。遇到这种现象第一反应就该去查译码逻辑而不是怀疑芯片坏了。3. 容量不够用的时候位扩展、字扩展和字位同时扩展实验台上单片的容量往往不够组出一个像样的存储系统指导书一般会要求你用几片拼出一个指定容量的存储器。拼法有三种逻辑上是递进的。3.1 位扩展把数据位宽拼宽位扩展解决的是字长不够的问题。比如你手上有 21141K×4但系统需要 1K×8怎么办用两片让它们共用同一套地址线、同一套片选和控制信号数据线各负责 4 位。第一片的数据线接总线的 D0D3第二片的数据线接总线的 D4D7地址 A0A9、CS、WE 全部并联。这样同一个地址会同时命中两片芯片一片贡献低 4 位一片贡献高 4 位合起来就是一个 8 位的字。容量计算1K × 4 × 2 片 1K × 8。位扩展的关键理解是两片芯片地址空间完全一样它们是绑在一起工作的对外表现为一个更宽的字。3.2 字扩展把地址空间拼大字扩展解决的是单元数量不够的问题。比如你手上有 61162K×8需要 8K×8就需要 4 片。这次数据线是共用的地址线分高低两部分用低位地址 A0A10 并接到所有芯片负责片内寻址高位地址 A11、A12 送进译码器译码输出分别接 4 片的片选4 片的数据线 D0D7 全部并联到系统数据总线。这样高位地址决定了选中哪一片低位地址决定了片内的哪个单元。4 片各管 2K 空间合起来 4 × 2K 8K。容量计算2K × 8 × 4 片 8K × 8。这里有个容易忽视的点同一时刻 4 片里只能有一片被选中其余三片必须处于高阻。如果你的译码器输出同时有两个为低就又回到刚才说的总线冲突了。3.3 字位同时扩展先分组再拼地址真正接近工程实际的场景是两者都要。举个完整的例子用 21141K×4拼出 4K×8 的存储器该怎么接第一步做位扩展每 2 片 2114 组成一组输出 1K×8共需要 4 组第二步做字扩展把这 4 组再拼起来形成 4K×8。总共用 8 片 2114。接口分配如下信号接法A0A9所有 8 片全部并联片内地址A10、A11送译码器产生 4 组片选D0D3每组第 1 片D4D7每组第 2 片CS每组两片并联接该组的译码输出WE全系统并联容量核对1K × 4 × 8 片 4K × 8同时地址位数 10片内 2组选 122^12 4K两者对得上。技巧做完扩展设计永远用地址线条数和数据线条数两边各算一遍容量两边能对上设计八成没大问题。这个自查方法我用了很多次帮我抓出过好几次漏接地址线的低级错误。4. 地址译码的三种做法与它们各自的代价片选信号从哪来这就是地址译码要解决的问题。同样是给 4 片芯片产生片选做法不同代价差别很大。4.1 线选法最省事也最容易出重叠线选法是拿高位地址线直接当片选一根地址线接一片的 CS。比如 A12 接第一片、A13 接第二片选第一片时让 A12 为低、其他高位为高。优点是简单一根线一片不用额外芯片。缺点是地址空间不连续中间会留出大量空洞高位地址必须严格互斥一旦两根同时有效就冲突地址位一旦够用就不再多译很容易产生地址重叠。线选法适合芯片少、地址空间要求不严的场合。实验里如果只挂 2 片用线选法完全够用接线还快。4.2 全译码法地址唯一代价是译码器全译码法把所有剩余的高位地址都送进译码器每一组地址组合对应唯一一片。用 74LS138 这种 3-8 译码器3 根输入能产生 8 个互斥的片选输出正好管理 8 片。优点是地址空间连续、唯一、无重叠符合真实系统的要求。代价是要多接译码器还要注意译码器的使能端G1、G2A、G2B必须接对否则整个译码器不工作所有片选都不输出现象就是全片读不出。74LS138 的使能逻辑要记牢G1 高有效G2A 和 G2B 都是低有效三者必须同时满足芯片才工作。我见过最典型的错误就是把 G2A、G2B 忘了接地结果译码器一直不使能怎么查存储芯片都查不出问题。4.3 部分译码与那个隐蔽的地址重叠陷阱部分译码是介于两者之间的做法只用部分高位地址参与译码剩下几根高位不管。它省了译码器引脚但会带来地址镜像。举个具体的坑假设 4K×8 的存储器只用 A12 之和 A13 中的一位参与译码而 A14、A15 悬空不管那么 A14、A15 取任意值都会选中同一片。也就是说0x0000 和 0x4000、0x8000 会指向同一个物理单元。实验里可能看不出问题因为你不去访问那些高地址但一旦做地址访问测试就会莫名其妙读到相同数据让人怀疑人生。这张表可以帮你快速判断选哪种方案译码方式地址是否唯一需要的器件适用场景线选法否易重叠无少量芯片要求不严全译码是74LS138 等真实系统容量大部分译码否有镜像少量逻辑门地址空间有富余时5. 上机实操从拨码开关到内存单元的完整读写链路5.1 连线之前先做一遍纸上跑线我现在的习惯是动手接线之前先在纸上把三条总线过一遍——地址总线从哪到哪、数据总线从哪到哪、控制信号怎么走。这一步花五分钟能省下后面半小时的排错。具体要点地址线一定要接全缺一根就会导致一半地址读不出来而且现象很有迷惑性低地址正常、高地址全乱数据线顺序别接反D0 接到 D7 上读出来的数据就是位倒序的比如 0000 0001 读成 1000 0000电源和地一定先接很多芯片完全不工作其实是忘了接 VCC控制信号的极性要对照引脚语义确认低有效的地方别当高有效用。5.2 写入和读出的标准操作流程以手动单步实验为例一次完整的写入流程是用地址开关设置目标地址例如 0000 0000 00把地址打入地址寄存器确认地址 LED 显示正确用数据开关设置要写的数据例如 1010 1010把数据打入数据寄存器确认数据 LED 正确确认 WE 处于写状态低有效或按实验台标注片选已使能按一次写脉冲数据写入松开写脉冲WE 恢复。读出流程地址保持或重新设置同一个地址确认 WE 拉高读状态使能片选观察数据 LED应与写入值一致。我建议新手先用最笨的方式做同一个地址写一个值马上读一遍确认读写闭环通了再去批量写多个地址。这样出问题时范围最小最容易定位。5.3 用连续地址做一遍压力测试单个地址读写通不代表整个存储系统没问题。真正能暴露问题的是连续地址的批量测试。我的做法是选一段地址比如 0000111116 个单元依次写入 0000 0000、0000 0001、0000 0010……0000 1111 这种递增数据再从头读一遍逐个核对。这个测试能同时验证两件事一是片内地址线有没有虚接虚接会导致地址跳变读出的数据顺序错乱二是译码逻辑是否正确如果译码出错你会发现在某几个地址上读到的数据突然重复或者跳到别的区域。注意如果连续测试时低地址区正常、高地址区读取的数据总跟低地址区重复几乎可以断定是高位地址线没参与译码出现了地址镜像。这时候去查那几根没接的地址线基本一查一个准。6. 读不出数据的时候按这个顺序排查故障排查最忌讳的是凭感觉换芯片。我整理了一张对照表按现象分类比盲目拆线高效得多。现象最可能原因优先检查项全片读出全 1 或全 0片选没使能、VCC/GND 未接译码器使能端、电源写进去读出来不一致WE 时序不对、数据未稳定就触发脉冲WE 极性、脉冲时机固定某一位始终错该位数据线断路或接错逐根核对数据线读出的数据随机跳变总线冲突多片同时选中译码输出是否互斥低地址正常高地址异常地址线虚接或译码不全高位地址线、译码逻辑数据位顺序颠倒D0D7 接反数据线顺序某几个地址读到相同数据地址镜像部分译码未参与译码的地址线排查的基本原则是从大范围到小范围先确认整片能不能被选中再确认选中后数据对不对最后才去追具体某一位。如果一上来就怀疑某一根数据线很可能查了半天发现根本是片选的问题。另外提醒一个经验换芯片要放到最后一步。实验台上的芯片通常是被反复使用的确实有坏的可能但概率远低于接线错误。我做过统计十次读不出来里九次是时序和接线问题只有一次是真的芯片坏了。先把软问题排除干净再去动硬件。7. 做完这个实验我改掉的几个坏习惯这个实验给我带来的最大改变不是学会了接存储芯片而是养成了几个习惯。第一个是先算容量再动手。以前拿到任务就接线现在会先算需要几片、地址线怎么分、译码输出够不够把方案在纸上定死之后再动手。方案清晰了接线错误少了一大半。第二个是永远验证读写闭环。写一个、读一个确认通路再扩展。很多人贪快一次性接完所有线结果出错时排查范围是整个系统反而更慢。第三个是重视使能端和极性。不管是译码器的 G 端、存储器的 CS、还是总线的方向控制这些开关信号才是整个系统的神经中枢数据线和地址线反而是体力活。把控制逻辑理清楚实验的难度立刻降一个档次。第四个是记录现象而不是记录结论。我会在本子上写地址 0000 写入 AA读出 FF而不是写读不出来。现象记录得越具体排查方向就越明确这两者的差距在实际工作中体现得非常明显。如果你现在正卡在这个实验里我的建议是把线拔掉一半只留最核心的地址、数据、片选、WE先让一片芯片跑通一个地址的读写跑通之后再往上加。存储器实验的本质就是搞清楚谁被选中、在什么时刻、干读还是干写这三件事剩下的都是这三件事的组合。