SRAM 与 DRAM
SRAM 和 DRAM 都属于易失性存储器:断电后数据都会丢失。RAM(Random Access Memory,随机存取存储器)中的“随机存取”表示可以按地址直接访问目标位置。SRAM 和 DRAM 的主要区别在于一个 bit 的存储方式,这进一步影响速度、集成密度、成本和用途。
| 对比项 | SRAM | DRAM |
|---|---|---|
| 全称 | Static RAM,静态随机存取存储器 | Dynamic RAM,动态随机存取存储器 |
| 存储信息的方式 | 触发器式双稳态电路,常见为 6T 锁存结构 | 电容电荷,通常为 1 个晶体管 + 1 个电容,即 1T1C |
| 破坏性读出(Destructive Read) | 否 | 是,读出后需恢复数据 |
| 是否需要周期刷新 | 不需要 | 需要 |
| 行、列地址传送方式 | 同时送入,即一次传送完整地址 | 分两次传送,复用同一组地址引脚 |
| 运行速度 | 较快 | 较慢 |
| 集成度 | 较低 | 较高 |
| 单位容量存储成本 | 较高 | 较低 |
| 常见容量规模 | KB~几十 MB 级 | GB 级很常见 |
| 主要用途 | 高速缓存(Cache)、片上高速存储 | 主机内存(Main Memory),如电脑、手机主内存 |
表中的地址传送方式按常见 SRAM 与经典异步 DRAM 的结构比较;SRAM 的地址一次送入,也可以在芯片内部进行行、列双译码。
SRAM:用电路状态保存数据
常见的 6T SRAM 存储元(Memory Cell)由 6 个晶体管构成,其中两个反相器交叉耦合,形成双稳态锁存电路(Bistable Latch),另外两个晶体管控制访问。
两个反相器交叉耦合
↓
Q = 1,Q̅ = 0 或 Q = 0,Q̅ = 1
↓
分别表示两种二进制状态
只要供电正常,电路就能保持原来的状态。“静态”表示通电期间不需要周期刷新,并不表示断电后还能保存数据。
DRAM:用电容电荷保存数据
典型 DRAM 存储元采用 1T1C 结构:访问晶体管(Access Transistor)控制电容(Capacitor)与位线(Bit Line)之间的连接,字线(Word Line)控制晶体管的导通。电容中的电荷状态表示数据。可以粗略理解为“有电荷表示 1,无电荷表示 0”。
位线 ── 访问晶体管 ── 电容
↑
字线控制
电容会漏电,即使没有读写,电荷也会逐渐减少,因此必须周期性地恢复电荷,这就是刷新(Refresh)。
重点: SRAM 用双稳态电路存数据,不需要刷新,速度快、成本高,常用于 Cache;DRAM 用电容存数据,需要刷新,密度高、成本低,常用于主内存。
存储芯片的组成
前面解释了一个 bit 怎样保存;要把大量 bit 组成可以按地址读写的芯片,还需要选择位置、传输数据和控制访问的电路。
存储芯片(Memory Chip)主要包括存储体、地址译码电路、I/O 电路和控制电路(Control Circuit)。地址线(Address Lines)、数据线(Data Lines)和控制线(Control Lines)将芯片与外部系统连接起来。
| 部件或信号 | 作用 |
|---|---|
| 存储体 | 实际保存二进制数据 |
| 地址译码器 | 根据地址选中芯片内部的存储位置 |
| I/O 电路 | 将数据写入存储体,或将数据读出 |
| 片选信号 CS/CE | 决定这颗芯片是否响应访问 |
| 读写控制信号 WE/OE/R/W | 控制写入、输出或读写方向 |
| 地址线 | 传送要访问的地址 |
| 数据线 | 传送要写入或读出的数据 |

