DDR3(L) 软件设计规范
编制日期 2026-09-24
面向 XT41(42)K04G16AB(4Gb ×16 DDR3(L) SDRAM)的控制器驱动设计约定 —— 覆盖 上电初始化 12 步、模式寄存器 MR0–MR3、读 / 写延迟与突发、 刷新管理、ZQ 校准、ODT 与写均衡、低功耗,逐条给出可落地的命令序列、时序门限与状态判据。
| 文档编号 | DDR3-SW-SPEC-001 |
|---|---|
| 版本 / 状态 | V1.0 · 正式发布 |
| 适用器件 | XTX XT41K04G16AB / XT42K04G16AB(DDR3L-1600 / DDR3-1866,4Gb ×16)及同系列 96-ball TFBGA 器件 |
| 参考标准 | XT41(42)K04G16AB Datasheet 版本号 Rev 1.5(Jul-13,2023)· JEDEC JESD79-3F |
| 配套文档 | DDR3_电路设计指南.html(硬件 / 原理图 / 布线约束) |
0. 目的与范围
本规范约束 DDR3(L) 器件在嵌入式 / SoC 内存控制器中的软件行为:上电初始化序列、模式寄存器配置、读 / 写 / 刷新命令时序、ZQ 校准、ODT 与写均衡、低功耗与复位。凡本文与器件 datasheet 冲突,以 datasheet 为准。
- 统一初始化序列:RESET → 时钟稳定 → CKE 拉高 → MRS(MR2→MR3→MR1→MR0) → ZQCL → 等待 tDLLK/tZQinit,固化一套标准流程。
- 统一寄存器配置:CL / CWL / WR / AL / ODT / DLL 全部通过 MRS 写入;MR 默认值未定义,必须全部显式初始化。
- 统一刷新策略:以 tREFI 为节拍发 Auto Refresh;温度越界时按 2×、4× 缩短间隔;休眠用 Self Refresh。
- 统一低功耗路径:空闲进 Precharge Power-Down,深度休眠进 Self Refresh,明确 DLL 慢 / 快退出与唤醒时序。
一句话结论:DDR3 是「命令驱动、时钟双边沿、fly-by 拓扑」的器件 ——
所有读写都要先 ACT 打开行,再发 RD/WR;读数据在 AL+CL 个周期后才出现,写数据在 AL+CWL 个周期后才有效;
没有 DLL 锁定的读、没有 tDLLK 等待的 MRS、没有 ZQCL 的阻抗、没有按温度缩短的 tREFI,都会让系统表现为偶发位错甚至完全无法训练。
文档使用说明
- 本文是《DDR3 电路设计指南》的软件配套篇:硬件篇解决「怎么接、怎么供电、怎么走线、 fly-by 怎么做」,本文解决「控制器怎么初始化、命令怎么发、时序怎么等、低功耗怎么进」。
- 命令码、寄存器位、时序值均取自 XT41(42)K04G16AB Datasheet Rev 1.3,与 JEDEC JESD79-3F 一致。其它容量 / 其它厂商型号存在差异,移植前必须逐条核对。
- 文中 C 代码为协议骨架伪代码,演示流程与判断条件,非特定平台可直接编译的完整实现;
ddr_cmd()、now_ns()等为平台相关底层。
① MR 默认值未定义,上电必须完整写一遍 MR0–MR3——不能「只改要用的位」,MRS 必须按 BA 整寄存器重写; ② 任何 DLL Reset 后必须等 tDLLK 才能发读命令或同步 ODT——tDLLK 未满足就读,tDQSCK / tAON 违例; ③ 时序门限一律按 datasheet max 留余量——typ 值只用来排程,不能当失败判据;温度越高 tREFI 越短,必须动态切换。
1 · 器件定位与阵列组织
DDR3(L) 不是「即插即用的 SRAM」。它有 8 个 Bank、行 / 列分离的地址、2KB 页、8n 预取,且所有功能靠 MRS 配置。软件设计的第一件事,是把「地址空间」和「刷新节奏」搞清楚。
1.1 器件定位与关键参数
数据取自 XT41(42)K04G16AB Datasheet Rev 1.3 第 2 节 Features 与第 3 节 Ordering Information。
| 项目 | 参数 | 软件影响 |
|---|---|---|
| 组织 | 256M × 16 | x16 接口,DQ[15:0] 双字节通道 |
| Bank 地址 | BA0–BA2(3 bit) | 最多 8 个 Bank,可独立 ACT / PRE |
| 行地址 (Row) | A0–A14(15 bit) | 单 Bank 32K 行;ACT 用 15 bit 行地址 |
| 列地址 (Col) | A0–A9(10 bit) | 单 Bank 1K 列;2KB 页 = 1024 ×16bit |
| 页尺寸 / 突发 | 2KB / BL8(8n 预取) | 一次突发最多搬 8×16bit = 16B |
| 速度档 | DDR3L-1600(11-11-11) / DDR3-1866(13-13-13) | 决定 CL / CWL / tCK,MRS 必须据此配 |
| 温度等级 | 商业 0~95℃ / 工业 −40~95℃ / 扩展 −20~95℃ | 决定 tREFI 倍率与 SRT/ASR 配置 |
1.2 阵列组织与地址映射
DDR3 的地址在命令中分时复用,软件最容易在这里出错:ACT 命令送行地址,RD/WR 命令送列地址,BA 选择 Bank。
| 地址类型 | 位宽 | 出现在哪些命令 | 含义 |
|---|---|---|---|
| Bank 地址 BA[2:0] | 3 bit | ACT / RD / WR / PRE / MRS(BA) | 选择 8 个 Bank 之一;MRS 用 BA 选 MR0–MR3 |
| 行地址 Row (RAS 期) | A0–A14(15 bit) | ACT | Bank 内行号 0~32767;打开到行缓冲 |
| 列地址 Col (CAS 期) | A0–A9(10 bit) | RD / WR | 页内字节偏移;A10=1 触发 Auto-Precharge(A10/AP) |
| 突发控制 A12/BC | 1 bit(on-the-fly) | RD / WR | MR0 BL=BC4or8 时,A12=1 选 BC4 chop |
2KB 页 = 1024 列 ×16bit。一次 BL8 突发只覆盖 8×16bit = 16 字节。要读写整页 2KB,需在列地址上连续发 128 次 BL8 突发(或靠控制器的 burst 合并)。不要把「列地址 10 bit」误当成「能一次寻址 1KB 数据」——每次突发仍然是 BL8。
1.3 引脚与拓扑
96-ball TFBGA(x16)的关键引脚分组如下,软件 / 控制器需按组管理:
| 分组 | 引脚 | 方向与功能 |
|---|---|---|
| 时钟 | CK, CK, CKE | 差分时钟 + 时钟使能(异步控制 Power-Down / Self-Refresh 进出) |
| 命令 | CS, RAS, CAS, WE, ODT, RESET | 命令译码(ACT/RD/WR/PRE/REF/MRS 等由这 4 根 + CKE 编码) |
| 地址 | BA0–BA2, A0–A14, A10/AP, A12/BC | Bank/行/列复用;A10=AP 自预充,A12=BC on-the-fly |
| 数据 | DQ[15:0], DQS/DQS, DMU/DML | 16 bit 双向数据 + 双字节通道 DQS 选通 + 数据掩码 |
| 参考 / 校准 | ZQ, VREFCA, VREFDQ | ZQ 外接 240Ω±1% 用于 ODT/驱动阻抗校准;VREF 必须跟踪 VDDQ/2 |
DDR3 的命令 / 地址 / 时钟采用 fly-by(菊花链)拓扑以减小 stub。这导致每个颗粒上 CK 与 DQS 存在 flight-time skew,控制器必须支持 Write Leveling(MR1 A7=1)来补偿。x16 器件不支持 TDQS(MR1 A11 必须 =0)。
2 · 术语与缩写
DDR3 命令与寄存器术语量大,这里按「命令 / 寄存器」与「时序 / 延迟」两组列出,后续章节直接引用。
2.1 命令与寄存器术语
| 术语 | 全称 / 含义 | 软件关注点 |
|---|---|---|
| ACT | Activate —— 打开指定 Bank 的某一行到行缓冲 | 读 / 写前必须 ACT;受 tRCD 约束 |
| RD / RDA | Read / Read with Auto-precharge | RDA 在突发结束后自动 PRE 该行 |
| WR / WRA | Write / Write with Auto-precharge | WRA 受 WR(tWR)+tRP 决定的 tDAL 约束 |
| PRE / PREA | Precharge / Precharge All —— 关闭行,写回行缓冲 | PREA 关闭所有 Bank;受 tRP 约束 |
| REF | Auto Refresh —— 内部刷新一行 | 周期发,受 tRFC / tREFI 约束 |
| MRS | Mode Register Set —— 写 MR0–MR3 | 按 BA 选寄存器;受 tMRD / tMOD 约束 |
| ZQCL / ZQCS | ZQ Calibration Long / Short | 校准 ODT/驱动阻抗;ZQ 引脚接 240Ω |
| SRE / SRX | Self Refresh Entry / Exit | 低功耗休眠;退出异步且需 tXS |
| MPR | Multi-Purpose Register —— 读预定校准码型 | 写训练用;MR3 A2=1 使能 |
| RESET | 硬件复位(低有效引脚) | 上电与稳定电源下复位均可用 |
| ODT | On-Die Termination —— 片内终端电阻 | Rtt_Nom(MR1)/Rtt_WR(MR2) 配置 |
2.2 时序与延迟术语
| 术语 | 含义 | 软件关注点 |
|---|---|---|
| CL | CAS Latency —— 读命令到首个读数据的内核延迟(nCK) | =11 或 13;RL = AL + CL |
| CWL | CAS Write Latency —— 写命令到首个写数据(nCK) | =8 或 9;WL = AL + CWL |
| AL | Additive Latency —— ACT 后读 / 写命令的附加延迟 | 0 / CL-1 / CL-2;提升总线效率 |
| RL / WL | Read / Write Latency = AL + CL / AL + CWL | 控制器数据门控基准 |
| WR | Write Recovery(用于 Auto-Precharge) | = ceil(tWR/tCK);与 tRP 决定 tDAL |
| tRFC | Refresh Cycle time | 260ns;REF 命令后必须等待 |
| tREFI | Refresh Interval | 7.8 / 3.9 / 1.95 µs(随温度变化) |
| tDLLK | DLL lock time | DLL reset 后必须等待才能读 |
| tZQinit / tZQoper | ZQ 初始化 / 操作时间 | ZQCL 后等 tZQinit;ZQCS 后等 tZQoper |
| tXPR / tXS | Reset/CKE 退出 / Self-Refresh 退出 | tXPR=max(tXS,5tCK);SRX 后发 NOP 填满 tXS |
| ASR / SRT | Auto Self-Refresh / Self-Refresh Temperature | 扩展温区必须使能 ASR 或置 SRT |
| PPD | Precharge Power-Down DLL(MR0 A12) | 0=慢退出(DLL off) / 1=快退出(DLL on) |
3 · 控制器架构与初始化
DDR3 初始化是「命令序列 + 时序等待」的硬约束,错一步整片不可用。控制器固件必须严格按 12 步执行。
3.1 分层职责
3.2 上电初始化流程
Datasheet 规定,上电与初始化必须执行下列序列(顺序不可调换):
- 上电并保持 RESET 低:RESET 维持 ≤0.2×VDD,其余输入可不定;CKE 在 RESET 释放前拉低(≥10ns)。电源爬坡(300mV→VDDmin)≤200ms,且 VDD≥VDDQ、|VDD−VDDQ|<0.3V;RESET 低至少 200µs(稳定电源下)。
- RESET 释放后等待 500µs:DRAM 在此期间独立做内部状态初始化(不依赖外部时钟)。
- 启动并稳定 CK/CK:时钟稳定至少 10ns 或 5tCK(取大);CKE 为同步信号,需满足 tIS;CKE 变高前先注册一个 NOP / Deselect。
- ODT 保持高阻:RESET 释放到 CKE 拉高期间,片内终端为高阻;若 MR1 要开 Rtt_Nom,ODT 引脚须静态拉低。
- CKE 拉高后等 tXPR:tXPR = max(tXS, 5tCK),再发第一条 MRS。
- MRS 写 MR2:BA=(0,1,0);配置 CWL / Rtt_WR / SRT / ASR。
- MRS 写 MR3:BA=(1,1,0);配置 MPR(默认 A2=0 正常操作)。
- MRS 写 MR1:BA=(0,1,0→应为 BA0=1,BA1=0,BA2=0) 使能 DLL(A0=0)、驱动强度、Rtt_Nom、AL、写均衡。
- MRS 写 MR0:BA=(0,0,0) 并使能 DLL Reset(A8=1);配置 BL / BT / CL / WR / PPD。
- 发 ZQCL:启动 ZQ 长校准(阻抗参考 240Ω)。
- 等待 tDLLK 与 tZQinit 完成:CKE 在此期间必须连续为高。
- 进入正常操作:此后可发 ACT / RD / WR / REF。
Datasheet 明确要求先写 MR2、MR3,再写 MR1(DLL Enable),最后写 MR0(DLL Reset)。先写 MR0 的 DLL Reset 而 MR1 的 DLL 未使能,会导致 DLL 处于未定义状态。两个 MRS 之间必须间隔 tMRD,MRS 到非 MRS 命令须间隔 tMOD,期间插 NOP/DES。
3.3 复位流程
稳定电源下的复位(RESET at Stable Power):
- 任意时刻将 RESET 拉低 ≤0.2×VDD,维持至少 100ns;CKE 在 RESET 释放前拉低(≥10ns)。
- 随后执行上电初始化流程的第 2~11 步(RESET 释放后等 500µs 起)。
- 复位后所有 MR 回到未定义态,必须重新完整写 MR0–MR3;数组内容不受 MRS/RESET 影响。
RESET 与 DLL Reset(MRS MR0 A8)都不会破坏存储阵列。但二者都会让 MR0–MR3 回到「未定义」,因此复位后必须重新执行完整 MRS 序列,不能假设配置还在。
4 · 模式寄存器 MR0–MR3 体系
四个模式寄存器覆盖 DDR3 的全部可编程功能。MR 默认值未定义,上电必须整寄存器重写;即使只改一个字段,也要把该 MR 的全部地址位重新定义。
4.1 四张表总览
| 寄存器 | BA 编码 | 主要字段 | 初始化必配 |
|---|---|---|---|
| MR0 | BA=000 | BL, BT, CL, Test, DLL Reset, WR, PPD | CL / WR / BL / PPD 必配 |
| MR1 | BA=001 | DLL En, DIC, AL, Rtt_Nom, WL En, TDQS, Qoff | DLL En / Rtt_Nom / AL 必配 |
| MR2 | BA=010 | Rtt_WR, SRT, ASR, CWL, PASR | CWL / SRT / ASR 必配 |
| MR3 | BA=011 | MPR, MPRLoc | MPR 默认 0(正常),训练时置 1 |
4.2 MR0 —— 突发 / CL / WR / DLL
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A0,A1 | Burst Length | 00=BL8固定; 01=BC4或8(on-the-fly); 10=BC4固定 | 推荐 01(on-the-fly 灵活) |
| A3 | Burst Type | 0=顺序; 1=交织 | 通常 0 |
| A2,A4,A5,A6 | CAS Latency | CL11→1110; CL13→0011 | 与速度档匹配 |
| A7 | Test Mode | 0=正常; 1=测试 | 必须 0,否则不保证功能 |
| A8 | DLL Reset | 0=否; 1=是(自清零) | 初始化写 MR0 时置 1 |
| A9,A10,A11 | Write Recovery | 000=16; 001=5; 010=6; 011=7; 100=8; 101=10; 110=12; 111=14 | WR≥ceil(tWR/tCK) |
| A12 | PPD (预充掉电 DLL) | 0=慢退出(DLL off); 1=快退出(DLL on) | 快速唤醒选 1 |
4.3 MR1 —— DLL / 驱动 / ODT / 写均衡
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A0 | DLL Enable | 0=使能; 1=禁止 | 正常操作必须 0 |
| A1,A5 | 驱动阻抗 DIC | 00=RZQ/6; 01=RZQ/7 | RZQ=240Ω |
| A3,A4 | Additive Latency | 00=关; 01=CL-1; 10=CL-2 | 高速总线效率用 |
| A2,A6,A9 | Rtt_Nom | 000=关; 001=RZQ/4; 010=RZQ/2; 011=RZQ/6; 100=RZQ/12; 101=RZQ/8 | 常规终端;写时仅允许 RZQ/2,4,6 |
| A7 | Write Leveling En | 0=关; 1=开 | fly-by 拓扑训练必开 |
| A11 | TDQS | 0=关; 1=开 | x16 必须 0(与 DM 复用) |
| A12 | Qoff | 0=输出使能; 1=关闭 | 正常 0 |
4.4 MR2 —— CWL / 自刷新 / 写 ODT
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A0 | PASR | 0=全阵列; 其它=部分阵列自刷新 | 默认 0 |
| A3,A4,A5 | CWL | 011=8 (1.5≥tCK≥1.25ns); 100=9 (1.25≥tCK≥1.07ns) | 与 tCK 匹配 |
| A6 | ASR | 0=手动 SRT; 1=使能自动自刷新 | 扩展温区建议 1 |
| A7 | SRT | 0=常温; 1=扩展温区 | 超 85℃ 必须置 1 或使能 ASR |
| A9,A10 | Rtt_WR | 00=动态 ODT 关; 01=RZQ/4; 10=RZQ/2 | 写期间专用终端;写均衡时不可用 |
4.5 MR3 与 MPR
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A2 | MPR | 0=正常(数据来自阵列); 1=数据来自 MPR | 读训练时置 1 |
| A1,A0 | MPRLoc | 00=预定校准码型; 其它=保留 | MPR 启用时读 [0,1,0,1…] 码型 |
MR3 A2=1 后,所有 RD/RDA 重定向到 MPR(输出预定校准码型,用于读同步训练);期间禁止 Power-Down / Self-Refresh / 任何非 RD 命令(RESET 除外)。训练结束必须再发 MRS 把 A2 清 0。DLL 必须先锁定才能读 MPR。
4.6 写 MRS 的准则
- 整寄存器重写:即使只改一个字段,也要把该 MR 全部地址位重新定义;保留位(RFU)必须写 0。
- 间隔约束:相邻 MRS 之间 ≥tMRD;MRS 到非 MRS 命令 ≥tMOD;间隔中插 NOP / DES。
- 顺序约束:MR2 → MR3 → MR1 → MR0(MR0 带 DLL Reset)。
- 运行期改 MR:仅当所有 Bank 预充且 tRP 满足、数据突发完成、CKE 高时才能改;改 CL/CWL/WR 后要重新等待 tMOD。