FPGA IP PLL 详解
FPGA(Field-Programmable Gate Array)中的 PLL(Phase-Locked Loop,锁相环)是一种重要的时钟管理 IP(Intellectual Property,知识产权)核,用于生成、同步和调整时钟信号。它广泛应用于时钟频率合成、相位偏移、去抖动和时钟恢复等场景,帮助 FPGA 设计实现高性能的时序控制。下面我将从 PLL 的基本原理、FPGA 中的应用、主要厂商(如 Intel/Altera 和 AMD/Xilinx)的 IP 实现、配置方法以及注意事项等方面进行详细说明。
1. PLL 的基本原理
PLL 是一种闭环反馈控制系统,用于产生与输入参考信号(参考时钟)相位和频率同步的输出信号。其核心目标是“锁定”输入信号的相位,确保输出信号稳定且可控。
PLL 的主要组件:
- 相位检测器(Phase Detector, PD):比较输入参考时钟(refclk)和反馈信号(通常来自 VCO 的输出经过分频)的相位差,产生误差信号(通常是电压或数字脉冲)。
- 环路滤波器(Loop Filter, LF):对误差信号进行滤波,平滑输出,控制 PLL 的带宽和稳定性。滤波器可以是低通滤波器,影响 PLL 的锁定时间和抖动性能。
- 压控振荡器(Voltage-Controlled Oscillator, VCO):根据滤波后的误差信号调整输出频率。VCO 的输出是 PLL 的核心信号,通常是高频时钟。
- 分频器(Dividers):包括预分频器(N 分频器,用于输入参考时钟的分频)、反馈分频器(M 分频器,用于 VCO 输出反馈到 PD)和后分频器(C 分频器,用于生成多个输出时钟)。这些分频器允许 PLL 实现频率乘法(multiplication)和除法(division),如输出频率 = (输入频率 × M) / N。
工作过程:
- 初始化时,PD 检测相位差,产生误差。
- LF 平滑误差,驱动 VCO 调整频率。
- 通过反馈路径,系统不断迭代直到相位锁定(locked),此时输出信号与输入相位对齐。
- 一旦锁定,PLL 可维持稳定输出,即使输入有轻微扰动。
在 FPGA 中,PLL 常用于:
- 时钟倍频/分频:例如,从 50 MHz 输入生成 200 MHz 输出。
- 相位偏移:调整输出时钟的相位,以补偿布线延迟。
- 时钟去抖动:清理噪声,提高信号质量。
- 多时钟域管理:生成多个同步时钟供不同模块使用。
PLL 的性能指标包括锁定时间(lock time)、抖动(jitter)、带宽(bandwidth)和功耗。FPGA 厂商提供预配置的 PLL IP 核,简化设计,避免从零实现。
2. FPGA 中的 PLL IP 核概述
FPGA 厂商(如 Intel/Altera、AMD/Xilinx、Lattice 等)提供 PLL IP 核,通常集成在开发工具中(如 Intel Quartus Prime 或 AMD Vivado)。这些 IP 核基于 FPGA 的专用硬件资源(如 VCO 和分频器),支持整数模式(Integer-N PLL)和分数模式(Fractional-N PLL),后者允许更精细的频率调整。
- 整数模式:M 和 N 为整数,输出频率 = (refclk × M) / N。
- 分数模式:引入分数分频(如 K 分数因子),支持非整数倍频,提高灵活性,但可能增加抖动。
PLL IP 通常支持动态重配置(dynamic reconfiguration),允许运行时调整参数,而无需重新综合设计。
3. Intel (Altera) FPGA 中的 PLL IP 核
Intel FPGA(如 Arria V、Cyclone V、Stratix V 系列)使用 “Altera PLL IP Core” 或 “IOPLL Intel FPGA IP”,支持 Arria V、Cyclone V 和 Stratix V 等家族。 这些 IP 核用于 I/O 时钟管理和内部时钟生成。
功能描述:
- PLL 生成输出时钟,与输入时钟同步。比较输入和 VCO 输出信号的相位差,实现锁定。
- 支持频率倍增/除法、相位偏移和占空比调整。
- 可配置为频率倍增器、分频器、解调器或时钟恢复电路。
构建模块:
- 相位频率检测器 (PFD)。
- 电荷泵 (Charge Pump)。
- 环路滤波器。
- VCO。
- 计数器:反馈计数器 (M)、预分频计数器 (N)、后分频计数器 ©。
操作模式(Clock Feedback Modes,共 6 种):
- Direct Mode:最小反馈路径,适合低抖动,但不补偿时钟网络延迟。输出与输入有相移。
- Normal Mode:补偿内部时钟网络延迟。如果驱动外部引脚,会引入相应相移。
- Source Synchronous Mode:匹配引脚到 I/O 输入寄存器的时钟延迟和数据延迟。
- External Feedback Mode:通过外部引脚 (fbclk) 反馈,实现板级补偿。
- Zero Delay Buffer Mode:补偿外部输出引脚延迟,使输出信号与输入同步。
- LVDS Mode:用于 LVDS 接口,补偿 LVDS 时钟网络和 SERDES 捕获寄存器延迟。
输出时钟:
- 支持最多 18 个输出时钟 (Arria V/Stratix V) 或 9 个 (Cyclone V)。
- 每个输出可独立设置频率、相移和占空比。实际频率为最接近值;在分数模式下可能不精确。
参考时钟切换(Reference Clock Switchover):
- 支持两个参考输入 (refclk 和 refclk1)。
- 模式:自动切换(主时钟失效时切换到备份)、手动切换(通过 extswitch 信号控制,高电平 ≥3 周期)、自动带手动覆盖。
- 输出信号:activeclk(指示当前时钟,低=refclk,高=refclk1)、clkbad(指示时钟失效,高=失效)。
PLL 级联(Cascading):
- PLL-to-PLL Cascading:使用 adjpllin(相邻 PLL 级联)或 cclk(内部级联,Cyclone V 不支持)。源 PLL 用低带宽,目标 PLL 用高带宽。
- 输出计数器级联:级联 C 计数器以实现更低频率。上游计数器馈送下游,上游不支持相移,下游支持可编程占空比。
端口(Ports):
- 输入:refclk (主参考)、refclk1 (备份)、reset (复位)、fbclk (外部反馈)、extswitch (手动切换)、adjpllin/cclk (级联输入)。
- 输出:outclk[] (时钟输出)、locked (锁定指示)、fboutclk (反馈输出)、zdbfbclk (零延迟缓冲)、activeclk、clkbad、cascade_out (级联输出)。
参数配置(在 Quartus Prime 中):
- General Tab:设备速度等级、PLL 模式 (Integer-N/Fractional-N)、操作模式、参考频率、输出数量、期望频率/相移/占空比、M/N/C 因子、分数设置 (K, Fcout)。
- Clock Switchover Tab:启用 refclk1、切换模式、延迟、activeclk/clkbad。
- Cascading Tab:启用 cascade_out、输入源选择。
- MIF Streaming Tab:生成 .mif 文件用于动态重配置,支持动态相移。
- Settings Tab:自动复位、带宽预设、动态重配置、DPA 输出等。
- Advanced Parameters Tab:物理 PLL 设置 (M/N/C/K、带宽、电荷泵)。
使用步骤:
- 在 Quartus Prime 的 IP Catalog 中搜索 “PLL Intel FPGA IP”。
- 配置参数,生成 IP 核。
- 在 Verilog/VHDL 中实例化,例如:
altera_pll u_pll ( .refclk(refclk), .reset(reset), .outclk(outclk), .locked(locked) ); - 连接到设计中,综合并验证时序。
4. AMD (Xilinx) FPGA 中的 PLL IP 核
AMD FPGA(如 7 系列、UltraScale、Zynq 系列)使用 “Clocking Wizard” IP 生成 PLL 或 MMCM(Mixed-Mode Clock Manager,混合模式时钟管理器)。MMCM 是 PLL 的增强版,支持更多功能,如动态相移和精细分频。 PLL 常用于简单时钟生成,MMCM 用于复杂场景。
PLL vs MMCM:
- PLL:基本锁相环,支持频率合成、相移。适合低功耗应用。
- MMCM:集成 PLL + 额外功能,如动态相移、分数分频、更精细的占空比调整。支持更多输出(最多 8 个)。
- 两者都基于 VCO,但 MMCM 有更多分频器和缓冲。
功能特点:
- 时钟生成:从参考时钟产生多个输出,支持倍频/分频(M/D 因子,M=264,D=1106)。
- 相移:固定或动态(运行时调整)。
- 抖动过滤:低抖动模式。
- 动态重配置:通过 DRP(Dynamic Reconfiguration Port)端口调整参数。
- 在 Zynq SoC 中,PS(Processing System)PLL 可生成时钟供 PL(Programmable Logic)使用,支持 4 个独立时钟路径。
端口(典型 PLL/MMCM):
- 输入:CLK_IN1 (参考时钟)、RESET、PSCLK/PSEN/PSINCDEC (动态相移)。
- 输出:CLK_OUT1~N (输出时钟)、LOCKED。
- 其他:CLKFBOUT (反馈输出)、CLKFBIN (反馈输入)。
参数配置(在 Vivado 中):
- 使用 Clocking Wizard IP:选择 PLL 或 MMCM 类型。
- 设置输入频率、输出频率/相移/占空比、抖动优化、带宽。
- 支持组件模式(Component Mode)或原生模式(Native Mode)用于 I/O 规划。
- 对于内存接口,使用 Memory IP(如 DDR4 MIG)集成 PLL/MMCM。
使用步骤:
- 在 Vivado 的 IP Catalog 中搜索 “Clocking Wizard”。
- 配置向导:输入参考频率,指定输出(e.g., 100 MHz 从 33.33 MHz 生成)。
- 生成 IP,实例化在 Verilog/VHDL 中:
clk_wiz_0 u_pll ( .clk_in1(refclk), .reset(reset), .clk_out1(outclk), .locked(locked) ); - 对于 Zynq:在 PS 配置中启用 FCLK(从 PS PLL 输出到 PL),频率范围 10~800 MHz。
5. 其他 FPGA 厂商的 PLL(简述)
- Lattice iCE40:内置 PLL,支持时钟倍频(从 12 MHz 到 275 MHz)。使用 SB_PLL40_CORE 模块配置 VCO、分频器。适合低功耗应用。
- 通用注意:避免过高 VCO 频率(典型 500 MHz~2 GHz),监控锁定信号,确保参考时钟稳定。
6. 注意事项和最佳实践
- 抖动管理:选择低带宽模式减少抖动,但锁定时间变长。
- 电源噪声:PLL 对电源敏感,确保稳定供电。
- 验证:使用仿真工具检查锁定时间和相移。监控 clkbad/locked 信号。
- 动态重配置:适用于自适应系统,但需小心避免时钟故障。
- 工具集成:在 Quartus/Vivado 中,使用 IP 生成器避免手动编码错误。
- 常见问题:如果 PLL 未锁定,检查参考时钟频率、复位序列或分频设置。
Lattice FPGA PLL 配置详解
Lattice Semiconductor 的 FPGA(如 iCE40、iCE40 UltraPlus、ECP5、MachXO2 等系列)中的 PLL(Phase-Locked Loop,锁相环)用于时钟频率合成、相位调整和抖动过滤。Lattice 的 PLL 配置相对简单,尤其在低功耗系列如 iCE40 中,使用硬核原语(primitive)直接实例化,而非复杂的 IP 核。下面重点介绍最常见的iCE40 系列 PLL 配置(包括 iCE40LP/HX、Ultra、UltraPlus),并简述其他系列。
1. iCE40 系列 PLL 概述
iCE40 系列(如 iCE40HX、UP5K 等)通常有 1~2 个 PLL,支持:
- 输入频率:10~133 MHz(具体取决于器件)。
- 输出频率:最高 ~275 MHz(但全局时钟网络上限 ~185 MHz)。
- VCO 频率范围:533~1066 MHz(典型)。
- 支持简单反馈模式(SIMPLE)、相移、动态延迟调整。
- 输出:PLLOUTCORE(本地路由)和 PLLOUTGLOBAL(全局时钟网络)。
PLL 原语类型(根据参考时钟来源选择):
- SB_PLL40_CORE:参考时钟来自 FPGA 内部路由(推荐大多数情况)。
- SB_PLL40_PAD:参考时钟直接来自专用引脚(PACKAGEPIN)。
- SB_PLL40_2F_CORE / 2F_PAD:支持分数分频(Fractional-N)和更高灵活性(iCE40 UltraPlus 等)。
频率计算公式:
- F_PFD = F_IN / (DIVR + 1)
- F_VCO = F_PFD × (DIVF + 1)
- F_OUT = F_VCO / (2^DIVQ) (DIVQ = 0~7,对应除 1~128)
VCO 必须在有效范围内,工具会检查。
推荐工具:
- 开源:icepll(从 Project IceStorm)自动计算参数。
示例:icepll -i 12 -o 100 -m -f pll.v生成 Verilog 模块。 - Lattice 官方:Radiant(新工具)或 iCEcube2(旧)中的 Clarity Designer 或 IP Catalog 生成 PLL 模块。
2. iCE40 PLL 配置步骤(Verilog 示例)
最常见方式:直接实例化 SB_PLL40_CORE 原语,手动或用 icepll 设置参数。
典型 Verilog 示例(从 12 MHz 输入生成 ~100 MHz 输出):
module pll ( input reference_clk, // 输入参考时钟(如 12 MHz) output pll_out_core, // 本地输出(可选) output pll_out_global, // 全局时钟输出(推荐驱动全局网络) output locked // 锁定指示(高电平表示锁定) ); SB_PLL40_CORE #( .FEEDBACK_PATH("SIMPLE"), // 简单反馈模式(最常用) .PLLOUT_SELECT("GENCLK"), // 或 "SHIFTED" 用于相移 .DIVR(4'b0000), // 输入分频:0~15 → DIVR+1 .DIVF(7'b1000010), // VCO 乘法:0~127 → DIVF+1 (这里 66+1=67) .DIVQ(3'b011), // 输出分频:0~7 → 2^DIVQ (这里 8) .FILTER_RANGE(3'b001) // 滤波器范围(1~7,根据输入频率选择) ) pll_inst ( .REFERENCECLK(reference_clk), .PLLOUTCORE(pll_out_core), // 可选,留空或连接本地逻辑 .PLLOUTGLOBAL(pll_out_global), // 推荐用于全局时钟 .LOCK(locked), .RESETB(1'b1), // 低电平复位 PLL .BYPASS(1'b0) // 旁路模式(0=正常) ); endmodule- 计算示例:输入 12 MHz → F_PFD=12 MHz → F_VCO=804 MHz → F_OUT=100.5 MHz。
- 如果需要驱动全局缓冲(推荐高扇出时钟):
SB_GB gb_inst ( .USER_SIGNAL_TO_GLOBAL_BUFFER(pll_out_global), .GLOBAL_BUFFER_OUTPUT(final_global_clk) );
使用 Radiant 软件 GUI 配置:
- 在 IP Catalog 中搜索 “PLL”(Architecture_Modules 类别)。
- 双击 PLL,进入配置向导。
- 设置输入频率、期望输出频率、相移等。
- 生成模块(Verilog/VHDL),自动包含原语实例化。
- 推荐使用专用 PLL 输入引脚(如 GPLL_IN)以获得最佳性能。
3. 其他 Lattice 系列 PLL 配置简述
ECP5/ECP5-5G:
- 使用 Radiant 中的 PLL IP(EHPLL 或 GPLL)。
- 支持更多输出(CLKOP, CLKOS, CLKOS2, CLKOS3)、动态相移。
- 配置向导计算 DIV 参数、反馈路径(INTERNAL/EXTERNAL)。
- 参考文档:ECP5 sysCLOCK PLL/DLL Design and Usage Guide (FPGA-TN-02200)。
MachXO2/MachXO3:
- 使用 Diamond 或 Radiant 中的 PLL IP。
- 支持分数-N、分频器级联、动态相移。
- 参考文档:MachXO2 sysCLOCK PLL Design and Usage Guide (FPGA-TN-02157)。
Certus-NX / CrossLink-NX 等:
- Radiant 中 PLL Module IP,支持高性能配置。
4. 注意事项
- 锁定时间:通常几 ms,监控 LOCK 信号,避免在未锁定前使用输出。
- 电源滤波:PLL 对噪声敏感,推荐外部滤波电容。
- 放置约束:PLL 位置固定,参考时钟引脚有限制(查器件手册)。
- 开源支持:iCE40 PLL 完全支持 Yosys/nextpnr,无需 Lattice 工具。
- 文档推荐:下载 Lattice TN1251(iCE40 sysCLOCK PLL Design and Usage Guide)获取完整表格和限制。
Lattice FPGA PLL 动态重配置示例
Lattice FPGA 的 PLL 支持不同程度的动态重配置(Dynamic Reconfiguration),主要包括动态相移(Dynamic Phase Shift)和动态延迟调整(Dynamic Delay Adjustment)。少数系列(如 MachXO2)支持通过 WISHBONE 接口改变分频器等参数,实现完整频率动态调整。iCE40 系列不支持完整动态频率重配置,主要支持动态相移或延迟调整。
下面按系列分类提供示例(基于 Lattice 官方文档,如 TN1251、TN02157、TN02200 等)。示例以 Verilog 为主,适用于 Radiant 或 Diamond 工具。
1. iCE40 系列(包括 UltraPlus、UP5K 等)
iCE40 PLL 不支持完整动态频率重配置(分频器固定),但支持:
- 动态细延迟调整(Fine Delay Adjustment):通过 DYNAMICDELAY[7:0] 端口动态改变反馈和输出延迟(每步 ~VCO 周期的 1/8)。
- 动态相移:部分型号支持粗相移(90° 步进)或细相移。
启用动态延迟:在 Clarity Designer 或 Radiant PLL 配置中设置 DELAY_ADJUSTMENT_MODE = “DYNAMIC”。
Verilog 示例(动态调整反馈和输出延迟,实现细相移效果):
module pll_dynamic_delay ( input clk_ref, // 参考时钟(如 12 MHz) input rst_n, input [7:0] dyn_delay, // 动态延迟值(用户逻辑提供) output clk_out_global, output locked ); SB_PLL40_CORE #( .FEEDBACK_PATH("SIMPLE"), .DELAY_ADJUSTMENT_MODE_FEEDBACK("DYNAMIC"), .DELAY_ADJUSTMENT_MODE_RELATIVE("DYNAMIC"), .SHIFTREG_DIV_MODE(1'b0), // 0: 细延迟步进 = VCO/8 .FDA_FEEDBACK(4'b0000), // 静态反馈延迟(可选) .FDA_RELATIVE(4'b0000), // 静态相对延迟(可选) .PLLOUT_SELECT("GENCLK"), .DIVR(4'b0000), .DIVF(7'b1000010), // 示例参数 .DIVQ(3'b011), .FILTER_RANGE(3'b001) ) pll_inst ( .REFERENCECLK(clk_ref), .DYNAMICDELAY(dyn_delay), // 动态输入:dyn_delay[7:4] 控制反馈,[3:0] 控制输出 .PLLOUTGLOBAL(clk_out_global), .LOCK(locked), .RESETB(rst_n), .BYPASS(1'b0) ); endmodule- 使用方式:运行时改变
dyn_delay值(0~15 每组),PLL 会动态调整相位(可能短暂失锁,监控 LOCK)。 - 注意:相移步进取决于 VCO 频率,详见 FPGA-TN-02052(iCE40 sysCLOCK PLL Guide)。延迟改变后可能需等待 tLOCK 重锁。
2. ECP5/ECP5-5G 系列
支持动态相移(Dynamic Phase Adjustment),步进为 VCO 周期的 1/8(细相移)。通过专用端口控制,不改变频率。
启用:在 Radiant Clarity Designer 中设置 DPHASE_SOURCE = “ENABLED”。
Verilog 示例(EHXPLLB 原语,动态相移 CLKOP):
EHXPLLB pll_inst ( .CLKI(clk_ref), // 输入参考时钟 .CLKFB(clkfb), // 反馈(内部或外部) .PHASESEL0(phase_sel[0]), // 选择哪个输出(00: CLKOP, 01: CLKOS 等) .PHASESEL1(phase_sel[1]), .PHASEDIR(phase_dir), // 1: 增加相移,0: 减少 .PHASESTEP(phase_step), // 高电平脉冲加载一步调整 .PHASELOADREG(phase_load), // 高电平加载 PHASESEL 值 .STDBY(1'b0), .PLLWAKE( ), .RST(rst), .CLKOP(clk_out_primary), // 主输出 .CLKOS(clk_out_secondary), // 辅助输出(可额外相移) .LOCK(locked) ) /* synthesis FREQUENCY_PORT="CLKOP" "100.000000" */; // 参数通过 .pdc 文件或属性设置分频等 // 动态控制逻辑示例 always @(posedge ctrl_clk) begin if (adjust_phase) begin phase_step <= 1'b1; // 脉冲一步 phase_dir <= 1'b1; // 增加相移 #1 phase_step <= 1'b0; end end- 步进:每 PHASESTEP 脉冲移 45°(VCO/8)。
- 参考:FPGA-TN-02200(ECP5 sysCLOCK PLL/DLL Guide)。调整后无 glitch(延迟方向),前进方向可能有 glitch。
3. MachXO2 系列
支持最完整的动态重配置:
- 动态相移:类似 ECP5。
- 完整参数重配置:通过 Embedded Function Block (EFB) 的 WISHBONE 接口改变分频器、相移等,实现运行时频率改变。
动态相移示例(类似 ECP5):
EHXPLLB pll_inst ( .CLKI(clk_ref), .PHASESEL(2'b00), // 固定选择 CLKOP .PHASEDIR(phase_dir), .PHASESTEP(phase_step), .PHASELOADREG(phase_load), .CLKOP(clk_out), .LOCK(locked) );完整动态频率重配置(需实例化 EFB):
- 在 IPexpress 生成 EFB + PLL。
- 通过 WISHBONE 总线写寄存器(详见 TN02157 Appendix D)。
- 示例寄存器:写 DIVF、DIVQ 等后,PLL 重锁。
简单控制逻辑(伪码):
// 使用 EFB 的 WISHBONE 端口写 PLL 寄存器 efb_inst.WB_ADDR = pll_reg_addr; // 如 0x08 为 CLKOP 分频 efb_inst.WB_DAT = new_div_value; efb_inst.WB_WE = 1'b1; efb_inst.WB_STB = 1'b1; // 等待 ACK,PLL 会自动重锁- 注意:频率改变后 PLL 失锁,需等待 LOCK 高。
注意事项(所有系列通用)
- 动态调整可能导致短暂失锁(LOCK 低),设计中需监控 LOCK 并暂停时钟使用逻辑。
- 电源噪声敏感,确保 VCCPLL 稳定。
- 推荐使用 Radiant Clarity Designer 生成 PLL IP,支持动态选项。
- 完整文档:下载对应 TN(如 FPGA-TN-02052 for iCE40, TN02200 for ECP5, TN02157 for MachXO2)。
如果您指定具体器件(如 iCE40UP5K 或 ECP5-85K)和需求(相移还是频率改变),我可以提供更精确的参数计算或完整项目示例!