4. PLL与MMCM配置实战
在Quartus工程中,PLL(锁相环)与MMCM(混合模式时钟管理器)是生成多路时钟、完成倍频/分频、相位调整与抖动滤除的核心资源。Intel FPGA(如Cyclone IV/10、MAX 10、Arria 10等)通常以ALTPLL、IOPLL、fPLL等IP形式提供,Xilinx 7系列及以上则使用MMCM/PLL原语。本节以Quartus Prime的IP Catalog为主线,完整走通一次PLL IP的配置、例化、锁定指示与动态重配置基础。
一、从IP Catalog创建PLL IP
在Quartus Prime中打开工程后,选择 Tools → IP Catalog,在搜索框输入“PLL”。以ALTPLL为例,双击 Library → Basic Functions → Clocks; PLLs and Resets → PLL → ALTPLL,弹出参数编辑器。第一步是确定IP的保存路径与顶层文件名,例如保存为 pll_sys,语言选择Verilog或VHDL。随后进入参数页:
- General/Mode:选择器件速度等级、参考时钟频率(如50 MHz)、目标输出频率。ALTPLL支持“In normal mode”与“In source-synchronous mode”等,普通多时钟系统选normal mode。
- Input/Locked Output:勾选“Create ‘locked’ output”,用于指示PLL已锁定;可同时勾选“Create ‘areset’ input”以便复位。
- Bandwidth/Spread Spectrum:带宽可设为Auto,扩频一般关闭。
- Output Clocks:在c0~c4中按需使能。例如c0=100 MHz(倍频2×)、c1=25 MHz(分频2×)、c2=50 MHz且相移90°、c3=200 MHz。每路可独立设置占空比、相移与时钟使能。
配置完成后点击Finish,Quartus会生成pll_sys.v、pll_sys.qip等文件,并自动加入工程。此时可在IP Catalog中看到该IP的实例化模板。
二、多路时钟输出的例化与约束
在顶层模块中例化PLL,典型Verilog代码如下:
pll_sys u_pll_sys (
.inclk0 (clk_50m), // 50 MHz 参考输入
.areset (~rst_n), // 高有效复位
.c0 (clk_100m), // 100 MHz
.c1 (clk_25m), // 25 MHz
.c2 (clk_50m_90), // 50 MHz, 90°相移
.c3 (clk_200m), // 200 MHz
.locked (pll_locked) // 锁定指示
);
例化后必须为输入时钟和PLL输出添加SDC约束。参考时钟用create_clock -name clk_50m -period 20.000 [get_ports clk_50m];PLL输出由Quartus自动推导,但建议用derive_pll_clocks和derive_clock_uncertainty显式声明,确保时序分析覆盖所有生成时钟。若某路输出仅用于低速逻辑,可在SDC中设置set_clock_groups -asynchronous或set_false_path,避免不必要的跨时钟域分析。
三、锁定指示与复位策略
locked信号是PLL输出稳定的关键标志。上电后PLL需要若干参考时钟周期完成锁定,期间locked为低。正确做法是用locked的上升沿释放各时钟域复位,而不是直接用外部复位。例如:
reg [2:0] rst_sync;
always @(posedge clk_100m or negedge pll_locked)
if (!pll_locked) rst_sync <= 3'b111;
else rst_sync <= {rst_sync[1:0], 1'b0};
wire rst_100m_n = ~rst_sync[2];
这样可保证在PLL未锁定时逻辑保持复位,锁定后经三级同步释放,避免亚稳态和时钟毛刺导致的误动作。若系统有多个PLL,应分别用各自的locked复位对应时钟域,不要交叉使用。
四、动态重配置基础
动态重配置(Dynamic Reconfiguration)允许在运行中修改PLL的倍频/分频系数、相移或带宽,而无需重新编译。ALTPLL提供reconfig接口,包括reconfig_to_pll、reconfig_from_pll、mgmt_clk、mgmt_reset等。基本流程是:通过mgmt_clk驱动重配置控制器,按地址写入M、N、C计数器值,等待reconfig_from_pll返回完成状态,再观察locked是否重新拉高。实际工程中通常配合altpll_reconfig控制器或Nios II软件完成。初学阶段建议先掌握静态配置,确认多路时钟与锁定指示正常后,再引入动态重配置。
五、配置检查清单
| 检查项 | 预期结果 | 判断依据 |
|---|---|---|
| 参考时钟频率 | 与IP设置一致(如50 MHz) | SDC中create_clock周期20 ns |
| 输出时钟频率 | c0=100 MHz、c1=25 MHz等 | SignalTap或示波器测量周期 |
| locked信号 | 上电后由低变高并保持 | SignalTap抓取或LED指示 |
| 复位释放 | locked上升沿后同步释放 | 逻辑分析仪观察rst_n时序 |
| 时序收敛 | TimeQuest无未约束时钟 | Report Clocks / Report Timing |
locked始终为低,优先检查参考时钟是否稳定、areset是否被误拉高、以及输入频率是否超出PLL的VCO范围。Quartus编译报告中的“PLL Summary”会列出实际VCO频率和锁定条件,是排查的第一手依据。
locked下降沿复位相关逻辑,待重新锁定后再恢复运行。不要在重配置过程中直接使用输出时钟采样关键数据。
完成上述配置后,一个典型的多时钟系统即可在Quartus中编译、约束并下载验证。建议先用SignalTap II同时抓取locked、clk_100m和clk_25m,确认锁定过程与频率关系,再逐步加入跨时钟域逻辑。动态重配置可作为进阶内容,在静态配置稳定后再引入。