☰
从ROM到DRAM:半导体存储器结构、扩展与组合逻辑实现
2026/11/3 11:13:37 网站建设 项目流程

简介:这份PPT课件围绕半导体存储器展开,面向计算机组成、数字逻辑与硬件基础课程的学习者及授课教师,系统梳理ROM与RAM的工作原理、分类及使用方法。内容从存储器定义、容量与存取速度等性能指标切入,依次讲解掩模ROM、PROM、EPROM和快闪存储器的结构特点,并对比SRAM与DRAM在数据保持、集成度和速度上的差异。课件还涵盖存储器容量扩展的连接方法,以及用存储器实现组合逻辑函数的设计思路,章节脉络清晰,便于课堂讲授、考前复习和查漏补缺。压缩包内共1个PPT文件,大小约5.15MB,以幻灯片形式组织概念、电路框图和要点归纳。已有143人学习,可作为该章节的配套参考资料。

1. 反直觉的起点:存储器为什么是一张被地址索引的真值表

很多人第一次翻第七章 半导体存储器.ppt 这份讲义,会把它当成一张名词表:ROM、PROM、EPROM、SRAM、DRAM,一个个背下来就算完。但真正反直觉的结论是:存储器从来不只是「仓库」,它本质上是一张用地址索引的真值表。ROM 断电不丢数据,不是因为它「记得牢」,而是因为数据被写进了物理结构里——二极管的有无、浮栅上的电荷,本身就是 0 和 1。搞懂这一点,后面所有的分类、扩展、甚至用存储器做逻辑函数,都是同一套机制的不同侧面。

2. ROM 的三段式结构:地址译码器、存储矩阵与三态输出各自在干什么

ROM 的电路结构看起来简单,三个部件:地址译码器、存储矩阵、输出缓冲器。但真要把「为什么 n 根地址线能定位到 2^n 个字」讲清楚,得把这三个部件拆开看,它们分别解决「选谁」「存什么」「怎么送出去」三个问题。讲义里用了一个 2 位地址、4 位输出的二极管 ROM 做例子,这个例子小到可以手算,但结构上已经完整。

2.1 地址译码器:n 根地址线凭什么选中 2^n 个字

地址译码器的输入是 n 根地址线,输出是 2^n 根字线。任何时刻,地址线给出一个二进制组合,译码器只让其中一根字线变成有效电平,其余保持无效。讲义里的二极管 ROM 用 4 个二极管与门搭出 2-4 译码器,A1、A0 两根地址线产生 W0~W3 四根字线,地址为 00 时 W0 高,01 时 W1 高,依此类推。

这个结构的本质是「最小项发生器」。n 根地址线的每一种取值组合就是一个最小项,译码器把每个最小项映射到一根独立的物理线上。字线这个名字不是随便起的:一根字线对应一个存储字,也就是一组要同时读出的数据位。后面讲用 ROM 实现组合逻辑时,字线就是输入变量的最小项,这个伏笔在这里已经埋下了。

从电路实现看,二极管与门是最原始的译码单元。两个二极管和一个下拉电阻就能构成一个与门,输入全高时输出才高。4 个这样的与门并排,就完成了 2 位地址到 4 根字线的展开。集成度提高后,译码器改用 MOS 管,但逻辑关系没变:地址码进,独热码出。地址线每增加一根,字线数量翻倍,存储容量也跟着翻倍,这就是「地址位数决定字数」的底层原因。

2.2 存储矩阵:字线与位线的交叉点就是一位数据

存储矩阵是一个二维阵列:横向是字线,纵向是位线(也叫数据线),交叉点就是一个存储单元。讲义里的二极管 ROM 中,字线和位线交叉处接一个二极管,就表示这一位存 1;没有二极管,就表示存 0。读操作时,被选中的字线变高,通过二极管把对应的位线拉高,位线上的电平组合就是读出的数据。

用表格可以把这层关系写得更直白。假设 2 位地址、4 位输出的 ROM 真值表如下(仅为示意交叉点与编码的对应关系):

地址 A1A0选中字线D3D2D1D0
00W01010
01W10110
10W21100
11W30011

