第 213 篇

考研数电·零基础讲义 第22讲(上)|ROM 只读存储器

约 13 分钟 4485 字 华南师范大学数字电子技术考研数电零基础讲义

考研数电·零基础讲义 · 第 22 讲(上)|ROM 只读存储器 学完这一讲,你能说清存储器的"地址、字、容量"是什么意思,看懂二极管 ROM 的读数过程,分得清掩模 ROM、PROM、EPROM、E²PROM、闪存,并能用 ROM 实现一组组合逻辑函数。预计用时 90–110 分钟。

本讲地图

  • 存储器概述:存储器 = 一大堆存储单元 + 地址。核心概念:地址、字、位、容量==字数×\times位数。
  • ROM 的结构:地址译码器(与阵列)+ 存储矩阵(或阵列)+ 输出缓冲器。字线、位线交叉点"有器件 = 存 1,没器件 = 存 0"。
  • ROM 的分类:掩模 ROM、PROM(一次性)、EPROM / E²PROM / 闪存(可擦写)。
  • 用 ROM 实现组合逻辑函数:nn个输入、mm个输出,用一片2n×m2^n\times m的 ROM,把真值表直接"抄"进去。
  • 华师怎么考:考纲写明"半导体存储器和可编程逻辑器件:SRAM、DRAM、ROM 等"。常见考法:概念题(ROM 与 RAM 区别、种类)、容量与地址线计算、用 ROM 实现函数并列数据表。教材对应第 5 章 5.5 节(5.5.3、5.5.5)。

前置知识

  • 二进制、最小项与最小项之和(见第 03 讲)。
  • 译码器:nn位输入译出2n2^n根输出线,每次只有一根有效(见第 09 讲下)。
  • 三态输出(见第 06 讲):三态缓冲器能让输出"断开",方便多个器件并联在总线上。

一、存储器的基本概念

大白话

寄存器(第 15 讲)是"一排小抽屉",每个抽屉的进出口都直接拉线出来,所以只能做很小几位。但电脑里要存几十亿位数据,不可能拉几十亿根线。

办法和住宿楼一样:给每个房间编号(地址),只有喊到哪个房号,那个房间才和门口的"公共窗口"接通。这样不管有多少房间,窗口永远只有那么几个引脚。

术语

术语 意思 例子
存储单元 存 1 位二进制数的最小单位 一个"抽屉"
字(word) 一个地址里存的一组数据 一个地址存 8 位,一个字就是 8 位
地址 给每个字的编号,用二进制数表示 10 根地址线能编210=10242^{10}=1024个地址
字数 地址的个数=2n=2^{n}(⁠nn为地址线数) 10 位地址 → 1024 字
位数 每个字的位数,等于数据线的根数 8 根数据线 → 8 位
存储容量 总共能存多少位 容量==字数×\times位数

写法:容量写成"字数 × 位数",例如1024×81024\times 8⁠,读作"1024 乘 8",总共1024×8=81921024\times8=8192位,也就是 1024 字节(1 字节 = 8 位)。

例 1 某存储器有 11 根地址线、8 根数据线,容量多大?

字数=211=2048=2^{11}=2048⁠,位数=8=8⁠,容量=2048×8=16384=2048\times8=16384位=2048=2048字节。

例 2 要存65536×1665536\times16的数据,需要几根地址线?总共多少位?

65536=21665536=2^{16}⁠,所以 16 根地址线;总位数=65536×16=1048576=65536\times16=1048576位=220=2^{20}位(1 Mbit)。

存储器的分类

按"能不能随时写"分成两大类:

  • RAM(随机存储器):随时可读可写,但断电后数据消失。分 SRAM(静态)和 DRAM(动态),见第 22 讲(下)。
  • ROM(只读存储器):正常工作时只能读,断电数据不丢。本讲重点。

⚠️ 易错:容量计算别漏乘位数。"1024×81024\times8"不是 1024 位,而是 8192 位。

二、ROM 的结构:一个"字典"

大白话

ROM 像一本出厂就印好的字典:你给它一个页码(地址),它就把那一页的内容(数据)读给你,而且你改不了字典内容。

三个组成部分

教材图 5.5.6 把 ROM 分成三块:

  1. 地址译码器:把地址代码变成"字线"信号。2 位地址A1A0A_1A_0译成 4 根字线W0∼W3W_0\sim W_3⁠,每次只有被选中的那根为高电平。(译码器本质就是一组与门,所以叫"与阵列"。)
  2. 存储矩阵:字线和"位线"(数据线)纵横交叉,每个交叉点是一个存储单元。交叉点接了器件表示存 1,没接表示存 0。(每根位线相当于一个或门,所以叫"或阵列"。)
  3. 输出缓冲器:增强带负载能力,并用EN′EN'信号做三态控制,方便接总线。