图中 A0~A5 送入 X 译码器,A6~A11 送入 Y 译码器,分别选择 64 行和 64 列。8 个 存储矩阵对应一个存储字的 8 位,因此芯片组织为 4K × 8,总容量为 4 KB。地址寄存器(Address Register)保存地址,驱动器(Driver)增强选择信号的驱动能力;I/O 电路与控制电路完成数据传送和读写控制。
存储体
存储体(Memory Array)是存储单元的集合,通常按阵列组织。
- 存储元(Memory Cell):保存一个二进制位,即 1 bit。
- 存储单元(Addressable Storage Location):具有一个地址、可被选中访问的存储位置,可由多个存储元组成。
- 一个地址对应的一组数据也称为存储字(Memory Word);若每个存储单元保存 8 bit,则一个地址对应 8 个存储元,可以一次读写 1 Byte。
例如,SRAM 的存储元通常用多个晶体管实现,DRAM 的存储元通常用晶体管与电容实现。
地址译码器
存储体提供了保存数据的位置,接下来要解决的是如何选中其中一个位置。地址译码器(Address Decoder)把二进制地址转换成存储位置的选择信号。 对于 个可寻址单元,需要 位地址信息。
例如,8 个单元编号为 0~7,需要 3 位地址。输入 101₂ = 5 时,译码电路选中地址为 5 的单元。
地址译码主要有单译码法和双译码法两种。
单译码法:一个译码器直接选中一个字
单译码法(One-Dimensional Decoding)又称字结构:全部地址位送入一个译码器,每条输出线对应一个存储单元,称为字选择线(字线,Word Line)。
A2、A1、A0
│
▼
3—8 译码器
│
├── W0 → 单元 0
├── W1 → 单元 1
├── …
├── W5 → 单元 5 ← 地址 101 时选中
├── W6 → 单元 6
└── W7 → 单元 7
译码器使对应的一条字选择线有效;若该单元保存多位数据,这条字线就控制该字的各个存储元。
对于 位地址,译码器有 条输出选择线。例如,1K 个单元需要 10 位地址,单译码需 1024 条字选择线。
特点: 结构直观,但容量增大时输出线数量迅速增加,布线复杂,适合较小容量的存储器。
双译码法:行、列共同选中一个位置
双译码法(Two-Dimensional Decoding)又称重合译码法(Coincident Decoding):将地址分为 X 向与 Y 向两部分,分别送入行译码器(Row Decoder)和列译码器(Column Decoder),通过行、列选择信号共同确定目标位置。
前面的存储芯片结构图就是双译码的例子:X 译码器选行,Y 译码器选列,8 个位平面在同一行、列位置各提供 1 bit,合起来读写一个 8 bit 的存储字。图中约定低 6 位地址选行、高 6 位选列;行、列与高低地址位的对应关系由具体结构决定。
为便于理解,先以每个地址存 1 bit的阵列为例:行、列选择线的交点就是目标存储元。多位字结构可用多个位平面,或选择一组列,读写同一地址对应的多位数据。
若地址共 位,其中 位作为行地址、 位作为列地址,且 ,则:
例如,1K × 1 的存储器需要 10 位地址,将其拆成 5 位行地址和 5 位列地址:
- 行译码器:5 位输入,32 条行选择线。
- 列译码器:5 位输入,32 条列选择线。
- 可选择的位置: 个。
- 译码器输出选择线合计: 条,比单译码的 1024 条少得多。
若约定高 5 位为行地址、低 5 位为列地址,输入 00100 00010 时,就选中第 4 行、第 2 列,对应线性地址 (编号从 0 开始)。
特点: 减少译码器输出线和片内布线,适合较大容量存储器。行、列地址位数分得越接近, 通常越小。
| 对比项 | 单译码法 | 双译码法 |
|---|---|---|
| 地址处理 | 全部地址位统一译码 | 地址分成行、列两部分译码 |
| 选择方式 | 一条字线直接选中一个单元 | 行、列共同选中一个位置或字 |
| 译码器输出线数 | ,其中 | |
| 1K 个地址的例子 | 1024 条 | 32 + 32 = 64 条 |
| 适用情况 | 较小容量 | 较大容量 |
重点: 双译码减少的是片内译码器输出选择线,地址仍需 位信息;DRAM 的地址引脚复用才是通过分时传送来减少外部地址引脚。SRAM 也可以采用双译码结构。
I/O 电路
译码确定访问位置后,数据还要在存储体与外部之间传送。I/O(Input/Output,输入/输出)电路是存储体与外部数据总线(Data Bus)之间的接口,可包含输入/输出缓冲器(Input/Output Buffer)、感应放大器(Sense Amplifier)和三态输出电路(Tri-State Output Circuit)等。
写入:CPU → 数据线 → I/O 电路 → 存储体
读取:存储体 → I/O 电路 → 数据线 → CPU
在普通并行存储芯片中,8 根数据线 D7~D0 表示一次可传输 8 bit,即 1 Byte。
片选与读写控制
CS(Chip Select) 表示片选,也可标为 CE(Chip Enable)。多个芯片连接到同一总线时,地址总线(Address Bus)和数据总线上的信号可以到达多个芯片,片选信号决定哪颗芯片响应。
信号名前加 / 或上方加横线,通常表示低电平有效:例如 /CS = 0 表示选中芯片,/CS = 1 表示未选中。
常见读写控制信号包括:
- WE(Write Enable):写使能,控制将数据写入当前地址。
- OE(Output Enable):输出使能,控制芯片是否向数据总线输出数据。
- R/W:部分芯片用一个信号区分读、写方向。
以采用低电平有效 /CS、/WE、/OE 的普通异步 SRAM 为例:
| 操作 | /CS | /WE | /OE | 数据方向或输出状态 |
|---|---|---|---|---|
| 未选中 | 1 | 任意 | 任意 | 芯片不响应,输出高阻 |
| 读取 | 0 | 1 | 0 | 芯片 → 外部数据总线 |
| 写入 | 0 | 0 | 1 | 外部数据总线 → 芯片 |
| 禁止输出 | 0 | 1 | 1 | 输出高阻 |
这里写入时将 /OE 置为 1 以关闭输出;实际芯片的控制组合和时序以其手册为准。
一次读写怎样完成
以下是逻辑过程,地址、数据和控制信号还须满足芯片规定的时序。
读取地址 0011:
- 给出地址
0011,并使片选/CS = 0。 - 设置
/WE = 1、/OE = 0,允许读出。 - 地址译码电路选中地址 3,I/O 电路将其中的数据送到数据线上。
- 若该地址存有
10110010,CPU 就读到10110010。
向地址 0011 写入 11001010:
- 给出地址
0011,数据线上放置11001010。 - 使片选
/CS = 0、写使能/WE = 0,并关闭输出。 - 译码电路选中地址 3,I/O 电路将数据写入该单元。
一次访问要确定三个问题:哪颗芯片(片选)、哪个位置(地址译码)、读还是写(读写控制)。
容量表示:8K × 8
8K × 8 表示 8K 个可寻址存储单元,每个单元保存 8 bit。这里 。
对地址不复用的普通并行芯片:
- 个地址,需要 13 根地址线,即
A0~A12。 - 每个地址读写 8 bit,需要 8 根数据线,即
D0~D7。
一般地, 的存储芯片具有 个地址、每个地址存 位,总容量为 bit;地址不复用时需要 根地址线和 根数据线。
DRAM 的地址引脚复用
双译码将内部地址分为行、列两部分;DRAM 进一步利用这种划分,让行地址与列地址共用外部引脚。地址引脚复用(Address Pin Multiplexing):同一组物理地址引脚,先传行地址(Row Address),再传列地址(Column Address)。 通过分时传送完整地址,减少引脚数量和封装成本。

