这一篇在干嘛?
上一篇我们讲了 PLL 的原理:M、N、C 三个系数怎么算、四种反馈模式有什么区别。但原理看得再懂,不如真刀真枪配一次。这一篇就用开发板上的真实电路——一颗 50MHz 有源晶振——当例子,从电路图讲到 TD 软件里的 IP Generator 四步向导,把 50MHz 一路变成 100MHz,每一步的参数都解释清楚为什么这么填。看完你就能照着配出自己想要的任何频率。
先看电路:50MHz 时钟是怎么进 FPGA 的
动手配 PLL 之前,先搞清楚时钟的「源头」。板上给 FPGA 供时钟的是一颗有源晶振(型号丝印 Y1),电路长这样:

别看就四个管脚,每一处都有讲究:
- 1 脚 NC:悬空不接,图上打了个叉。有源晶振(振荡器)只要供电就有输出,这个脚通常内部不连;
- 2 脚 GND:电源地;
- 4 脚 VCC:接 3.3V 电源,旁边挂了一颗 0.1uF 的去耦电容 C10 到地。它的作用是给晶振「续杯」——晶振翻转瞬间电流突变,这颗小电容就近提供电荷,防止电源轨被拉出毛刺。去耦电容要紧贴晶振电源脚放置,走线越短越好;
- 3 脚 OUT:50MHz 方波输出,串了一颗 33Ω 电阻 R16 再进 FPGA 的 GCLK(全局时钟)专用管脚。
为什么中间要串 33Ω?
晶振输出边沿很陡,而 PCB 走线有阻抗不匹配的地方,信号会在线上来回反射,在时钟上打出「振铃」(波形像铃铛一样抖)。串一个小电阻和走线阻抗构成分压,把反射能量吸收掉,波形立刻干净很多。这是时钟走线上的标准操作,阻值一般 22~50Ω,按实际波形调。另外注意时钟一定要进 GCLK 专用管脚——全局时钟网络是为时钟量身定做的低偏斜走线,上一篇讲的「普通模式补偿 GCLK 网络延迟」,补偿的就是这段网络。
有源晶振和学校实验里常见的无源晶振(两脚的晶体)不一样:无源晶体需要芯片内部的振荡电路配合才能起振,有源晶振通电就直接输出方波。FPGA 侧不用再做任何振荡电路,直接把 OUT 脚接进 GCLK 当参考时钟用。
目标:把 50MHz 变成 100MHz
这块板子的晶振只有 50MHz 一路,但假设我们的设计需要跑 100MHz 的逻辑。用上一篇的公式走一遍心算:
倍频取 2、分频取 1 即可。VCO 的事不用我们操心——TD 会自动把内部 VCO 安排到合法区间(下面会看到它选了 1000MHz,正好在 300~1200MHz 之内)。
打开 IP Generator:四步向导逐页走
在 TD 里点击 Tools → IP Generator → Creat a new IP core,选 PLL 后就进入配置向导。整个过程就四页,我们一页一页过。
第 1 页:输入频率与反馈模式

这一页要填的:
- Input frequency:填 50MHz(向导标了合法范围 10.0~500.0MHz,上一篇讲过的硬杠杠之一)。这里填的值必须和实际电路一致——就是我们上面那颗晶振的 50MHz;
- Feedback mode:选 Normal。下拉框旁边的说明文字写着「The PLL fully compensates the delay introduced by the GCLK network」——普通模式会补偿 GCLK 时钟网络的延迟,让内部寄存器看到的时钟相位和管脚上一致。右边还能选哪一路输出参与反馈,默认 CLKC0 就行;
- Inputs setting → Enable Standby:不勾。standby 是低功耗暂停功能,日常用不到;
- Outputs setting → PLL lock:勾上。勾了以后生成的模块会带出 extlock(锁定指示)端口,上一篇强调过这个信号必须接出来用;
- Dynamic setting:两个动态功能(动态相移、动态参数配置接口)都先不勾——第一次配置保持最简,等真需要跑起来移相再加。
第 2 页:输出频率——向导帮你算好了 M 和 C

这一页有两种填法:Clock frequency(直接填想要的输出频率)或 Parameters setting(手动填倍/分频系数)。向导默认前者,我们勾选 Use C0 clock 后填 100MHz,它自动算出:
- Clock multiplication factor(倍频系数):2
- Clock division factor(分频系数):1
下方 Global Settings 表格是向导的「演算纸」,值得逐行看懂:
| Global Settings | 值 | 含义 |
|---|---|---|
| Input frequency(MHz) | 50.0 | 我们填的晶振频率 |
| Primary clock VCO frequency(MHz) | 1000 | 向导选定的 VCO 工作点 |
| Modulus for M counter | 2 | 倍频计数器模值 |
| Modulus for N counter | 1 | 分频计数器模值 |
几个要点:
- VCO 被安排在 1000MHz。输出只要 100MHz,向导却让 VCO 跑到 1000MHz(在 300~1200MHz 合法区间内),再由 C0 计数器分下来——VCO 频率尽量取高,输出分频比大一些,输出时钟的抖动和占空比都更好,这是工具自动做的优化;
- 你可以直接展开右侧 Detail Settings 里的 C0 Settings 看各路输出的分频与相位细节,本例 C0 分频后正好 100MHz、相位 0°;
- C1~C4 都没勾选,保持空闲。同一个 PLL 最多能带 5 路不同频率输出,以后要 25MHz、200MHz 也不用再占一个 PLL,回来把 C1、C2 勾上就行。
别把两套 M/N 搞混
上一篇原理部分说「M 是参考分频、N 是反馈倍频」,而 TD 向导这里显示的 M counter 是倍频、N counter 是分频——两套叫法正好相反,是文档和工具的历史习惯问题。配置时不用纠结字母,盯住 multiplication(倍频)和 division(分频)这两个英文单词就不会错:50MHz × 2 ÷ 1 = 100MHz。
第 3 页:带宽设置——保持 Medium 就对了