存储容量等于字数乘以位数。这个例子有 4 个字、每个字 4 位,容量就是 4×4=16 位。讲义特别强调,交叉点的数目就是存储单元数,习惯上用存储单元数目表示存储量。这个公式看起来平淡,但它是后面容量扩展的全部依据:位扩展增加位数,字扩展增加字数,两者都不改变「交叉点即存储单元」这个物理事实。

CMOS 工艺的 ROM 把二极管换成 MOS 管,逻辑极性要注意。字线接 NMOS 管的栅极,管子源极接地、漏极接位线。字线为高时管子导通,位线被拉低;经过输出端的三态非门反相后,数据端才输出 1。所以「有管子存 1」这句话成立,但位线本身的电平是反的。读图时先把输出缓冲器的反相关系确认清楚,否则会把存 1 读成 0。

提示:二极管 ROM 和 CMOS ROM 的存储矩阵极性相反,一个靠字线把位线拉高,一个靠字线把位线拉低。看电路图时先找输出缓冲器是不是反相器,再判断交叉点对应的数据值。

2.3 输出缓冲器:三态门不是装饰,它决定了能不能挂总线

输出缓冲器常被当成可有可无的尾巴,但它解决两个实际问题。第一是带负载能力:存储矩阵里的二极管或 MOS 管驱动能力很弱,直接连到系统数据总线会带不动,缓冲器把信号整形到标准逻辑电平,再对外输出。第二是三态控制:缓冲器带使能端 EN,EN 有效时输出数据,EN 无效时输出高阻态,等效于从总线上「脱开」。

三态门的意义在总线结构里才显现出来。数字系统里多条数据源共享一组数据线,任何时刻只能有一个源驱动总线,其余必须高阻。ROM 的输出缓冲器就是干这个的:不读它的时候,它不能给总线添乱。讲义里写「令 EN=0,则指定地址内的数据出现在数据输出端」,说明这个使能是低有效,接线时如果把极性搞反,读出来的永远是高阻或固定电平。

把三个部件串起来看,ROM 的一次读操作就是一条清晰的路径:地址线给出地址码,译码器把码翻译成一根字线的高电平,存储矩阵把该字线上的交叉点数据送到位线,输出缓冲器把位线电平整形并受 EN 控制送上总线。这条路径上没有时钟、没有刷新、没有写回,所以 ROM 的读时序可以做得很快,也让它的电路结构比 RAM 简单得多。

3. 从掩模到浮栅:擦除方式为什么成了 ROM 的分水岭

ROM 家族的名字容易把人绕晕:掩模 ROM、PROM、EPROM、E2PROM、快闪。如果按「能不能写、怎么写、怎么擦」去排,会发现它们的分界线不是容量,也不是速度,而是擦除的物理机制。擦除方式决定了芯片的引脚、封装、成本和使用场景,这一章把这条线捋清楚。

3.1 掩模 ROM:数据被写进光刻版图,为什么出厂就改不了

掩模 ROM 的数据是在制造阶段写进去的。厂家根据用户提供的真值表制作掩模版,光刻时决定每个交叉点要不要保留二极管或 MOS 管。有器件的位置存 1,没有的位置存 0,数据从此固化在硅片里。讲义里说「一旦 ROM 制成,其存储的数据就固定不变,无法更改」,原因很直接:数据不是存在某个可改写的物理量里,而是存在版图结构里,要改数据就得重新做一套掩模版。

这套机制的优点是简单和便宜。存储矩阵不需要浮栅、不需要高压电路、不需要擦除控制,单元面积可以做得非常小,集成度高,批量生产时单颗成本很低。缺点是起订量和改版成本:掩模版本身不便宜,数据一改就要重新流片,所以它只适合数据完全固定、批量很大的场合,比如固定程序、字符发生器、老式游戏卡带里的查找表。

从设计动机看,掩模 ROM 是把「存储」这件事交给光刻工艺,而不是交给电路。它不追求可重写,追求的是在数据不变的前提下把每比特的成本压到最低。这个取舍在后来的存储技术里反复出现:可重写性从来不是免费的,它要用额外的物理结构和控制电路来换。

3.2 PROM 与 EPROM:熔丝一次性,浮栅可擦除,物理机制决定使用方式

