3. Quartus DDR IP核体系与生成流程
在Quartus Prime中,DDR接口设计几乎不会从零手写RTL,而是以IP核为起点。Intel FPGA的DDR IP统一收纳在IP Catalog的Memory Interfaces and Controllers分类下,按协议族分为DDR3、DDR4、LPDDR4(以及DDR2、LPDDR3、QDR等)多个条目。理解这些IP核的分类逻辑、参数配置界面、接口信号和生成文件结构,是后续校准工程能够顺利推进的前提——因为校准脚本、引脚约束、时序报告都直接依赖IP生成时确定的参数与端口命名。
一、IP核分类与选型依据
IP Catalog中的DDR条目并非按“速率”简单排列,而是按协议 + 控制器/PHY组合方式组织。常见三类:
- DDR3 SDRAM Controller with UniPHY / ALTMEMPHY:面向Cyclone V、Arria V、Stratix V等器件,UniPHY是主流选择,支持硬核或软核控制器。
- DDR4 SDRAM Controller with UniPHY:面向Arria 10、Stratix 10等,Arria 10起PHY部分大量硬核化,I/O PLL与SERDES集成度更高。
- LPDDR4 Controller with UniPHY:面向低功耗场景,Arria 10/Stratix 10支持,接口电压1.1V,采用双通道(Channel)结构。
选型时先确认三件事:器件系列是否支持该协议、目标数据速率是否落在PHY支持范围内、封装/引脚是否满足DDR专用I/O Bank的分配要求。例如Arria 10的DDR4硬核PHY最高可到2666 Mbps,而Cyclone V的DDR3软核PHY通常限制在1066~1600 Mbps区间。选错IP条目,后续参数界面里根本找不到对应速率档位。
二、参数配置界面的关键页签
双击IP条目进入Parameter Editor,界面通常分为Memory Settings、Controller Settings、PHY Settings、Board Settings、Example Design等页签。真正影响校准的是以下几组参数:
- Memory Settings:Memory vendor、Memory device speed grade、Data width、Row/Column/Bank地址位宽、CAS latency。这些必须与板上颗粒手册一致,否则校准阶段读写窗口会整体偏移。
- Controller Settings:Controller type(Hard/Soft)、Efficiency、Reorder buffer深度、是否使能ECC。硬核控制器延迟低但灵活性差,软核可调但占用逻辑资源。
- PHY Settings:Memory clock frequency、PLL reference clock frequency、Rate(Full/Half)、DQS group数量。这里决定PLL分频比和DQS/DQ的组映射关系。
- Board Settings:Board skew、Package skew、是否启用Board Deskew。这些值直接进入PHY的延迟补偿计算,是校准能否收敛的关键输入。
三、接口信号说明
生成的IP顶层端口可分为四组:时钟与复位(pll_ref_clk、global_reset_n、soft_reset_n)、控制器用户接口(avl_ready、avl_burstbegin、avl_addr、avl_wdata、avl_rdata等Avalon-MM信号)、PHY与外部颗粒接口(mem_dq、mem_dqs、mem_addr、mem_ba、mem_cs_n、mem_cke、mem_odt等)、状态与校准接口(local_cal_success、local_cal_fail、afi_clk、afi_reset_n)。其中afi_*是PHY与控制器之间的内部接口,用户一般只关心Avalon-MM侧和校准状态位。
需要特别注意的是local_cal_success与local_cal_fail:前者拉高表示PHY内部校准(DQS centering、读写leveling)完成,后者表示失败。在校准工程中,这两个信号通常接到LED或SignalTap,作为判断DDR是否可用的第一手依据。
四、生成文件结构与后续使用
点击Generate后,Quartus会在指定目录下输出一组文件。以DDR3 UniPHY为例,典型结构如下:
ddr3_top/
├── ddr3_top.v // 顶层例化,含PLL与PHY
├── ddr3_top.qip // IP清单,加入工程
├── ddr3_phy.v // PHY层RTL
├── ddr3_controller.v // 控制器RTL
├── ddr3_p0_pin_assignments.tcl // 引脚分配脚本
├── ddr3_p0.sdc // 时序约束
├── ddr3_p0_report_timing.tcl
└── example_design/ // 参考工程与测试激励
其中ddr3_p0_pin_assignments.tcl必须在全编译前通过source命令导入,否则Fitter无法把mem_*信号分配到DDR专用Bank;ddr3_p0.sdc则定义了PHY内部时钟与外部颗粒的时序关系,校准阶段读取的时序余量就来自这里。example_design中的参考工程可以直接编译下载,用于验证IP本身是否配置正确——建议在接入自研逻辑前先跑通example design,确认local_cal_success能稳定拉高。
五、从IP生成到校准的衔接点
IP生成完成后,工程进入“可编译但未校准”状态。此时需要关注三个衔接点:第一,确认afi_clk频率与用户逻辑时钟匹配,Avalon-MM接口的读写时序以afi_clk为基准;第二,把local_cal_success接入复位释放逻辑,校准未完成前不要向DDR发起读写;第三,保存生成时的参数配置(.qsys或.ip文件),后续调整Board skew或PLL参考时钟时,需要回到Parameter Editor重新生成,而不是直接改RTL。
理解IP核的分类、参数页签、信号分组和文件结构,本质上是为校准建立“可追溯的起点”。校准中遇到的读写窗口偏移、DQS捕获失败、校准超时等问题,往往可以回溯到生成阶段的某个参数设置。把生成流程走扎实,后续的SignalTap观测和时序收敛才有明确的参照系。