一、DDR 基础:从 SDR 到 DDR5,我们到底在调什么?
做 DDR 控制器配置,你得先搞清楚我们在跟谁打交道。很多刚入行的工程师一上来就盯着寄存器手册看,结果越看越懵。我个人习惯是,先摸清 DDR 协议的发展脉络,知道每一代解决了什么问题,再看信号和时序就顺多了。
1.1 DDR SDRAM 发展史:一条频率与功耗的博弈之路
DDR 的全称是 Double Data Rate,也就是双倍数据速率。你想想看,从最初的 SDRAM 到现在的 DDR5,核心其实就一件事——如何在提升带宽的同时不让功耗失控。
我刚开始接触 DDR 时,用的是 DDR2,那时候觉得 400MHz 已经很快了。结果没几年 DDR3 就到了 1600MHz,现在 DDR5 都冲上 6400MHz 了。每次换代,控制器侧的配置复杂度就翻一倍。
| 代际 | 数据速率 (MT/s) | VDD 电压 | 预取位数 | Bank 数 |
|---|---|---|---|---|
| SDRAM | 66~133 | 3.3V | 1n | 4 |
| DDR | 200~400 | 2.5V | 2n | 4 |
| DDR2 | 400~800 | 1.8V | 4n | 8 |
| DDR3 | 800~2133 | 1.5V | 8n | 8 |
| DDR4 | 1600~3200 | 1.2V | 8n | 16 |
| DDR5 | 4800~6400+ | 1.1V | 16n | 32 |
你注意到没有?每一代 DDR,预取位数都在翻倍。DDR 是 2n 预取,DDR2 是 4n,DDR3/DDR4 是 8n,DDR5 直接到了 16n。什么意思呢?说白了,就是内存颗粒一次读操作,内部已经准备好了一长串数据,然后通过更宽的内部总线一次性搬到 I/O 口,再用更高的外部时钟速率一点一点送出去。
1.2 DDR 协议概述:不只是读写命令那么简单
DDR 协议看着复杂,其实核心就三个要素:命令、地址、数据。控制器通过片选信号 CS# 和命令信号(RAS#、CAS#、WE#)的组合,告诉颗粒你要干什么。
常见的命令我列一下:
- ACTIVATE —— 激活一行,打开某个 Bank 的行
- READ / WRITE —— 在已激活的行上读写数据
- PRECHARGE —— 关闭当前行,准备下一次激活
- REFRESH —— 刷新操作,颗粒需要定时刷新保持数据
- MRS —— 模式寄存器设置,配置颗粒的工作参数
- ZQ CAL —— 校准输出驱动强度(DDR3 开始引入)
为什么要搞这么复杂?因为 DDR 颗粒内部的存储单元像电容一样,电荷会慢慢漏掉。所以得定期刷新。刷新频率取决于芯片温度,但一般我们按 7.8μs(即 64ms 内完成所有行的刷新)来配置。
还有个关键概念是突发长度(Burst Length)。DDR 协议规定,一次读写命令最少传输的数据量是 8 个 64 位字(DDR3/DDR4 通常用 BL8)。为什么?因为预取出来的数据量就是这么多,你用不完也得取完。这直接影响了控制器内部 FIFO 的设计。
1.3 DDR 接口信号:每一根线都有它的脾气
做 DDR 布线的时候,你得对每一组信号心里有数。DDR 接口信号大体分三类:控制/命令、地址、数据。我来挨个说。
控制/命令信号组
- CS# (Chip Select): 片选,低有效。一个通道可能挂多颗颗粒,靠 CS# 区分。
- RAS#, CAS#, WE#: 命令编码信号,三者组合决定当前操作。
- CKE (Clock Enable): 时钟使能,控制颗粒是否进入休眠或自刷新。
- ODT (On-Die Termination): 片上端接电阻控制。高频信号反射很严重,ODT 可以匹配阻抗。
- RESET#: 复位信号,DDR3 开始引入,低有效。
地址信号组
- A[13:0]: 行列复用地址线。先发行地址(伴随 ACT 命令),再发列地址(伴随 RD/WR 命令)。
- BA[2:0]: Bank 地址,选择颗粒内部的哪个 Bank。
- BG[1:0]: Bank Group 地址(DDR4 引入),用于提高并行性。
数据信号组
- DQ[63:0]: 数据总线,64 位宽(典型配置)。
- DQS, DQS#: 数据选通信号,差分对,用来指示数据有效窗口。
- DM/DBI: 数据掩码 / 数据总线反转(功能取决于代际和配置)。
信号组还有一个重要分类:单端信号 和 差分信号。地址和控制线基本是单端的,但 DQS 和数据线在高速时都是差分对。DDR4 开始,差分 DQS 已经是标配了,对噪声抑制很有帮助。
其实,信号类型不同,布线要求也不同。控制/命令信号只需要按地址分组做等长,但 DQ 和 DQS 必须严格匹配。我曾经吃过这个亏,DQ 组内等长差了几十 mil,结果高频下读写眼图惨不忍睹。
总结下来,DDR 基础这部分,你要记住三件事:
- 代际决定了你能跑多快、电压多低、预取多大。 配置寄存器前一定确认颗粒型号和代际。
- 协议定义了命令怎么发、时序怎么算。 特别是刷新和 ZQ 校准,容易踩坑。
- 信号分组决定了 PCB 怎么布、延时怎么调。 控制组、地址组、数据组各有一套规则。
好了,基础就这些。说实话,这些东西看起来多,但只要你理解了预取和 Bank 管理的逻辑,后面寄存器配置就只是填数字的事了。先把基础打牢,后面会轻松很多。