二极管 ROM 逐步读数

看图 1:2 位地址、4 位数据的 ROM(教材图 5.5.7),二极管接在字线和位线的交叉点。

二极管 ROM 读出演示 地址译码器 2线→4线 A1 A0 W0 W1 W2 W3 D3 D2 D1 D0 A1A0=00 A1A0=01 A1A0=10 A1A0=11 输出灯 橙条 = 当前被选中的字线;红点 = 二极管(存1);绿灯亮 = 该位读出1

图 1:二极管 ROM 读出演示。每 2 秒切换一个地址,橙条是被选中的字线,绿灯亮表示该位输出 1(动画循环播放)

读出原理:某根字线为高电平时,凡是接在它上面的二极管都导通,把对应位线拉成高电平;没接二极管的位线保持低电平。所以:

  • A1A0=00A_1A_0=00⁠:W0=1W_0=1⁠,W0W_0上有两个二极管,接D2D_2和D0D_0 → 输出D3D2D1D0=0101D_3D_2D_1D_0=0101⁠;
  • A1A0=01A_1A_0=01⁠:W1=1W_1=1⁠,接D3,D1,D0D_3,D_1,D_0 → 10111011⁠;
  • A1A0=10A_1A_0=10⁠:W2=1W_2=1⁠,只接D2D_2 → 01000100⁠;
  • A1A0=11A_1A_0=11⁠:W3=1W_3=1⁠,接D3,D2,D1D_3,D_2,D_1 → 11101110⁠。

整理成数据表:

A1A_1 A0A_0 D3D_3 D2D_2 D1D_1 D0D_0
0 0 0 1 0 1
0 1 1 0 1 1
1 0 0 1 0 0
1 1 1 1 1 0

这个 ROM 共4×4=164\times4=16个交叉点,其中有 9 个二极管(存 1 的个数),7 个空位(存 0)。

与阵列、或阵列:把 ROM 看成两层逻辑

由上表可以写出各位输出(把WiW_i看作最小项mim_i⁠):

D0=W0+W1,D1=W1+W3,D2=W0+W2+W3,D3=W1+W3D_0=W_0+W_1,\quad D_1=W_1+W_3,\quad D_2=W_0+W_2+W_3,\quad D_3=W_1+W_3

而W0=A1‾ A0‾W_0=\overline{A_1}\,\overline{A_0}⁠,W1=A1‾A0W_1=\overline{A_1}A_0⁠,W2=A1A0‾W_2=A_1\overline{A_0}⁠,W3=A1A0W_3=A_1A_0⁠。也就是说:

  • 译码器 = 把输入变量的全部最小项产生出来(固定的"与阵列",不可改);
  • 存储矩阵 = 每个输出是若干最小项相或(可编程的"或阵列")。

这就是为什么 ROM 能当"任意组合逻辑发生器"——后面第四节详述。

MOS 管 ROM

用 MOS 管做时,交叉点接 N 沟道增强型 MOS 管表示"存 1"(教材图 5.5.8)。字线高 → 该管导通 → 位线被拉低 → 输出缓冲器反相后输出 1。结论与二极管 ROM 一致:交叉点有管 = 存 1,没管 = 存 0。

⚠️ 易错:不同教材、不同图,"接器件"有时表示存 1,有时(如教材例 5.5.1 的掩模矩阵图)表示存 0。做题时先看题目或图下的说明。

三、ROM 的分类

按"数据怎么写进去"分,由简到繁:

类型 怎么写 能否改 特点
掩模 ROM 出厂时由掩模板决定 不能改 制作周期长、版图成本高,适合大批量定型产品
PROM 用户用编程器一次性写入 只能写一次 出厂时全是 1(所有交叉点都有器件),需要写 0 的地方把熔丝烧断(或反熔丝击穿接通)
EPROM(紫外线擦除) 编程器写入 可擦可重写 擦除用紫外线照射
E²PROM 电信号擦写 可擦可重写 可按字节擦写,不用紫外线
闪存(Flash) 电信号擦写,整块/整区擦除 可擦可重写,次数有限(约104∼10510^4\sim10^5次) 集成度高、容量大、成本低,U 盘、手机存储里用的就是它

