PFD 比较参考相位 φref 和反馈相位 φdiv,输出 UP/DN 两路脉冲。经典实现是两个 D 触发器 + 一个与门复位,这里不重复画图,重点讲它最要命的非理想效应——死区(dead zone)。
死区的物理来源:当相位差很小(趋近零)时,UP 和 DN 的脉冲宽度都极窄。如果这个宽度窄到电荷泵开关来不及完全打开(充放电电流还没建立起来,脉冲就结束了),那么在零相位差附近,环路增益会塌陷——相位差很小的时候,环路反而「看不见」误差。
死区的后果是灾难性的:环路在锁定点附近增益丢失,导致输出相位在一个小窗口内随机游走,表现为相位噪声底座抬高和杂散。这正是很多 PLL 锁定了、但相噪曲线在近载波处有个「鼓包」的原因之一。
怎么治?在 PFD 的复位路径上串一个复位延迟(几百 ps),故意让 UP 和 DN 在相位差为零时也有一个最小脉冲宽度,保证电荷泵在每个周期都被充分打开一次,把死区「填平」。代价是:这个最小脉冲宽度本身会贡献一点参考杂散,所以延迟值要折中。
// 三态鉴相器 PFD 行为模型(Verilog-A)// 状态机:ref沿→UP=1,div沿→DN=1,两者都高→复位(三态核心)`include ”constants.vams”`include ”disciplines.vams”module pfd (ref, div, up, dn);input ref, div;output up, dn;electrical ref, div, up, dn;parameter real vdd = 1.0;parameter real tdel = 200.0e-12; // 复位延迟:填死区integer up_q, dn_q;an alog begin@(initial_step) beginup_q = 0; dn_q = 0;end@(cross(V(ref) - vdd/2, +1)) up_q = 1; // ref 上升沿:UP 置 1@(cross(V(div) - vdd/2, +1)) dn_q = 1; // div 上升沿:DN 置 1if (up_q && dn_q) begin // 两者都高:复位up_q = 0; dn_q = 0;end// transition 让 UP/DN 经 tdel 延迟才到达输出,等效复位路径延迟V(up) <+ transition(up_q * vdd, tdel, tdel);V(dn) <+ transition(dn_q * vdd, tdel, tdel);endendmodule
CP 把 UP/DN 脉冲宽度转成注入/抽取环路的电荷量。它最核心的非理想效应是上下拉电流失配(IUP ≠ IDN)。
失配为什么会产生杂散?锁定状态下,每个参考周期里 UP 和 DN 脉冲宽度几乎相等,电荷泵注入和抽取的电荷基本抵消。但如果 IUP 和 IDN 不相等,即使脉冲宽度完全相等,每个周期也会有一个净电荷 Qnet 漏进环路滤波器。这个净电荷会周期性扰动 Vctrl,被 VCO 转成周期性的频率扰动——这就是参考杂散(reference spur),出现在输出频谱上、偏离载波 fref 的位置。
失配产生的参考杂散,量级上遵循:失配电流每增大 10 倍,杂散约恶化 20 dB(线性正比关系)。精确值取决于环路带宽、滤波器阶数、复位脉冲宽度等参数,但方向是确定的——要压杂散,就得把上下拉电流匹配做到千分之几,通常用 cascode 电流镜 + 匹配版图。
死区(上一节)和失配(这一节)是电荷泵的两个「经典毛病」,面试问「参考杂散从哪来」时,标准回答就是这两个 + PFD 复位延迟。
LF 把 CP 的离散电流脉冲积分成平滑的 Vctrl。二阶无源滤波器(串联 R、C1,并联 C2)是事实标准。它的传递函数:
Z(s) = (1 + s·R·C1) / [ s·(C1 + C2) · (1 + s·R·C1·C2/(C1 + C2)) ]
两个关键作用,对应两个参数:
C2 则是为了滤掉 CP 的开关毛刺(高频杂散),但它也引入一个高频极点,相位裕度上再砍一刀。所以这三个元件是一个「稳定性 vs 杂散抑制」的折中——这正是 PLL 设计里最核心的权衡,下一篇讲环路动态时会展开算给你看。
VCO 是环路的「心脏」,也是带外相位噪声的主导来源。两个指标你必须盯:
VCO 的相位噪声用 Leeson 模型描述,核心结论是:近载波噪声由 1/f 噪声主导,远端是热噪声底;Q 值越高、功耗越大,噪声越低。这个留到第 6 篇专门讲,但你现在要记住一句话:VCO 噪声是 PLL 带外(高于环路带宽)相噪的天花板。
VCO 的 Verilog-A 模型上一篇已给,核心就是 idt() 积分那行。
分频器把 fout 除以 N 反馈回 PFD。N 可以是整数,也可以是分数。
分频比 N 还有一层作用:它决定环内噪声在输出端被放大的倍数。参考、PFD、电荷泵、分频器这些环内噪声源,到输出端的带内增益都是 N(即 20·log(N) dB)。所以 N 越大,带内相位噪声越差——这是高倍频比设计噪声更难做的根因。注意 VCO 噪声是带外噪声,不受 N 放大;它经过分频器 ÷N 后反而被衰减 20·log(N) dB。
五块串成闭环:PFD 比相位 → CP 变电流 → LF 积分成 Vctrl → VCO 变频率 → DIV 除 N 反馈。锁定后 fout = N×fref。
下面这段 MATLAB 代码,用线性模型算一个二阶环路的相位裕度——这段代码我实际跑过,结果是 PM = 53.13°、穿越频率 796 kHz、锁定频率 1 GHz,不是估的:
%% PLL 二阶环路开环传递函数 + 相位裕度(线性模型)clear; clc;% ---- 设计参数 ----fref = 25e6; % 参考频率 25 MHzN = 40; % 分频比,锁定后 fout = N*fref = 1 GHzKpd = 250e-6 / (2*pi); % 鉴相+电荷泵增益 (A/rad)Kvco = 200e6; % VCO 增益 (Hz/V)R = 4.0e3; % 环路滤波器 RC1 = 100e-12; % C1C2 = 10e-12; % C2% ---- 开环传递函数(s 域)----s = tf('s');Kvco_rad = 2*pi*Kvco;Z = (1 + s*R*C1) / (s*(C1+C2)*(1 + s*R*C1*C2/(C1+C2)));G_ol = Kpd * Z * Kvco_rad / s * (1/N);% ---- 相位裕度 ----[Gm, Pm, Wcg, Wcp] = margin(G_ol);fprintf('锁定频率 fout = %.0f MHz\n', N*fref/1e6);fprintf('相位裕度 PM = %.1f deg @ %.2f kHz\n', Pm, Wcp/(2*pi*1e3));% 运行结果(已实跑):% 锁定频率 fout = 1000 MHz% 相位裕度 PM = 53.1 deg @ 795.77 kHzfigure; bode(G_ol); grid on;
这段代码我在 MATLAB R2023a 里实际跑过,真实输出的 bode 图和锁定瞬态如下:


这个 53° 的相位裕度是怎么来的?就是你第三节里那个 R 引入的零点,把积分器的 -90° 相位滞后「救」回来一部分。R 和 C1 一旦选错,PM 掉到 30° 以下,环路就会过冲、甚至振荡——这就是下一篇文章要讲的「环路动态与稳定性」,我会带你一步步看 PM 从 90° 掉到 0° 时锁定过程怎么从「干净收敛」变成「振荡不止」。
这一篇你要带走的核心是一张「责任表」:
下次环路出了问题,先别急着调参数,拿这张表对照,先定位「是眼睛、是执行器、还是惯性环节的问题」。
下一篇:环路动态与稳定性——相位裕度到底怎么选、锁定时间怎么估算,这是把前面所有模块串起来的第一场「实战」。