PROM 把写数据的机会交给用户。出厂时存储内容全为 1 或全为 0,用户用通用或专用编程器,把需要改成 0 的单元熔丝烧断,或者把反熔丝击穿。讲义里写「将某些单元改写为 0(或为 1)」,说的就是这种一次性编程。熔丝断了就接不回去,所以 PROM 只能写一次。它的价值在于小批量、快速交付:用户不需要向厂家订掩模版,自己拿编程器烧一遍就能用。

EPROM 换了一条物理路线:浮栅。存储单元是一个带浮栅的 MOS 管,编程时在控制栅和漏极之间加高压,让电子越过势垒注入浮栅。浮栅被绝缘层包围,电荷跑不掉,管子的阈值电压因此改变,读出时靠「管子导不导通」判断存的是 0 还是 1。擦除时用紫外线照射芯片,给浮栅里的电子足够能量逃逸,数据回到初始状态。紫外线照的是整块芯片,所以 EPROM 的擦除是一次全部擦除,不能按字节挑着擦。

这个区别直接影响了使用方式。EPROM 适合开发阶段反复改程序:改一版,擦一次,再烧一次。但擦除要拆下来照十几分钟紫外线,换一次程序的时间成本很高。E2PROM 把擦除方式改成电擦除,利用隧道效应让电荷穿过薄氧化层,可以按字节擦写,不用拆芯片,但每个单元需要额外的选择管,单元面积大,密度上不去。讲义里把 E2PROM 和快闪都归到电擦除的可编程 ROM 里,区别在于擦除粒度。

3.3 快闪存储器:块擦除为什么让它成了大容量存储的主力

快闪存储器的单元结构比 E2PROM 简单,它把擦除粒度从字节放大到块。每个块内的单元共享衬底,擦除时整块一起加电压,电荷同时被拉走。这样一来,每个单元不需要独立的字节选择管,单元面积降下来,密度做上去,成本逼近 EPROM,却又能电擦除、电写入。讲义里把快闪归为电擦除的 PROM,强调的正是「电擦除」这个动作,而不是「按字节擦」这个粒度。

块擦除是一个典型的工程取舍。擦除粒度越小,使用越灵活,但每个单元的控制管越多,面积越大;擦除粒度越大,单元越简单,但改一个字节要先擦整块,写放大严重。快闪选择了大块擦除,换来了高密度和低成本,代价是写入前要先做擦除管理。这个取舍在存储控制器里会变成复杂的映射和垃圾回收逻辑,但底层原因就是浮栅擦除的物理特性:擦除是整块衬底上的集体动作,很难只挑一个单元。

把这条演进线连起来看,掩模 ROM 把数据交给版图,PROM 把数据交给熔丝,EPROM 把数据交给浮栅电荷,快闪把浮栅电荷的擦除做成块操作。每一步都在回答同一个问题:数据存在哪个物理量上,这个物理量能不能改,改的代价有多大。看懂这条线,ROM 家族的名字就不再是死记硬背的缩写,而是一组物理机制的排列组合。

4. SRAM 与 DRAM:触发器与电容的路线之争,刷新到底在刷什么

RAM 和 ROM 最大的区别是「随时可写」。但同样是可写,SRAM 和 DRAM 走了两条完全不同的路:一个用触发器锁住电平,一个用电容存电荷。讲义里说 SRAM「数据由触发器记忆,只要不断电,数据就能永久保存」,DRAM「集成度比 SRAM 高得多,缺点是速度不如 SRAM」。这两句话背后是单元结构、刷新机制和读出方式的整套差异。

4.1 SRAM:六管触发器如何把一位数据「锁」住

SRAM 的存储单元是一个双稳态触发器,典型结构是 6 个 MOS 管:两个反相器交叉耦合,形成正反馈,把电平锁死;另外两个访问管接字线,控制单元和位线的通断。写数据时,位线给出强驱动,把触发器的一个节点拉高、另一个拉低,正反馈让新状态稳定下来;读数据时,访问管把节点电平送到位线,外面的灵敏放大器判断高低。

「静态」这个词指的是不需要刷新。只要供电不断,交叉耦合的反相器就会一直维持相反的两个电平,数据不会自己跑掉。代价是单元面积大:6 个管子存 1 位,而 DRAM 只要 1 个管子加 1 个电容。面积大意味着集成度低、每比特成本高,所以 SRAM 通常用在容量小但速度要求高的地方,比如缓存。另一个代价是静态功耗:反相器总有一侧导通,即使不读写也在耗电。

