3. PolarFire DDR控制器IP核详解

PolarFire系列FPGA内部集成的DDR内存控制器是一个硬核(Hard Controller)模块,位于器件中部,直接与I/O Bank中的DDR PHY相连。它支持DDR3、DDR3L、DDR4、LPDDR3、LPDDR4等多种内存标准,通过Libero SoC中的"PolarFire DDR Memory Controller"IP核进行配置。理解这个IP核的关键,在于把配置参数、接口信号、时钟架构和复位初始化流程四者串成一条完整的链路——参数决定控制器行为,接口信号承载命令与数据,时钟架构保证采样正确,复位与初始化流程则确保控制器和DRAM颗粒进入可工作状态。

一、配置参数:从内存颗粒规格反推控制器设置

IP核配置界面中的参数并非随意填写,而是由所选内存颗粒的规格书决定。核心参数可分为四类:

  • 内存类型与速率:选择DDR3/DDR4/LPDDR4等,并设定目标数据速率(如DDR4-1600、DDR4-2400)。速率直接决定tCK周期,例如1600 Mbps对应tCK=1.25 ns。
  • 容量与组织:包括Row地址位宽、Bank地址位宽、Bank Group数量、Column地址位宽、数据位宽(16/32/64 bit)。这些参数必须与颗粒的JEDEC规格一致,否则地址映射会错位。
  • 时序参数:tRCD、tRP、tRAS、tRC、tWR、tRFC、CL、CWL等,通常以tCK为单位填入。例如DDR4-2400下CL=16表示读命令到数据输出的延迟为16个时钟周期。
  • 控制器选项:包括是否使能ECC、是否使用AXI接口或Native接口、命令队列深度、是否开启Write Leveling与Read Gate Training等。

一个常见的教学示例:选用Micron DDR4-2400 8Gb颗粒,x16位宽,单Rank。配置时填入tCK=0.833 ns,CL=16,tRCD=16,tRP=16,tRAS=39,tRC=55,tRFC=421。这些数值来自颗粒数据手册的Speed Bin表,不能凭经验估算。若填错,控制器可能在初始化阶段就报训练失败,或在高负载下出现间歇性数据错误。

二、接口信号:三类端口各司其职

IP核对外暴露的接口可分为三组:

  • 系统侧接口:包括时钟sys_clk、复位sys_rst_n,以及AXI4或Native命令/数据接口。AXI接口包含AW/W/B/AR/R五个通道,适合与处理器或DMA对接;Native接口则直接暴露cmd、addr、wdata、rdata等信号,适合自定义逻辑。
  • DFI接口:连接控制器与PHY,包含dfi_addr、dfi_bank、dfi_cs_n、dfi_ras_n、dfi_cas_n、dfi_we_n、dfi_wrdata、dfi_rddata等。DFI是控制器与PHY之间的标准接口,用户通常不直接操作,但调试时可通过它观察命令是否发出。
  • PHY侧引脚:包括DDR_CK_P/N、DDR_ADDR、DDR_BA、DDR_CS_N、DDR_DQ、DDR_DQS_P/N、DDR_ODT、DDR_CKE等,直接连到FPGA引脚并接DRAM颗粒。

需要特别注意的是,DDR_DQS是双向差分信号,读时由DRAM驱动,写时由FPGA驱动。控制器内部通过三态控制切换方向,若方向切换时机不对,会出现总线冲突或采样错误。

三、时钟架构:四个时钟域与相位关系

PolarFire DDR控制器的时钟架构是理解整个IP核的难点。它涉及四个时钟域:

  • 系统时钟sys_clk:用户逻辑时钟,频率通常为DDR数据速率的1/4或1/2,例如DDR4-1600下sys_clk=400 MHz(1/4速率)。
  • 控制器时钟ctrl_clk:控制器内部工作时钟,与sys_clk同频或分频,用于命令调度。
  • PHY时钟phy_clk:PHY内部高速时钟,通常为DDR数据速率的一半,例如800 MHz。
  • DDR时钟DDR_CK:输出到DRAM的差分时钟,频率为数据速率的一半,例如800 MHz。