图中的 4M × 4 位 DRAM 按 组织:2048 行、2048 列,每个地址读写 4 bit,数据引脚为 D1~D4。它共有 个地址,总容量为 。
完整地址需要 22 位,可拆成 11 位行地址和 11 位列地址:
- 不复用时:一次传送完整地址,需要 22 根地址引脚。
- 复用时:同一组 11 根地址引脚
A0~A10分两次传送,另配相应控制信号。
行地址缓冲器(Row Address Buffer)和列地址缓冲器(Column Address Buffer)分别保存两次传入的地址。MUX(Multiplexer,多路选择器)决定行译码器使用哪一路地址:普通访问时使用行地址缓冲器的地址,刷新时可使用刷新计数器(Refresh Counter)提供的地址。
经典异步 DRAM 用 RAS(Row Address Strobe,行地址选通)与 CAS(Column Address Strobe,列地址选通)区分两次地址:
地址引脚放入行地址 → /RAS 有效 → 锁存行地址
↓
同一组引脚改放列地址 → /CAS 有效 → 锁存列地址
↓
访问相应位置,读出或写入数据
例如完整地址 01011010011 00110100101,可约定拆成行地址 01011010011(723)和列地址 00110100101(421),分别通过同一组 11 根引脚发送。
现代同步动态随机存取存储器(Synchronous DRAM,SDRAM)及 DDR DRAM 的协议更复杂,通常先在一个存储体(Bank)内打开目标行,再选择列。这里的 Bank 是芯片内部可独立管理行状态的存储阵列分区:
ACTIVATE:选择 Bank 和 Row,打开目标行
↓
READ / WRITE:给出 Column,访问行中的数据
行、列译码描述内部怎样选位置,地址复用描述外部怎样传地址,两者要分清。
DRAM 的刷新
为什么需要刷新,刷新做了什么
行、列地址解决了“访问哪里”的问题,但电容保存的数据还需要定期维护。DRAM 电容会漏电,必须在规定时间内恢复电荷,否则可能无法正确判定原来的 0 或 1。
打开一行时,电容与位线连接,感应放大器(Sense Amplifier)检测微小电压变化,将其放大为明确的逻辑电平,并恢复存储元中的电荷。
打开目标行 → 感应放大器判断数据 → 恢复整行电荷
DRAM 读出会扰动原来的电荷,因而读取过程需要恢复数据。 刷新利用类似的感应与恢复过程,通常无需将数据送到 CPU。
刷新以行为基本单位:选中一行后,恢复这一行中的所有存储元,无需像普通读取那样再用列地址选择对外输出的数据。
重点: 刷新不是 CPU 逐个读出再写回,而是 DRAM 内部周期性地恢复各行数据。普通读取不能代替定期刷新,因为不能保证所有行都在规定时间内被访问。
刷新间隔与占用时间
假设某 DRAM 要求在 64 ms 内完成 8192 次刷新,均匀安排时平均间隔为:
- (Refresh Interval):刷新命令的平均间隔,即隔多久刷新一次。
- (Refresh Cycle Time):一次刷新所需的时间,即刷新会占用多久。
这里的数值是一个典型示例,具体刷新要求随器件和工作条件而变化;一次刷新命令也不一定只对应一条物理行。
刷新占用的 Bank 或相关资源暂时不能正常读写,因此会造成一定的等待和性能损失。将刷新操作分散在刷新周期内,可以避免集中刷新造成长时间阻塞。
刷新 → 正常访问 → 正常访问 → 刷新 → 正常访问 → …
自动刷新与自刷新
| 方式 | 谁负责定时发起 | 数据恢复由谁完成 | 常见场景 |
|---|---|---|---|
| Auto Refresh,自动刷新 | 外部存储控制器发送刷新命令 | DRAM 内部刷新计数器推进地址并恢复数据 | 正常运行 |
| Self Refresh,自刷新 | DRAM 内部定时器 | DRAM 自行选择刷新地址并恢复数据 | 睡眠、待机等低功耗状态 |
自刷新仍需要供电,只是无需外部控制器持续发送刷新命令。
行缓冲区与突发传输
行缓冲区、行命中与行冲突
前面的读取和刷新都涉及打开整行。这种操作还使同一行内的后续访问更高效:DRAM 打开一行时,会将整行数据感应并保存在行缓冲区(Row Buffer)中,再根据列地址选取所需的数据。行缓冲区通常由感应放大器承担。
选择目标行 → 整行进入行缓冲区 → 根据列地址读写其中的数据
对于同一个 Bank:
| 后续访问情况 | 需要的操作 | 访问特点 |
|---|---|---|
| 行命中(Row Buffer Hit):访问已经打开的行 | 直接选择相应列 | 较快 |
| 行冲突(Row Buffer Conflict):需要访问另一行 | 关闭旧行并预充电(Precharge),再打开新行、选择列 | 较慢 |
例如,第 100 行已打开,接着访问该行的第 20、21、22 列可以行命中;若改为访问同一 Bank 的第 200 行,就需要切换行。
突发传输与突发长度
突发传输(Burst)是在给出一次起始地址后,连续传输多个数据;一次突发传输的数据拍数称为突发长度(Burst Length,BL)。一拍表示一次数据传输,传输的位数由数据接口宽度决定。
例如,按顺序突发、BL = 4,从已打开行的第 20 列开始,可以示意为:
给出起始列地址 20
↓
第 20 列 → 数据 0
第 21 列 → 数据 1
第 22 列 → 数据 2
第 23 列 → 数据 3
BL = 8 则连续传输 8 拍。实际列地址推进和回绕方式由器件的突发规则决定。
因为整行数据已经位于行缓冲区中,连续选择相邻列很方便,可以减少重复传送地址和控制信息的开销,提高传输效率。
DDR 与处理器高速缓存
DDR(Double Data Rate,双倍数据速率)在时钟上升沿和下降沿都传输数据,一个时钟周期可传输两拍。
第 1 个上升沿 → 数据 0
第 1 个下降沿 → 数据 1
第 2 个上升沿 → 数据 2
第 2 个下降沿 → 数据 3
配合突发传输,可以连续传送一块数据。CPU 高速缓存(Cache)通常按缓存行(Cache Line)获取数据,适合利用 DRAM 的突发传输:
处理器请求一块数据
↓
存储控制器确定 Bank、Row、Column
↓
打开目标行,整行数据进入行缓冲区
↓
选择起始列,进行突发传输
↓
连续数据送入处理器 Cache
DRAM 的行缓冲区保存打开的行,CPU Cache 保存处理器使用的数据块,二者的位置、容量和管理方式不同。
主存这部分内容有些多,
有点记不住,
到时候得多花些时间。😎