PROM(熔丝型)要点

  • 原始状态:所有单元都存 1。
  • 写 0:选中该单元,在位线加编程脉冲(约 20 V,十几微秒),大电流烧断熔丝。
  • 熔丝烧断后无法恢复,所以 PROM 只能写一次。

闪存要点(浮栅 MOS 管)

  • 存储单元是浮栅 MOS 管:控制栅GcG_c之外多了一个被绝缘体包住的"浮置栅GfG_f"。
  • 浮置栅上充有负电荷 → 管子不容易导通(开启电压升高到 7 V 以上)→ 字线给正常高电平时管子仍截止 → 位线保持高 → 读出 1;浮置栅没电荷 → 管子导通 → 读出 0。
  • 写入(充电):漏极加约 6 V,控制栅加约 12 V 脉冲,雪崩注入使电子进入浮栅。
  • 擦除(放电):控制栅接 0,源极加约 12 V、约 100 ms 的正脉冲,利用隧道效应让电荷从浮栅放走。NOR 闪存所有源极连在一起,所以一擦就是一整个区。
  • 读很快(几十到两百纳秒),写慢(十到五十微秒/字节),所以闪存虽可擦写,仍归入只读存储器。

⚠️ 易错:闪存"能擦写"却叫只读存储器,原因是写比读慢得多,而且擦写次数有限,不能当 RAM 用。

四、用 ROM 实现组合逻辑函数

大白话

ROM 是"地址 → 数据"的查表机。一个组合逻辑电路,也是"输入 → 输出"的查表:给定输入组合,输出是确定的。把真值表按地址一行一行抄进 ROM,ROM 就成了这个电路。

规则

  • ROM 有nn位地址、mm位数据 → 最多实现mm个nn变量的函数。
  • 变量接地址线,函数从数据线输出。
  • 第ii个地址存放的数据 = 各函数在最小项mim_i处的取值(函数含mim_i就存 1,否则存 0)。
  • 所需 ROM 容量=2n×m=2^n\times m⁠。

例 3(教材例 5.5.2 的做法) 用 ROM 产生一组函数:

