引言:为什么需要'训练'?
在 FPGA 项目中使用 DDR3 时,很多工程师都有过这样的经历:MIG IP 核配置无误,代码仿真完美,但一上板,init_calib_complete 信号却迟迟无法拉高,或者运行时出现随机数据错误。其根源,很大概率在于 DDR3 的 Training Process(训练过程) 未能成功。
你可以将 DDR3 想象成一位世界级的田径运动员,而 FPGA 是他的教练。运动员潜力无限,但若想与教练完美配合,他们必须进行长期的 协同训练 ,以找到最佳的起跑时机、步频和节奏。DDR3 训练就是 FPGA 控制器与 DDR3 颗粒之间,在上电后自动执行的一套精密'协同训练'流程,目的是 补偿 PCB 板上的信号传输延迟差异,确保数据被正确采样 。
一、问题的根源:为何 DDR3 如此'娇气'?
在数百 MHz 甚至更高频率下,DDR3 总线上的任何微小瑕疵都会被急剧放大。主要挑战来自:
- 飞行时间差异: DDR3 的时钟(CK)、数据(DQ)和数据选通(DQS)信号在 PCB 走线上的长度不可能完全一致。长度的差异导致信号到达 DDR3 颗粒/FPGA 的时间不同,即飞行时间 不同。这使得在控制器端发出的 DQS 边缘,无法精确对齐在 DDR3 颗粒端 DQ 数据的中心。
- 时钟偏移: 即使走线等长,由于 FPGA 内部和 DDR3 芯片内部的缓冲器差异,也会导致 CK、DQS 和 DQ 信号之间产生微小的时序偏移。
- 电压与温度变化: 系统运行中,PVT(工艺、电压、温度)的变化会动态地改变信号的传输延迟和建立/保持时间。
结论: 一个固定的、出厂即用的采样时序是无法应对这些动态变化的。因此,必须有一个在上电后、运行前的自动测量与调整过程,这就是 Training 。
二、Training Process 详解:三步曲
MIG 的校准过程主要包含三个阶段,它们像一场精密的仪式,环环相扣。
阶段一:写电平校准 - 解决'写'操作的时序问题
- 目标: 确保在 DDR3 颗粒的引脚上 ,写数据选通(DQS)的边沿能够精确对齐 写时钟(CK)的边沿 。
- 问题场景: 由于 CK 和 DQS 走线延迟不同,当 FPGA 同时发出 CK 和 DQS 时,它们到达 DDR3 颗粒时可能已经错位。DDR3 颗粒是利用 CK 来锁存命令和地址的,而利用 DQS 来锁存写数据的。如果 DQS 相对于 CK 延迟太多,颗粒可能在正确的数据到来之前就去锁存,导致写入错误。
- 解决方案:
- MIG 控制器让 DDR3 颗粒进入 写电平模式 。
- 控制器发送一个特殊的 写电平调整模式命令 。
- DDR3 颗粒会在其 DQS 引脚上 输出一个特定的模式 (通常是 CK 的复制品)。
- MIG 控制器在 FPGA 端 监测返回的 DQS 信号 ,并 动态调整 DQS 的相位 ,直到在 FPGA 端捕获到的 DQS 边沿与内部的 CK 参考边沿对齐。
- 这个调整量,就补偿了 CK 和 DQS 从 FPGA 到 DDR3 颗粒的飞行时间差。
阶段二:读门训练 - 找到'读'数据的开门时机
- 目标: 确定在读操作期间,应该在什么时候'开门'接收 DQS 信号。
- 问题场景: 在读操作中,DDR3 颗粒会同时输出 DQ 数据和 DQS 选通信号。DQS 在读取时是边沿对齐的(即在数据变化的边沿触发)。FPGA 需要利用这个 DQS 来在数据的中心点进行采样。但是,DQS 信号并不是持续存在的,它只在突发读传输期间有效。FPGA 需要一个读使能信号来控制何时接收 DQS。
- 解决方案:
- MIG 控制器向 DDR3 写入一个已知的数据模式(如交替的 0 和 1)。


