4. DDR初始化流程:DDR初始化状态机、MR寄存器配置详解
DDR的初始化,说白了就是给DDR芯片“上电”后,让它进入正常工作状态的一套固定流程。这套流程是JEDEC标准规定的,谁都不能改。我刚开始接触DDR时,总觉得初始化不就是写几个寄存器嘛,后来发现时序搞错,DDR根本不理你。
嗯,这里要注意:DDR初始化一旦失败,整个系统都起不来。所以理解这个流程,比会写代码更重要。
4.1 DDR初始化状态机
DDR初始化是一个严格的状态机,每个步骤都有时间要求。我习惯把它分成三个阶段:
- 第一阶段:上电与复位——给DDR供电,保持复位信号有效
- 第二阶段:时钟稳定与等待——等待时钟稳定,等待CKE拉高
- 第三阶段:配置与校准——写MR寄存器,做ZQ校准,完成ODT配置
下面这张图是我自己画的初始化流程,你一看就明白:
这个状态机,每个箭头都对应一个时间参数。我见过有人把tXPR算错了,结果DDR一直卡在初始化状态。说白了,时间参数就是命根子。
4.2 MR寄存器配置详解
DDR有4个模式寄存器:MR0、MR1、MR2、MR3。每个寄存器12位,但实际用到的位不一样。我习惯按顺序配置:
MR0:核心操作参数
| 位域 | 名称 | 说明 | 我常用的值 |
|---|---|---|---|
| Bit[1:0] | Burst Length | 突发长度:2、4、8 | 8(00保留,01=4,10=8) |
| Bit[3] | Read Burst Type | 顺序/交错 | 0(顺序) |
| Bit[6:4] | CAS Latency | 读命令到数据输出的时钟数 | 根据频率定 |
| Bit[8] | Test Mode | 正常模式/测试模式 | 0(正常) |
| Bit[11:9] | Write Recovery | 写恢复时间 | 根据tWR计算 |
CAS Latency 怎么选?
我个人习惯:DDR3-1333 用 CL=7,DDR3-1600 用 CL=9,DDR3-1866 用 CL=11。
选小了,数据读不出来;选大了,浪费性能。你想想看,CL每多1,读延迟就多一个时钟周期。
我个人习惯:DDR3-1333 用 CL=7,DDR3-1600 用 CL=9,DDR3-1866 用 CL=11。
选小了,数据读不出来;选大了,浪费性能。你想想看,CL每多1,读延迟就多一个时钟周期。
MR1:驱动与终端配置
| 位域 | 名称 | 说明 |
|---|---|---|
| Bit[2:0] | Output Driver Impedance | 驱动强度:RZQ/6、RZQ/7等 |
| Bit[6:4] | ODT RTT | 片上终端电阻值 |
| Bit[9] | DLL Enable | DLL使能,必须为1 |
我的经验:
驱动强度别选太大,否则信号过冲严重。我曾经在一个DDR3项目里用了RZQ/6,结果眼图惨不忍睹。后来改成RZQ/7,信号质量好多了。
驱动强度别选太大,否则信号过冲严重。我曾经在一个DDR3项目里用了RZQ/6,结果眼图惨不忍睹。后来改成RZQ/7,信号质量好多了。
MR2:延迟与刷新控制
- Bit[2:0]:CAS Write Latency(CWL),写延迟。一般CWL = CL - 1或CL - 2
- Bit[5:3]:Auto Refresh周期,默认即可
- Bit[6]:Self Refresh温度范围,商用选0,工业选1
MR3:MPR与扩展功能
MR3主要用于Multi-Purpose Register和读数据训练。平时配置为0就行,除非你在做DDR训练。
4.3 ZQ校准与ODT配置
ZQ校准,说白了就是让DDR自己调整输出驱动强度。DDR芯片内部有一个240Ω的精密电阻(RZQ),校准就是拿这个电阻做参考。
校准分两种:
- ZQCL(长校准):初始化时做一次,耗时512个时钟周期
- ZQCS(短校准):运行时定期做,耗时64个时钟周期
注意!
我曾经遇到一个坑:ZQ校准没做完就发读写命令,结果DDR返回的数据全是错的。后来查手册才发现,ZQCL完成后必须等tZQinit结束才能操作。
嗯,这个时间参数很容易被忽略。
我曾经遇到一个坑:ZQ校准没做完就发读写命令,结果DDR返回的数据全是错的。后来查手册才发现,ZQCL完成后必须等tZQinit结束才能操作。
嗯,这个时间参数很容易被忽略。
ODT(片上终端),就是DDR芯片内部的匹配电阻。它的作用是吸收信号反射,提高信号质量。
ODT配置要点:
- 单颗DDR颗粒:ODT可以关掉,或者用40Ω
- 双颗DDR颗粒(Rank):ODT用60Ω或120Ω
- 多Rank系统:ODT值需要根据拓扑计算
ODT配置口诀(我自己总结的):
「单颗粒,40Ω;双颗粒,60Ω;多Rank,算阻抗。」
当然,最终还是要看仿真结果。我习惯先用40Ω,然后看眼图,再调整。
「单颗粒,40Ω;双颗粒,60Ω;多Rank,算阻抗。」
当然,最终还是要看仿真结果。我习惯先用40Ω,然后看眼图,再调整。
最后说一句:DDR初始化,顺序不能乱,时间不能少。我见过有人把MR0和MR1的顺序搞反了,结果DDR直接罢工。你想想看,DDR芯片就像个倔老头,必须按规矩来,少一步都不行。
好了,这一章的内容就到这里。记住:初始化是DDR的命门,搞懂了它,后面读写操作就顺理成章了。
可可精品资料库