SRAM 的速度优势来自它的读出方式。触发器主动驱动位线,摆幅很快就到逻辑电平,不需要等待电荷分享,也不需要灵敏放大器做大幅放大。讲义里把 SRAM 的特点归结为「管子数量多、功耗大、集成度受到限制」,这三个缺点都和 6 管结构直接相关,而它的优点「不断电就能永久保存」也来自同一套正反馈。

4.2 DRAM:1T1C 的电容漏电,刷新周期是怎么算出来的

DRAM 的单元是 1 个访问管加 1 个存储电容,数据以电荷形式存在电容上。写 1 就是给电容充电,写 0 就是放电。读的时候,字线打开访问管,电容和位线连通,电荷在两者之间分享,位线电压产生一个很小的变化,再由灵敏放大器放大成逻辑电平。这个读出是破坏性的:电荷分享之后,电容上的原始电荷被扰动,读完后必须把数据写回去。

电容会漏电,这是 DRAM 必须刷新的根本原因。访问管关断时仍有亚阈值漏电,电容绝缘层也不是理想绝缘体,电荷会慢慢流失。如果不管它,存 1 的电容过一段时间就会掉到读不出来的程度。刷新就是周期性地把每一行读出来再写回去,给电容补电荷。刷新周期通常按行数来算:比如一个芯片有 4096 行,要求 64 毫秒内把所有行刷一遍,那么每行的刷新间隔就是 64ms/4096≈15.6 微秒。这个间隔不是随便定的,它要小于最坏情况下电容电荷掉到失效的时间。

刷新会占用访问带宽。刷新期间那一行不能响应正常的读写,所以存储控制器要在时序里给刷新留窗口。讲义里没有展开刷新时序,但这是 DRAM 和 SRAM 在使用上最明显的差别:SRAM 接上电就能用,DRAM 必须有人按时喂刷新命令,否则数据就是薛定谔的。

4.3 灵敏放大器与地址复用:DRAM 速度慢的根源不只在电容

DRAM 的速度慢,不能全怪电容。读出路径上有几个固定开销:行地址选通后,字线要先把整行的访问管打开,电容电荷分享到位线,位线电压变化很小,灵敏放大器要花时间把这个小信号放大到可识别的逻辑电平,然后列地址选通把选中的位送出。这一套动作下来,行激活和预充电的时间就占了很大一部分。

地址复用是另一个设计取舍。DRAM 容量大,地址线多,如果所有地址引脚都独立引出来,封装成本会很高。所以 DRAM 把地址分成行地址和列地址,分时从同一组引脚送入,用 RAS 和 CAS 两个选通信号区分。好处是引脚数减半,坏处是读一次要送两次地址,时序更复杂。讲义里讲存储器扩展时提到地址线复用,底层动机就是省引脚。

对比项SRAMDRAM
存储单元6 管触发器1 管 1 电容
刷新不需要需要周期性刷新
读出非破坏性破坏性,需写回
速度快较慢,有行激活开销
集成度较低较高
典型用途缓存、小容量高速存储主存、大容量存储

讲义给了一组量级:动态存储器容量已达 10^9 位/片,高速存储器存取时间约 10ns。这两个数字放在一起看,正好说明两条路线各自走到了什么程度:DRAM 靠单元面积小把容量做上去,SRAM 靠触发器驱动把速度做上去。选型时不是问「哪个更好」,而是问「这一层存储更需要容量还是更需要速度」。

5. 容量扩展:位扩展、字扩展与连线排查中的翻车记录

单颗存储芯片的容量和位宽往往不够用,系统里常见的做法是把多片拼起来。讲义把容量扩展单独列成一节,是因为这里最容易出现「原理看懂了,线一接就错」的情况。扩展分两种:位扩展增加数据位宽,字扩展增加地址空间。两种扩展的接线规则不同,但都围绕同一个原则:地址线、数据线、控制线该并联的并联,该分开的分开。

5.1 位扩展:地址线并联、数据线分开,为什么字数不变

