第三章 鉴频鉴相器(PFD)设计
各位好,欢迎来到PLL设计的第三讲。今天咱们聊聊鉴频鉴相器,也就是PFD。说实话,PFD是整个PLL系统里最容易被低估的模块。很多人觉得它不就是个比较器嘛,有什么好讲的?但我在项目中吃过它的亏,所以今天想好好跟你掰扯掰扯。
3.1 PFD的工作原理
PFD的核心任务就一个:比较参考时钟和反馈时钟的相位差和频率差,然后输出一个误差信号。说白了,它就是个「裁判」,判断谁快了、谁慢了。
典型的PFD结构是三个D触发器加一些逻辑门。我画了个示意图,你看看就明白了:
工作过程其实很简单:
- 当REF上升沿先到,UP输出高电平
- 当FB上升沿先到,DN输出高电平
- 两个上升沿都到了,与门触发复位,UP和DN同时拉低
嗯,这里要注意:PFD不仅能检测相位差,还能检测频率差。这一点比单纯的鉴相器强多了。我记得刚入行时,有个老工程师跟我说:「PFD是PLL的耳朵和眼睛」,现在想想,这话一点不假。
3.2 死区问题与消除
死区,这玩意儿坑过不少人。什么是死区?就是当REF和FB的相位差非常小的时候,PFD输出脉冲太窄,窄到后面的电荷泵来不及响应。结果就是——PFD「看不见」这个小相位差,环路失去了调节能力。
- PLL锁定后相位噪声恶化
- 锁定精度下降,可能出现周期性抖动
- 严重时环路无法锁定
为什么会这样?你想想看,PFD输出的UP/DN脉冲宽度等于REF和FB的相位差。如果相位差只有几皮秒,脉冲宽度也就几皮秒。电荷泵里的开关管开启需要时间,这么窄的脉冲根本打不开开关管。
我在一个2.4GHz的PLL项目中就遇到过这个问题。当时仿真看着好好的,流片回来测相位噪声,发现有个奇怪的凸起。查了三天,最后发现是死区导致的。那叫一个郁闷啊。
消除死区的方法
最经典的做法就是——在复位路径上加延迟。让UP和DN脉冲都变宽一点,即使相位差为零,也保持一个最小脉冲宽度。这样电荷泵每次都能被充分开启。
在PFD的复位路径上插入延迟单元,通常用偶数个反相器串联实现。延迟时间一般取电荷泵开启时间的2-3倍。
代码实现大概是这样的:
// 带死区消除的PFD Verilog描述
module pfd_with_deadzone_elimination (
input wire ref_clk,
input wire fb_clk,
input wire rst_n,
output reg up,
output reg dn
);
reg ref_dly, fb_dly;
wire reset;
// 复位路径加延迟
assign #(DELAY_TIME) reset = ref_dly & fb_dly;
always @(posedge ref_clk or negedge rst_n) begin
if (!rst_n) ref_dly <= 1'b0;
else if (reset) ref_dly <= 1'b0;
else ref_dly <= 1'b1;
end
always @(posedge fb_clk or negedge rst_n) begin
if (!rst_n) fb_dly <= 1'b0;
else if (reset) fb_dly <= 1'b0;
else fb_dly <= 1'b1;
end
always @(*) begin
up = ref_dly & !reset;
dn = fb_dly & !reset;
end
endmodule
延迟时间不是越大越好。我见过有人为了保险,把延迟设得特别大,结果PFD的增益降低了,环路带宽也跟着变窄。一般取200ps到500ps比较合适,具体要看你的工艺和电荷泵设计。
3.3 PFD的线性模型
搞清楚了工作原理,咱们得把它抽象成数学模型,这样才能做系统级的分析。PFD的线性模型其实很简单,就一个增益因子:
KPFD = ICP / (2π)
其中ICP是电荷泵的充放电电流。这个公式怎么来的?我简单推导一下:
- PFD的输出是UP/DN脉冲,脉冲宽度正比于相位差Δφ
- 电荷泵把脉冲宽度转换成电流脉冲,平均电流 = ICP × (Δφ / 2π)
- 所以增益就是 ICP / (2π),单位是A/rad
说白了,PFD加电荷泵就是一个线性放大器,把相位差放大成电流信号。这个模型在PLL锁定状态下非常准确,因为相位差很小,PFD工作在线性区。
| 参数 | 符号 | 典型值 | 说明 |
|---|---|---|---|
| PFD增益 | KPFD | 80 μA/rad | ICP=500μA时 |
| 检测范围 | Δφmax | ±2π | 超过则进入非线性区 |
| 死区宽度 | Δφdead | < 0.1 rad | 消除后应远小于此值 |
| 工作频率 | fmax | 取决于工艺 | 通常可达数百MHz |
不过要注意,这个线性模型只在锁定状态下成立。在锁定过程中,尤其是频率捕获阶段,PFD实际上工作在非线性模式。那时候再用这个模型就不准了。我一般做系统仿真时,会先用线性模型算环路参数,再用行为级模型做瞬态验证,两边对照着看。
- PFD的增益由电荷泵电流决定,设计时先定ICP
- 死区消除的延迟时间要跟电荷泵匹配
- 线性模型适用于锁定状态分析,捕获过程要用非线性模型
- PFD的工作频率上限受限于复位路径的延迟
好了,关于PFD的核心内容就这些。我个人觉得,PFD设计的关键不在于电路有多复杂,而在于你理解它「为什么」会这样工作。死区问题、线性模型,这些都是实际项目中绕不开的坎。希望今天的内容对你有帮助。