{Y1=A‾BC+A‾ B‾CY2=AB‾CD‾+BCD‾+A‾BCDY3=ABCD‾+A‾BC‾ D‾Y4=A‾ B‾CD‾+ABCD\begin{cases} Y_1=\overline{A}BC+\overline{A}\,\overline{B}C\\ Y_2=A\overline{B}C\overline{D}+BC\overline{D}+\overline{A}BCD\\ Y_3=ABC\overline{D}+\overline{A}B\overline{C}\,\overline{D}\\ Y_4=\overline{A}\,\overline{B}C\overline{D}+ABCD \end{cases}

第 1 步:全部展开成最小项。变量排成ABCDABCD(⁠AA最高位)。

  • Y1Y_1⁠:A‾BC\overline{A}BC缺DD⁠,展开成A‾BCD‾\overline{A}BC\overline{D}(0110=6)和A‾BCD\overline{A}BCD(0111=7);A‾ B‾C\overline{A}\,\overline{B}C展开成 0010=2 和 0011=3。所以Y1=∑m(2,3,6,7)Y_1=\sum m(2,3,6,7)⁠。
  • Y2Y_2⁠:AB‾CD‾A\overline{B}C\overline{D}=1010=10;BCD‾BC\overline{D}缺AA⁠,展开成 0110=6 和 1110=14;A‾BCD\overline{A}BCD=0111=7。所以Y2=∑m(6,7,10,14)Y_2=\sum m(6,7,10,14)⁠。
  • Y3Y_3⁠:ABCD‾ABC\overline{D}=1110=14;A‾BC‾ D‾\overline{A}B\overline{C}\,\overline{D}=0100=4。所以Y3=∑m(4,14)Y_3=\sum m(4,14)⁠。
  • Y4Y_4⁠:A‾ B‾CD‾\overline{A}\,\overline{B}C\overline{D}=0010=2;ABCDABCD=1111=15。所以Y4=∑m(2,15)Y_4=\sum m(2,15)⁠。

(以上最小项由 Python 逐个代入验证。)

第 2 步:选 ROM。4 个变量 → 4 位地址;4 个函数 → 4 位数据,选16×416\times4的 ROM。A,B,C,DA,B,C,D依次接地址线A3,A2,A1,A0A_3,A_2,A_1,A_0⁠,Y1∼Y4Y_1\sim Y_4依次接数据线D3,D2,D1,D0D_3,D_2,D_1,D_0⁠。

第 3 步:列数据表(行是地址,列是Y1Y2Y3Y4Y_1Y_2Y_3Y_4⁠):

地址(最小项) 数据Y1Y2Y3Y4Y_1Y_2Y_3Y_4 地址(最小项) 数据Y1Y2Y3Y4Y_1Y_2Y_3Y_4
0 0000 8 0000
1 0000 9 0000
2 1001 10 0100
3 1000 11 0000
4 0010 12 0000
5 0000 13 0000
6 1100 14 0110
7 1100 15 0001
16×4 ROM 点阵(Y1~Y4) Y1 D3 Y2 D2 Y3 D1 Y4 D0 W0 m0=0000 W1 m1=0001 W2 m2=0010 W3 m3=0011 W4 m4=0100 W5 m5=0101 W6 m6=0110 W7 m7=0111 W8 m8=1000 W9 m9=1001 W10 m10=1010 W11 m11=1011 W12 m12=1100 W13 m13=1101 W14 m14=1110 W15 m15=1111 每一列的圆点 = 该函数包含的最小项

图 2:例 3 的16×416\times4 ROM 点阵,每个红点表示存 1(交叉点接器件)

⚠️ 易错:函数不是最小项之和形式时,一定要先展开(缺的变量用X+X‾=1X+\overline{X}=1补)再填表;变量顺序要和地址高低位对应。

例 4:全加器

全加器有 3 个输入A,B,CiA,B,C_i⁠,2 个输出S,CoS,C_o(见第 11 讲)。用8×28\times2的 ROM:

ABCiABC_i SS CoC_o
000 0 0
001 1 0
010 1 0
011 0 1
100 1 0
101 0 1
110 0 1
111 1 1

即S=∑m(1,2,4,7)S=\sum m(1,2,4,7)⁠,Co=∑m(3,5,6,7)C_o=\sum m(3,5,6,7)⁠,ROM 容量23×2=162^3\times2=16位。

ROM 与其他实现方式的对比

  • 用 ROM:不用化简,直接抄真值表;变量一多,容量按2n2^n暴涨。
  • 变量数大于地址线数,或函数个数大于数据线数时:多片 ROM 扩展(见第 22 讲下),或者换别的电路。
  • 地址线用不完时:多余地址线接固定电平(接地或接高),只用其中一部分地址;多余数据位悬空不用。

例 5:用 ROM 做显示译码器(教材例 5.5.1 的思路)

把 4 位 BCD/二进制码DCBADCBA译成八段数码管(⁠a∼ga\sim g加小数点hh⁠)的 8 位驱动信号,共 16 个输入组合,所以选16×816\times8的 ROM:DCBADCBA接地址线A3∼A0A_3\sim A_0⁠,8 根数据线D7∼D0D_7\sim D_0依次接a∼ha\sim h⁠。

怎么写数据?以字形 "0" 为例:a,b,c,d,e,fa,b,c,d,e,f六段亮,gg不亮,小数点(按教材表)接高电平,数据就是abcdefgh=11111101abcdefgh=11111101⁠,把它存进地址 0000。其余 15 个地址同样"按字形抄"。

这类表格里 0 比 1 少得多(按教材表 5.5.4 的 16 行共 128 个数据位,其中有 40 个 0、88 个 1),而且做掩模 ROM 时"每个存 0 的位置才接二极管",所以接二极管表示存 0 能省下器件。这就是前面⚠️提到的"接器件有时表示 0"的原因:谁少,就用谁来接器件。

ROM 读数据的时序直觉

使用 ROM 时没有"写"这一步,只有"读":

  1. 在地址线上放好地址;
  2. 让输出使能EN′=0EN'=0(三态缓冲器打开);
  3. 等一小段时间(读出时间,即从地址稳定到数据稳定的延迟)后,数据线上就是该地址的内容;
  4. EN′=1EN'=1时输出为高阻,ROM 就从总线上"断开",别的器件可以用总线。

ROM 和 RAM 的对照

项目 ROM RAM
正常工作 只读 可读可写
断电 数据保留 数据丢失
单元 一个器件(或无) 锁存器 / 电容
典型用途 固定程序、字库、函数表 临时数据、运算中间结果
控制端 片选/输出使能,没有R/W′R/W' 片选、读写控制

五、速记卡

项目 要点
容量 字数2n2^n × 位数mm⁠,地址线nn根
ROM 三部分 地址译码器(与阵列)、存储矩阵(或阵列)、输出缓冲器(三态)
存 1 / 存 0 字线与位线交叉点:有器件 = 1,无 = 0(看题目说明)
掩模 ROM 出厂固定,批量大时用
PROM 熔丝烧断写 0,一次性
EPROM 紫外线擦除;E²PROM、闪存:电擦除
闪存 浮栅 MOS 管,负电荷 = 1;隧道效应擦除;擦写次数有限
实现函数 nn变量mm函数 → 2n×m2^n\times m ROM,按真值表写数据

六、自测练习

1. 某 ROM 有 13 根地址线、8 根数据线,容量是多少位?合多少 KB?

答案与提示

字数213=81922^{13}=8192⁠,容量8192×8=655368192\times8=65536位,=8192=8192字节=8=8 KB(⁠1KB=10241\text{KB}=1024字节)。

2. 一片64K×1664\text{K}\times16的存储器有几根地址线、几根数据线?总容量多少位?

答案与提示

64K=21664\text{K}=2^{16}字,所以 16 根地址线、16 根数据线;总容量65536×16=104857665536\times16=1048576位(1 Mbit)。

3. 简述 PROM 为什么只能写一次,闪存为什么能反复擦写。

答案与提示

PROM 靠烧断熔丝(或击穿反熔丝)写入,这是不可逆的物理变化;闪存靠浮栅上电荷的"充入/放出"改变管子的开启电压,电荷可以通过雪崩注入再充、隧道效应再放,所以可以重复擦写(次数有限)。

4. 图 1 中的二极管 ROM,A1A0=11A_1A_0=11时输出什么?D3D_3对应哪些地址存 1?

答案与提示

A1A0=11A_1A_0=11时W3=1W_3=1⁠,输出D3D2D1D0=1110D_3D_2D_1D_0=1110⁠。D3D_3在地址 01 和 11 处存 1,即D3=W1+W3D_3=W_1+W_3⁠。

5. 用 ROM 实现 2 位二进制数A1A0A_1A_0到格雷码的转换需要几位地址、几位数据?若是 4 位二进制数B3B2B1B0B_3B_2B_1B_0转 4 位格雷码G3G2G1G0G_3G_2G_1G_0呢?写出后者地址 5(0101)、10(1010)存的数据。

答案与提示

2 位:22×22^2\times2⁠,2 位地址、2 位数据。4 位:16×416\times4 ROM,4 位地址、4 位数据。格雷码G=B⊕(B≫1)G=B\oplus(B\gg1)⁠:地址 5 → 0101⊕0010=01110101\oplus0010=0111⁠;地址 10 → 1010⊕0101=11111010\oplus0101=1111⁠。(Python 验算全部 16 行。)

6. 用 ROM 实现"3 位二进制数xx的平方",需要多大容量的 ROM?写出x=5x=5和x=7x=7时的数据。

答案与提示

xx最大 7,72=49<647^2=49<64⁠,输出需要 6 位。所以用23×6=8×62^3\times6=8\times6的 ROM(共 48 位)。x=5x=5⁠:25=01100125=011001⁠;x=7x=7⁠:49=11000149=110001⁠。

7. 用 ROM 实现 2 位 × 2 位二进制乘法器P=A1A0×B1B0P=A_1A_0\times B_1B_0⁠,ROM 的规格?地址 1001(⁠A=10,B=01A=10,B=01⁠)和 1111 存什么?

答案与提示

4 个输入、乘积最大3×3=93\times3=9(1001),4 位输出,选16×416\times4 ROM。地址 1001:2×1=22\times1=2 → 0010;地址 1111:3×3=93\times3=9 → 1001。

8.(华师真题风格) 用 ROM 实现一位全加器,写出 ROM 的规格和数据表,并说明与用门电路实现相比有什么特点。

答案与提示

规格8×28\times2(见例 4),数据表见例 4。特点:不用化简、设计直观,改功能只需改数据;但容量随变量数按2n2^n增长,输入多时不经济,且速度受 ROM 读出时间限制。


下一讲预告

第 22 讲(下)讲能读能写的 RAM:SRAM 靠锁存器存数,DRAM 靠电容存数还要刷新;之后学怎么用多片存储器通过"位扩展、字扩展"拼出更大容量,并算清地址分配。

👉 点击进入下一讲:第22讲(下)|SRAM、DRAM 与存储器容量扩展

评论

还没有评论。 来写第一条。

留下一条评论

选填,不会公开

纯文本,链接会自动识别。