4、DDR初始化流程:上电顺序、复位、模式寄存器配置、ZQ校准
DDR初始化,说白了就是给DDR芯片“上电开机”的过程。很多新手觉得这步就是按个复位键,其实没那么简单。我刚开始做DDR项目时,就吃过上电时序不对的亏——芯片死活不工作,查了三天才发现是供电顺序反了。
今天咱们就一步步拆解DDR的初始化流程。你跟着我走一遍,以后遇到DDR起不来的问题,心里就有底了。
4.1 上电顺序:先给谁供电?
DDR芯片需要多种电压。以DDR3为例,主要有三种:
- VDD:核心电压,1.5V
- VDDQ:IO接口电压,1.5V
- VREF:参考电压,0.75V(VDD的一半)
上电顺序有严格规定。JEDEC标准要求:VDD和VDDQ必须同时上电,或者VDD先于VDDQ。VREF可以在之后任意时间上电。
上电时间也有要求。从0V到稳定电压,一般要求在20ms以内完成。有些FPGA开发板用LDO供电,上升沿很缓,这时候就要检查是否满足时序要求。
4.2 复位与时钟稳定
电压稳定后,接下来是复位信号。DDR的复位引脚叫RESET#,低电平有效。
复位时序要求:
- 上电完成后,保持
RESET#为低电平至少200μs - 释放复位后,需要等待时钟稳定,至少500μs
- 然后才能开始CKE(时钟使能)的拉高操作
你想想看,为什么需要这么长时间?因为DDR内部的PLL需要锁定时间,内部状态机也需要初始化。我曾经在项目中把复位时间缩短到100μs,结果DDR初始化成功率只有70%。后来老老实实改回200μs,问题就解决了。
4.3 模式寄存器配置:DDR的“配置文件”
复位完成后,DDR处于空闲状态。这时候需要通过模式寄存器配置告诉DDR:你的工作参数是什么。
DDR有多个模式寄存器:
| 寄存器 | 地址 | 配置内容 |
|---|---|---|
| MR0 | BA[2:0]=000 | 突发长度、CAS延迟、读写模式 |
| MR1 | BA[2:0]=001 | DLL使能、输出驱动强度、ODT配置 |
| MR2 | BA[2:0]=010 | CAS写延迟、低功耗模式 |
| MR3 | BA[2:0]=011 | MPR模式、温度补偿刷新 |
配置顺序有讲究。我个人习惯:先配MR2,再配MR1,最后配MR0。为什么?因为MR0里包含DLL复位位,如果先配MR0,DLL复位后需要等待一段时间才能继续操作。
配置命令格式:
// 以配置MR0为例
// 命令:MRS(模式寄存器设置)
// 地址:BA[2:0] = 000
// 数据:通过地址线A[13:0]传输
// 假设配置:BL=8, CL=6, DLL复位
// A[2:0] = 011 (BL=8)
// A[6:4] = 110 (CL=6)
// A[8] = 1 (DLL复位)
MRS_CMD = {BA=000, A[13:0]=16'h0103};
4.4 ZQ校准:自动“调零”
ZQ校准是DDR3引入的功能。说白了,就是DDR内部自动调整输出驱动强度和ODT电阻值,补偿工艺偏差和温度变化。
ZQ校准分为两种:
- ZQCL:长校准,需要512个时钟周期
- ZQCS:短校准,需要64个时钟周期
初始化时,必须执行一次ZQCL。之后在运行过程中,可以定期执行ZQCS来跟踪温度变化。
ZQ校准命令格式:
// ZQCL命令
// CS#=0, RAS#=1, CAS#=1, WE#=0
// 地址线A[10]=1 表示ZQCL
// 地址线A[10]=0 表示ZQCS
// 发送ZQCL
assign zqcl_cmd = {CS=0, RAS=1, CAS=1, WE=0, A10=1};
4.5 完整的初始化流程
把上面几步串起来,就是完整的DDR初始化流程:
- 上电:VDD和VDDQ同时上电,等待电压稳定
- 复位:保持RESET#低电平至少200μs
- 时钟稳定:释放复位后等待500μs
- CKE拉高:使能时钟,等待至少tXPR(约5个时钟周期)
- DLL复位:通过MR0设置DLL复位位
- 配置MR2:设置CAS写延迟等参数
- 配置MR1:设置DLL使能、驱动强度等
- 配置MR0:设置突发长度、CAS延迟等
- ZQCL:执行长校准,等待512个时钟周期
- 等待DLL锁定:一般需要200个时钟周期
- 初始化完成:DDR进入就绪状态,可以正常读写
下面这张图展示了完整的初始化流程:
嗯,到这里DDR初始化就走完了。你可能会问:这些时序参数怎么记?我的建议是:别死记硬背,用的时候查手册。每个DDR颗粒的手册里都有详细的初始化时序图,照着做就行。
我在项目中习惯把初始化流程写成状态机,用计数器控制每个步骤的等待时间。这样代码清晰,也方便调试。下一章咱们就聊聊怎么用状态机来驱动DDR读写,到时候会用到今天讲的初始化流程。
可可精品资料库