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 SDRAM 三维寻址结构与 Lattice FPGA 接口信号 Lattice FPGA DDR 控制器 / PHY 命令与地址生成 写数据 / 读采样 DQS 对齐与训练 ODT / 驱动强度 时钟 CK / CK# A / BA / CS# / RAS# / CAS# / WE# DQ[15:0] / DQS / DM DQS 训练反馈 ODT / CKE CK / CK# DDR SDRAM 颗粒(示例:256 Mb,4 Bank × 8192 Row × 512 Col × 16 bit) Bank 0 Row 0 Row 1 … Row 8191 行缓冲 Bank 1 Row 0 Row 1 … Row 8191 行缓冲 Bank 2 Row 0 Row 1 … Row 8191 行缓冲 Bank 3 Row 0 Row 1 … Row 8191 行缓冲 行缓冲内列寻址(以 Bank0 Row0 为例) Col0 Col1 Col2 Col3 … Col508 Col509 Col510 Col511 连续突发优先落在同一行内 → 减少 PRE/ACT 开销 跨 Bank 交错可重叠行激活延迟 → 提升带宽利用率

三、关键时序参数:读懂数据手册的“时间语言”

DDR 能否稳定工作,取决于控制器发出的命令间隔是否满足颗粒的时序约束。以下参数在 Lattice DDR IP 配置和时序收敛中最常出现,均以时钟周期 tCK 为单位或纳秒表示:

参数含义典型示例(DDR-400,tCK=5 ns)
tRCDACT 到 RD/WR 的最小间隔(行激活到列访问)15 ns ≈ 3 tCK
tRPPRE 到下一次 ACT 的最小间隔(预充电时间)15 ns ≈ 3 tCK
tRASACT 到 PRE 的最小间隔(行保持时间)40 ns ≈ 8 tCK
CLCAS 延迟,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 外接精密电阻用于校准驱动强度。
在 Lattice 器件中,DDR 接口的 DQ/DQS 必须分配到支持 DDR 的专用 I/O Bank,并遵守同一字节组内 DQS 与 DQ 的配对关系;地址与命令线则需做等长约束。引脚分配错误往往表现为“初始化能过、读写偶发错误”,排查时应优先核对 Bank 与字节组映射。

五、从结构到实现:一个地址映射示例

假设用户逻辑产生 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 隐藏在数据传输之后。