第四章:频率生成与PLL——锁相环基本原理
各位同学,咱们今天聊聊芯片里的“心脏起搏器”——锁相环。说白了,PLL就是用来产生稳定高频时钟的电路。你想想看,一个SoC里CPU跑2GHz,外设可能只需要100MHz,这些频率从哪来?总不能每个模块都挂个晶振吧?
PLL的核心思想,就是用一个低频的参考时钟(比如25MHz晶振),通过反馈控制,生成一个高频的、相位同步的时钟。我在项目中遇到过最头疼的事,就是PLL锁定时间太长,导致系统上电后要等半天才能工作。嗯,这个后面会细讲。
4.1 锁相环的基本架构
一个经典的电荷泵PLL,由五个基本模块组成:
- 鉴频鉴相器(PFD):比较参考时钟和反馈时钟的相位差
- 电荷泵(CP):把相位差转换成电流信号
- 环路滤波器(LF):滤除高频噪声,产生稳定的控制电压
- 压控振荡器(VCO):控制电压决定输出频率
- 分频器(Divider):把VCO输出分频后反馈回PFD
我习惯把PLL看成是一个“负反馈系统”。参考时钟是目标,VCO是执行器,PFD是误差检测器。环路一旦锁定,输出频率就是参考频率的N倍(N是分频比)。
关键公式:
Fout = N × Fref
其中N = 整数分频比 + 小数分频比(对于小数PLL)
4.2 VCO与分频器——PLL的“心脏”和“关节”
VCO是PLL里最敏感的模块。它的输出频率随控制电压变化,这个关系叫“调谐曲线”。理想情况下是线性的,但实际工艺偏差会导致曲线偏移。我曾经有一款芯片,因为VCO增益(Kvco)设计得太高,导致电源噪声直接调制到了输出时钟上,抖动惨不忍睹。
VCO主要有两种类型:
- 环形振荡器(Ring VCO):面积小、调谐范围宽,但相位噪声差
- LC振荡器(LC VCO):相位噪声好,但面积大、调谐范围窄
分频器呢?它负责把VCO的高频降下来。这里有个坑——分频器的功耗往往被低估。我记得有一次做低功耗设计,PLL本身只花了2mW,但后面的分频器链用了5mW。你想想看,这多冤啊。
个人经验:
做多频点输出时,尽量用可编程分频器,别每个频率都单独拉一条分频链。这样能省不少面积和功耗。
4.3 PLL锁定时间与抖动——性能的两大指标
锁定时间,就是PLL从启动到稳定输出目标频率所需的时间。这个参数对动态电压频率调整(DVFS)特别重要。你想啊,如果CPU要切频,PLL要等几十微秒才能锁定,那这段时间系统只能干等着。
影响锁定时间的因素:
- 环路带宽:带宽越宽,锁定越快,但噪声抑制变差
- 初始频率误差:VCO自由振荡频率离目标越远,锁定越慢
- 电荷泵电流:电流越大,锁定越快,但容易过冲
抖动呢,就是时钟边沿的不确定性。它分两种:
- 周期抖动(Period Jitter):相邻周期之间的偏差
- 长周期抖动(Long-term Jitter):长时间累积的相位偏差
我曾经踩过一个坑:芯片在实验室测出来抖动只有5ps,但量产时发现部分芯片抖动飙到了20ps。查了半天,原来是电源去耦电容的ESR(等效串联电阻)偏大,导致VCO的电源噪声没滤干净。从那以后,我设计PLL时一定会留出足够的去耦电容余量。
避坑指南:
我曾经因为PLL锁定时间没算对,导致DVFS切频时系统死机。后来我养成了一个习惯:在仿真时一定要跑“最差情况”的锁定时间——包括工艺角、温度、电压的极限组合。
4.4 FLL与DLL简介——PLL的“亲戚”们
除了PLL,还有两种常见的时钟生成电路:FLL和DLL。
FLL(锁频环):它只锁定频率,不锁定相位。结构比PLL简单,没有PFD,直接用频率比较器。好处是锁定快、面积小,但相位噪声差。我一般在不需要精确相位关系的场景用FLL,比如给数字模块提供粗略的时钟。
DLL(延迟锁相环):它锁定的是相位,不是频率。DLL不产生新频率,而是把输入时钟的相位做精确延迟。常用于DDR接口的时钟对齐、时钟去偏斜等场景。DLL的抖动比PLL小,因为它没有VCO那种振荡器噪声。
| 特性 | PLL | FLL | DLL |
|---|---|---|---|
| 锁定目标 | 频率+相位 | 频率 | 相位 |
| 输出频率 | 可倍频/分频 | 可倍频/分频 | 等于输入频率 |
| 抖动性能 | 中等 | 较差 | 较好 |
| 锁定时间 | 中等 | 快 | 快 |
| 典型应用 | CPU时钟、射频 | 低功耗SoC | DDR接口、时钟对齐 |
4.5 多域时钟生成——DVFS的“后勤保障”
现代SoC里,不同模块往往需要不同的时钟频率。比如CPU核跑2GHz,GPU跑1.5GHz,总线跑500MHz,外设跑100MHz。如果每个域都用独立的PLL,面积和功耗都受不了。
我常用的做法是:
- 一个主PLL:产生最高频率(比如2GHz)
- 多个分频器链:从主PLL分频出各个域需要的频率
- 门控时钟:不用的域直接关掉时钟,省功耗
但这里有个问题:不同域之间可能有异步接口,需要做同步处理。我见过一个设计,因为两个时钟域之间的FIFO深度没算对,导致数据丢失。嗯,这个后面讲跨时钟域设计时会细说。
多域时钟设计要点:
- 每个时钟域独立做门控,不要互相影响
- 分频器尽量用整数分频,避免小数分频带来的抖动
- 时钟树综合时,注意不同域的时钟偏斜
- 仿真时一定要跑多域协同的场景
好了,这一章的内容就到这里。PLL这东西,说起来简单,做起来全是坑。下一章咱们聊聊时钟树综合和低功耗时钟设计,那才是真正考验工程师功底的地方。
课后思考:
如果你要设计一个支持DVFS的PLL,你会怎么选择环路带宽?带宽太宽锁定快但噪声大,带宽太窄噪声小但锁定慢。这个权衡,你心里有数吗?
公众号:蓝海资料掘金营,微信deep3321