位扩展的目标是把窄位宽的芯片拼成宽位宽。比如两片 1K×4 的芯片,拼成一个 1K×8 的存储体。接线方式是:两片的地址线 A0~A9 全部并联,片选 CS 并联,读使能 OE 和写使能 WE 也并联;数据线分开,第一片的 D0~D3 接系统数据总线的低 4 位,第二片的 D4~D7 接高 4 位。这样同一个地址会同时选中两片,每片各送出 4 位,合起来就是 8 位。

字数不变的原因很直观:地址线没有增加,译码范围还是 1K 个地址,变的只是每个地址下的数据位数。位扩展不改变地址空间,只改变数据宽度,所以不需要额外的译码器。这里的关键是「同时选中」:两片的片选必须由同一个信号驱动,否则一个地址只会读到一半数据。

位扩展最容易出问题的地方是控制线。有人只并联了地址线和片选,忘了并联 OE,结果高 4 位一直是 0 或者悬空。原理上,OE 控制输出缓冲器的三态门,不使能就不输出,数据总线上自然读不到。位扩展时所有片的读使能、写使能都要同步,因为它们面对的是同一个地址的同一个字,只是负责不同的位段。

5.2 字扩展:片选译码怎么把地址空间切成一页一页

字扩展的目标是增加地址空间,数据位宽不变。比如四片 1K×8 的芯片,拼成 4K×8 的存储体。接线方式是:四片的地址线 A0~A9 全部并联,数据线 D0~D7 也全部并联;区别在片选,高位地址 A10、A11 送进一个 2-4 译码器,译码器的四根输出分别接四片的 CS。这样 A10A11 为 00 时选中第一片,01 时选中第二片,依此类推。

字扩展的本质是把地址空间分段,每片负责一段。低位地址在片内寻址,高位地址用来选片。用地址映射表可以把每片的范围写清楚:

A11A10选中芯片地址范围(十六进制)
00芯片 0000H~3FFH
01芯片 1400H~7FFH
10芯片 2800H~BFFH
11芯片 3C00H~FFFH

这张表是排查字扩展问题的基准。任何一次读写,先看高位地址落在哪一段,就知道该哪片响应。如果实际响应的片子和表对不上,问题一定在片选译码或高位地址接线。

字位同时扩展就是先做位扩展再做字扩展,或者反过来。比如用 1K×4 的芯片拼 4K×8,先把两片拼成 1K×8 的一组,再用四组做字扩展。接线时先把组内的地址、片选、读写并联好,再把组间的数据线并联、高位地址送译码器。层次清楚,线就不容易接乱。

5.3 扩展与联调中的翻车记录

下面几条是扩展电路里反复出现的坑,每条都按「现象、原因、解决」写,方便对着查。

  1. 现象:写 200H 地址,300H 的内容也跟着变;读某个地址,数据来自不该响应的芯片。原因:高位地址没有全部参与片选译码,片选信号恒有效,导致多片同时被选中,地址空间出现「镜像」。解决:画出完整地址映射表,确认每一片的高位组合唯一;未用的高位地址也要接入译码器,不能悬空或固定接有效电平。

  2. 现象:位扩展后低 4 位数据正常,高 4 位永远是 0 或 FF。原因:第二片的数据线接了,但 OE 或 WE 没有并联,输出缓冲器一直处于高阻,总线读到的是默认电平。解决:位扩展时地址线、片选、OE、WE 全部并联,只有数据线分段;用万用表或逻辑分析仪确认每片的使能引脚在同一时刻有效。

  3. 现象:系统运行一段时间后总线发热,读出的数据忽好忽坏。原因:两片或多片的输出使能同时有效,三态门一起驱动总线,出现总线冲突。解决:检查片选译码器的输出是否互斥,确认 CS 的极性没有接反;必要时在译码器输出加互锁逻辑,保证任何时刻只有一个片选有效。

  4. 现象:DRAM 扩展后,刚写进去的数据过一会儿就读错,温度越高越容易出错。原因:刷新间隔按典型漏电率计算,没有留余量;或者刷新地址计数器的位数不够,漏掉了部分行。解决:按芯片手册的最大刷新周期和总行数计算每行间隔,留出 20% 以上余量;确认刷新计数器覆盖全部行地址,刷新期间仲裁好正常访问。

  5. 现象:用 ROM 做组合逻辑时,输入地址变化后输出出现窄脉冲毛刺,后级电路误触发。原因:地址线到达译码器的时间有先有后,译码器在过渡过程中短暂输出错误的字线,存储矩阵跟着输出错误数据。解决:在 ROM 输出后加一级寄存器,等地址稳定后再采样;或者用锁存器把输出毛刺屏蔽掉,不让它进入后级。