这一页只有一个下拉框 Bandwidth setting,页顶把三种选择讲得明明白白:
- Low bandwidth:抖动性能更好,但锁定时间更长;
- High bandwidth:锁定快,但抖动滤波能力弱;
- Medium bandwidth:两者的折中。
我们保持默认的 Medium。展开 Details 能看到向导根据带宽自动算好的模拟参数:电荷泵电流(Charge pump current)13、环路滤波电阻 4、环路滤波电容 1、KVCO 4、GMC 增益 4。这些是 PLL 内部电荷泵和环路滤波器的配置,不需要也不应该手动改——它们决定的是 PLL 环路对噪声的过滤能力和锁定速度的平衡,向导已经按 Medium 折中好了。
什么时候动带宽?
只有两种情况值得改:一是输入时钟本身质量很差、抖动大,且你的应用对输出抖动极其敏感(比如给高速 ADC 供时钟),可以考虑 Low;二是上电后需要极快锁定(比如时钟要热切换),可以考虑 High。除此之外,Medium 一路用到底。
第 4 页:汇总确认,点 OK 生成

最后一页是整张「体检报告」,把前三页的所有选择列在一起,点 OK 前快速扫一遍:
- General Settings:Speed Grade Any、输入 50MHz、反馈模式 Normal、使用 CLKC0、Standby DISABLE、Reset ENABLE(生成的模块带复位端口)、PLL Lock ENABLE(带 extlock 端口)、两个动态功能 DISABLE;
- BandWidth Setting:Medium 及那五个模拟参数;
- Output Setting:倍频 2、分频 1,输出表里 CLKC0 一行——100.000000 MHz、相位 0°。
点 OK,TD 会生成 PLL 模块文件(.v / .vhd),加进工程后就能例化了。
例化调用:把时钟接进你的设计
生成的模块端口和上一篇的端口表一一对应。典型接法长这样:
// 顶层:50MHz 晶振 → PLL → 100MHz 系统时钟
pll_100m u_pll (
.refclk (clk_50m), // 来自 GCLK 管脚的晶振时钟
.reset (~sys_rst_n), // 复位,高有效,注意取反
.extlock (pll_locked), // 锁定指示,高 = 输出可信
.clkc (clk_c0) // C0 输出 100MHz(多路输出时位宽相应加宽)
);
// 用 extlock 门控下游逻辑的复位释放
reg [3:0] rst_sync;
always @(posedge clk_100m or negedge pll_locked) begin
if (!pll_locked) rst_sync <= 4'b0000; // 未锁定:保持复位
else rst_sync <= {rst_sync[2:0], 1'b1}; // 锁定后同步释放
end
assign rst_100m_n = rst_sync[3];复位释放要等锁定
PLL 上电到 extlock 拉高需要一小段时间(带宽越低越久),这期间 100MHz 输出的频率和相位都不可信。所以下游逻辑的复位必须等 extlock 有效后再同步释放——上面
rst_sync那段就是标准写法,抄走就能用。另外reset是高有效,如果你板子的复位键按下是低电平,别忘了取反。
小结:从石头到时钟的完整链路
回顾这一篇走过的路:晶振 Y1 通 3.3V(C10 就近去耦)输出 50MHz 方波 → R16 33Ω 压住振铃 → 进 FPGA GCLK 专用管脚 → TD IP Generator 四步向导(填输入频率选 Normal → 填 100MHz 让工具算出 ×2÷1、VCO 1000MHz → 带宽 Medium → 汇总 OK)→ 例化生成的模块,盯住 extlock 再放行下游逻辑。50MHz 进,100MHz 出,整条链路上每一环你都知道它在干嘛——下次想把时钟变成 25MHz、120MHz 或者一口气要五路,无非是换几个系数的事。
自测
自测
- 晶振输出脚上串的 33Ω 电阻是干嘛的?去掉会怎样?VCC 脚上的 0.1uF 电容又起什么作用?
- 想从 50MHz 得到 25MHz 输出,倍频/分频系数各填多少?如果想要 120MHz 呢(提示:先想 VCO)?
- 向导第 2 页里 VCO 是 1000MHz,但输出只要 100MHz——为什么工具故意让 VCO 跑这么高?VCO 的合法区间是多少?
- TD 界面里的「Modulus for M counter」和上一篇手册里的 M(参考分频)是一回事吗?配置时应该盯住哪两个英文单词才不会错?
- 例化 PLL 后,为什么下游逻辑的复位释放必须等 extlock?如果直接不等锁定就开始跑,最坏会发生什么?