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软件完成。初学阶段建议先掌握静态配置,确认多路时钟与锁定指示正常后,再引入动态重配置。

Quartus PLL IP 配置与多路时钟输出关系图 参考时钟 clk_50m / 50 MHz ALTPLL / MMCM IP pll_sys M/N/C 计数器 · 相移 · 占空比 带宽 / 扩频 / 锁定检测 动态重配置接口 (可选) inclk0 c0 → clk_100m 100 MHz · 0° c1 → clk_25m 25 MHz · 0° c2 → clk_50m_90 50 MHz · 90° c3 → clk_200m 200 MHz · 0° locked 锁定指示 低电平 = 未锁定,高电平 = 已锁定 复位同步释放 locked 上升沿 → 三级同步 → rst_n 各时钟域独立复位 动态重配置 mgmt_clk reconfig_to_pll reconfig_from_pll 可选 SDC 约束: create_clock / derive_pll_clocks 多时钟域 clk_100m 域:主控逻辑 clk_25m 域:低速接口 clk_50m_90 域:采样 clk_200m 域:高速处理

五、配置检查清单

检查项 预期结果 判断依据
参考时钟频率 与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频率和锁定条件,是排查的第一手依据。
注意:动态重配置期间PLL输出可能短暂失锁,必须用locked下降沿复位相关逻辑,待重新锁定后再恢复运行。不要在重配置过程中直接使用输出时钟采样关键数据。

完成上述配置后,一个典型的多时钟系统即可在Quartus中编译、约束并下载验证。建议先用SignalTap II同时抓取locked、clk_100m和clk_25m,确认锁定过程与频率关系,再逐步加入跨时钟域逻辑。动态重配置可作为进阶内容,在静态配置稳定后再引入。