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 控制写入、输出或读写方向
地址线 传送要访问的地址
数据线 传送要写入或读出的数据

存储芯片结构图:X、Y 双译码与 8 个 64×64 存储矩阵

图中 A0~A5 送入 X 译码器,A6~A11 送入 Y 译码器,分别选择 64 行和 64 列。8 个 64×6464\times64 存储矩阵对应一个存储字的 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)把二进制地址转换成存储位置的选择信号。 对于 2n2^n 个可寻址单元,需要 nn 位地址信息。

例如,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

译码器使对应的一条字选择线有效;若该单元保存多位数据,这条字线就控制该字的各个存储元。

对于 nn 位地址,译码器有 2n2^n 条输出选择线。例如,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的阵列为例:行、列选择线的交点就是目标存储元。多位字结构可用多个位平面,或选择一组列,读写同一地址对应的多位数据。

若地址共 nn 位,其中 rr 位作为行地址、cc 位作为列地址,且 r+c=nr+c=n,则:

可寻址单元数=2r×2c=2n,行、列译码器输出选择线总数=2r+2c.\begin{aligned} \text{可寻址单元数} &= 2^r \times 2^c = 2^n,\\ \text{行、列译码器输出选择线总数} &= 2^r + 2^c. \end{aligned}

例如,1K × 1 的存储器需要 10 位地址,将其拆成 5 位行地址和 5 位列地址:

  • 行译码器:5 位输入,32 条行选择线。
  • 列译码器:5 位输入,32 条列选择线。
  • 可选择的位置:32×32=102432\times32=1024 个。
  • 译码器输出选择线合计:32+32=6432+32=64 条,比单译码的 1024 条少得多。

若约定高 5 位为行地址、低 5 位为列地址,输入 00100 00010 时,就选中第 4 行、第 2 列,对应线性地址 4×32+2=1304\times32+2=130(编号从 0 开始)。

特点: 减少译码器输出线和片内布线,适合较大容量存储器。行、列地址位数分得越接近,2r+2c2^r+2^c 通常越小。

对比项 单译码法 双译码法
地址处理 全部地址位统一译码 地址分成行、列两部分译码
选择方式 一条字线直接选中一个单元 行、列共同选中一个位置或字
译码器输出线数 2n2^n 2r+2c2^r+2^c,其中 r+c=nr+c=n
1K 个地址的例子 1024 条 32 + 32 = 64 条
适用情况 较小容量 较大容量

重点: 双译码减少的是片内译码器输出选择线,地址仍需 nn 位信息;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:

  1. 给出地址 0011,并使片选 /CS = 0。
  2. 设置 /WE = 1、/OE = 0,允许读出。
  3. 地址译码电路选中地址 3,I/O 电路将其中的数据送到数据线上。
  4. 若该地址存有 10110010,CPU 就读到 10110010。

向地址 0011 写入 11001010:

  1. 给出地址 0011,数据线上放置 11001010。
  2. 使片选 /CS = 0、写使能 /WE = 0,并关闭输出。
  3. 译码电路选中地址 3,I/O 电路将数据写入该单元。

一次访问要确定三个问题:哪颗芯片(片选)、哪个位置(地址译码)、读还是写(读写控制)。

容量表示:8K × 8

8K × 8 表示 8K 个可寻址存储单元,每个单元保存 8 bit。这里 K=210K=2^{10}。

总容量=8192×8 bit=65536 bit=8192 B=8 KB.\text{总容量}=8192\times8\text{ bit}=65536\text{ bit}=8192\text{ B}=8\text{ KB}.

对地址不复用的普通并行芯片:

  • 8K=2138K=2^{13} 个地址,需要 13 根地址线,即 A0~A12。
  • 每个地址读写 8 bit,需要 8 根数据线,即 D0~D7。

一般地,2n×m2^n\times m 的存储芯片具有 2n2^n 个地址、每个地址存 mm 位,总容量为 2nm2^n m bit;地址不复用时需要 nn 根地址线和 mm 根数据线。

DRAM 的地址引脚复用

双译码将内部地址分为行、列两部分;DRAM 进一步利用这种划分,让行地址与列地址共用外部引脚。地址引脚复用(Address Pin Multiplexing):同一组物理地址引脚,先传行地址(Row Address),再传列地址(Column Address)。 通过分时传送完整地址,减少引脚数量和封装成本。

4M×4 位 DRAM 芯片逻辑结构图:地址复用、行列译码与刷新计数器

图中的 4M × 4 位 DRAM 按 2048×2048×42048\times2048\times4 组织:2048 行、2048 列,每个地址读写 4 bit,数据引脚为 D1~D4。它共有 211×211=2222^{11}\times2^{11}=2^{22} 个地址,总容量为 222×4 bit=2 MB2^{22}\times4\text{ bit}=2\text{ MB}。

完整地址需要 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 次刷新,均匀安排时平均间隔为:

tREFI=64 ms8192≈7.8 μs.t_{\mathrm{REFI}}=\frac{64\text{ ms}}{8192}\approx7.8\,\mu\text{s}.
  • tREFIt_{\mathrm{REFI}}(Refresh Interval):刷新命令的平均间隔,即隔多久刷新一次。
  • tRFCt_{\mathrm{RFC}}(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 保存处理器使用的数据块,二者的位置、容量和管理方式不同。


主存这部分内容有些多,
有点记不住,
到时候得多花些时间。😎
工作中