这些坑的共同点是:原理图上看起来都连了,但「连了」和「连对」是两回事。扩展电路的接线规则不复杂,复杂的是地址空间、使能极性和时序窗口的配合。血泪经验是,接完线先别上电跑程序,拿地址映射表和真值表逐段核对一遍,比事后拿逻辑分析仪抓波形省时间。

6. 用存储器实现组合逻辑:字线即最小项,以及选型时的取舍

讲义把「用存储器实现组合逻辑函数」放在最后,不是因为它难,而是因为它把前面所有机制串起来了。ROM 的地址译码器输出字线,字线就是输入变量的最小项;存储矩阵的位线把若干字线或起来,输出就是最小项之和。任何组合逻辑函数写成与-或标准式,都能直接映射到 ROM 的阵列里。换句话说,ROM 不只是一张数据表,它本身就是一台查表机。

6.1 字线即最小项:ROM 实现组合逻辑的底层映射

n 根地址线产生 2^n 根字线,每根字线对应一个最小项。存储矩阵里,位线和字线的交叉点有没有器件,决定这个最小项要不要加进输出。位线是或的关系:只要有一个被选中的字线通过器件连到位线,位线就输出有效。所以每一位输出都是若干最小项的或,正好是与-或标准式的形式。

这意味着设计组合逻辑时,不需要推导化简,只需要列真值表。输入变量数决定地址线数,输出函数个数决定数据位宽,存储容量就是 2^n×m。真值表里每一行对应一个地址,输出值对应这个地址里存的数据。改逻辑不用改电路,只改存储内容,这是 ROM 做逻辑最吸引人的地方。

# 三输入异或的组合逻辑,真值表直接映射成 ROM 内容 # 地址 A2A1A0 从 000 到 111,数据位宽 1 rom_table = [0, 1, 1, 0, 1, 0, 0, 1] # F = A2 ⊕ A1 ⊕ A0 def read_rom(a2, a1, a0): addr = (a2 << 2) | (a1 << 1) | a0 # 地址拼接:高位在前 return rom_table[addr] # 查表即求值

这段代码不是硬件实现,但它把 ROM 做逻辑的映射关系写清楚了:地址是输入变量的组合,表项是输出函数的值,读 ROM 就是一次查表求值。硬件里,地址译码器负责把 addr 翻译成字线,存储矩阵负责把表项送到位线,输出缓冲器负责把结果送出。参数上,地址线每增加一根,表项数量翻倍;数据位宽每增加一位,每个地址下要多存一位。

6.2 选型与验证:把真值表烧进去之前要想清楚的事

用 ROM 做逻辑不是没有代价。输入变量一多,容量按 2^n 指数增长,地址空间很快就不够用;而门电路实现同样的函数可能只要几个逻辑门。所以选型的分界线是:输入变量少、输出函数多、逻辑复杂到化简很费劲、或者数据本身固定不变时,ROM 的查表方式更划算;输入变量少、逻辑简单时,门电路或可编程逻辑器件更省成本和面积。

验证方法很朴素:把真值表逐行写进 ROM,再遍历所有地址读回来比对。地址从全 0 到全 1,每读一个地址就和预期输出对一次,对不上就查译码器接线或存储内容。这个方法笨,但能覆盖全部输入组合,比抽几个点测更有说服力。用 ROM 做逻辑最大的好处也在这里:逻辑的正确性完全由表决定,表对了,电路就对了。

从那以后我每次看到「存储器」三个字,都会先问一句:它到底把数据存在哪个物理量上,这个物理量会不会自己跑掉。掩模 ROM 存在版图里,PROM 存在熔丝里,EPROM 和快闪存在浮栅电荷里,SRAM 存在触发器的正反馈里,DRAM 存在电容的电荷里。想清楚这一层,再看地址译码、容量扩展、刷新时序,就不是一堆孤立的知识点,而是同一个问题的不同答案。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询