这些时钟由PLL或CCC(Clock Conditioning Circuit)生成,必须保证相位关系满足DFI时序要求。例如,DFI要求dfi_wrdata与dfi_wrdata_en之间的偏斜小于一定值,否则写数据无法正确对齐到DQS中心。Libero在综合时会自动插入时序约束,但用户需要在约束文件中确认create_clock和set_output_delay是否正确。

PolarFire DDR控制器IP核:时钟架构与信号流 用户逻辑 / CPU AXI4 或 Native sys_clk / sys_rst_n DDR控制器硬核 命令调度 / 地址映射 ECC / 队列管理 ctrl_clk DDR PHY DFI接口 Write Leveling Read Gate Training DRAM 颗粒 DDR4 命令/数据 DFI DQ/DQS 时钟域与频率关系(以DDR4-1600为例) sys_clk 400 MHz (1/4速率) ctrl_clk 400 MHz phy_clk 800 MHz DDR_CK 800 MHz 差分 复位与初始化流程(上电后顺序) ① 复位释放 sys_rst_n拉高 ② PHY训练 Write Leveling ③ DRAM初始化 MRS/ZQ校准 ④ 控制器就绪 init_done拉高 ⑤ 用户访问 AXI读写生效

四、复位与初始化流程:从释放复位到用户可访问

PolarFire DDR控制器的初始化不是简单拉高复位就能完成,而是一个由硬件状态机自动执行的多阶段过程。上电后,用户需要先保持sys_rst_n为低至少若干周期,确保PLL锁定。随后释放复位,控制器依次执行以下阶段:

  1. PHY训练:包括Write Leveling和Read Gate Training。Write Leveling用于补偿DQS与CK之间的飞行时间偏差,控制器会发送一系列DQS脉冲,DRAM反馈采样结果,控制器据此调整延迟。Read Gate Training则确定读数据窗口的中心位置。这一阶段通常需要几百个时钟周期。
  2. DRAM初始化:控制器按照JEDEC规范向DRAM发送MRS(Mode Register Set)命令,配置CL、CWL、突发长度等。随后执行ZQ校准,调整ODT和驱动强度。对于DDR4,还需要执行VREF训练。
  3. 控制器就绪:当所有训练和初始化完成后,IP核会拉高init_done信号。此时用户逻辑才能开始发送读写命令。若init_done长时间不拉高,应检查时钟是否锁定、复位时序是否满足、以及颗粒是否焊接良好。
在实际调试中,若init_done无法拉高,可先通过Libero的SmartDebug工具观察DFI接口上的命令活动。若DFI上没有任何命令,说明控制器未启动,重点检查sys_rst_n和PLL锁定信号;若有命令但训练失败,则重点检查DQS/DQ的引脚分配和PCB走线长度匹配。

五、参数、接口与时钟的联动关系

这三者并非独立。例如,若将数据位宽从16 bit改为32 bit,则DFI接口的dfi_wrdata位宽会翻倍,PHY的DQ引脚数量也翻倍,同时sys_clk频率可能需要调整以维持吞吐量。又如,若将CL从16改为18,则控制器内部读延迟增加2个tCK,Read Gate Training的窗口也会相应移动。因此,在修改任何参数后,都必须重新运行综合与实现,并确认时序约束仍然满足。

一个实用的检查清单如下:

检查项预期值/状态异常处理
PLL锁定locked=1检查参考时钟频率与PLL配置
sys_rst_n低电平保持≥100 ns延长复位脉冲
init_done初始化后拉高查看DFI命令活动
DFI写数据偏斜满足DFI时序调整约束或PHY延迟
DQS/DQ引脚分配与PCB走线匹配重新分配或调整PCB

掌握以上四部分内容后,读者应能独立完成PolarFire DDR控制器IP核的配置、接口连接、时钟约束和初始化调试。下一阶段的实际工程中,建议先用较低速率(如DDR4-1200)打通全流程,确认init_done拉高且读写测试通过后,再逐步提升到目标速率。