2. DDR存储技术基础
在 Lattice FPGA 上实现 DDR 存储接口,第一步不是写 Verilog,而是把 DDR SDRAM 这颗芯片“看透”:它内部如何组织存储阵列、一次读写要经过哪些时序阶段、FPGA 侧又通过哪些信号与它对话。只有把这三件事对齐,后面的 IP 配置、引脚约束和时序收敛才有依据。本节围绕 DDR SDRAM 的工作原理、关键时序参数、Bank/Row/Column 结构以及与 Lattice FPGA 的接口信号定义展开。
一、DDR SDRAM 的工作原理:双沿传输与流水线访问
DDR 即 Double Data Rate,核心特征是数据在时钟的上升沿和下降沿都采样,因此同一时钟频率下数据率是 SDR 的两倍。以 200 MHz 时钟为例,SDR 数据率为 200 Mbps,而 DDR 可达 400 Mbps(即 DDR-400)。这也是为什么 DDR 接口中数据信号 DQ 与数据选通信号 DQS 成对出现——DQS 由发送端随数据一起发出,接收端用它来对齐采样窗口,而不是直接用系统时钟去采数据。
DDR SDRAM 的访问不是“给地址就出数据”的组合逻辑,而是一条命令流水线:先由控制器发出 ACT(激活)命令打开某一行,把整行数据搬入行缓冲;再发 RD/WR(读/写)命令,配合列地址在行缓冲中定位具体单元;读写完成后若需访问同一 Bank 的另一行,必须先发 PRE(预充电)关闭当前行。因此一次完整的“行切换”访问包含 ACT→RD/WR→PRE 三个阶段,而连续访问同一行内的不同列则只需重复 RD/WR,效率最高。理解这一点,是后续做地址映射和突发长度设计的基础。
二、Bank / Row / Column 结构:三维寻址
DDR SDRAM 内部是一个三维存储阵列:Bank(体)→ Row(行)→ Column(列)。以常见的 256 Mb(32 MB)DDR 颗粒为例,典型组织为 4 个 Bank、每个 Bank 8192 行、每行 512 列、位宽 16 bit。地址总线因此被拆成三部分:Bank 地址 BA[1:0] 选体,行地址 A[12:0] 选行,列地址 A[8:0] 选列。行地址和列地址复用同一组 A 引脚,通过 RAS/CAS 命令区分当前是行地址还是列地址。
这种结构的工程意义在于:同一 Bank 内换行代价高(需 PRE+ACT),跨 Bank 切换代价低。因此控制器和用户逻辑在做地址映射时,通常把连续地址的低位映射到 Column、中位映射到 Bank、高位映射到 Row,让连续突发访问尽量落在同一行内,并利用多 Bank 交错(Bank Interleaving)把不同 Bank 的 ACT 与 RD/WR 重叠起来,掩盖行激活延迟。这是 DDR 带宽利用率的关键来源。
三、关键时序参数:读懂数据手册的“时间语言”
DDR 能否稳定工作,取决于控制器发出的命令间隔是否满足颗粒的时序约束。以下参数在 Lattice DDR IP 配置和时序收敛中最常出现,均以时钟周期 tCK 为单位或纳秒表示:
| 参数 | 含义 | 典型示例(DDR-400,tCK=5 ns) |
|---|---|---|
| tRCD | ACT 到 RD/WR 的最小间隔(行激活到列访问) | 15 ns ≈ 3 tCK |
| tRP | PRE 到下一次 ACT 的最小间隔(预充电时间) | 15 ns ≈ 3 tCK |
| tRAS | ACT 到 PRE 的最小间隔(行保持时间) | 40 ns ≈ 8 tCK |
| CL | CAS 延迟,RD 命令到数据出现在 DQ 上的周期数 | 3 tCK |
| tWR | 写恢复时间,WR 到 PRE 的最小间隔 | 15 ns ≈ 3 tCK |
| tRFC | 刷新周期,REF 命令到下一次有效命令的间隔 | 70 ns ≈ 14 tCK |
这些参数不是孤立的:一次“换行读”的总延迟约为 tRP + tRCD + CL,示例中约 3+3+3=9 个时钟周期;而同一行内连续读只需按 CL 流水输出。控制器正是通过 Bank 交错和命令重排,把不同 Bank 的 tRCD、tRP 隐藏到其他 Bank 的数据传输期间,从而逼近理论带宽。在 Lattice 的 DDR IP 中,这些参数以“时序配置页”的形式输入,必须与所选颗粒数据手册一致,否则会出现读数据错位或初始化失败。
四、与 Lattice FPGA 的接口信号定义
Lattice FPGA 与 DDR SDRAM 之间的接口可分为四组,理解每组的方向和用途,是引脚约束和 PCB 检查的前提:
- 时钟与使能:CK/CK# 为差分时钟,由 FPGA 输出;CKE 为时钟使能,低电平时颗粒进入掉电或自刷新。
- 命令与地址:CS#、RAS#、CAS#、WE# 组合出 ACT、RD、WR、PRE、REF 等命令;A[12:0] 与 BA[1:0] 复用传递行/列/Bank 地址。
- 数据与掩码:DQ[15:0] 双向数据;DQS 为数据选通,读写方向不同;DM 为数据掩码,写操作时屏蔽指定字节。
- 配置与匹配:ODT 控制片内终端电阻,改善信号完整性;ZQ 外接精密电阻用于校准驱动强度。
五、从结构到实现:一个地址映射示例
假设用户逻辑产生 32 位线性地址 addr[24:0],映射到上述 256 Mb、16 bit 位宽的颗粒。一种常见映射为:addr[8:0] 作为列地址(512 列),addr[10:9] 作为 Bank 地址(4 Bank),addr[23:11] 作为行地址(8192 行),最低位 addr[0] 用于 16 bit 内的字节选择。这样连续 512 个 16 bit 数据落在同一行,突发访问效率最高;当跨越 1 KB 边界时才切换 Bank,控制器可提前激活下一 Bank 的行,把 tRCD 隐藏在数据传输之后。