第四章:频率生成与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深度没算对,导致数据丢失。嗯,这个后面讲跨时钟域设计时会细说。

多域时钟设计要点:

  1. 每个时钟域独立做门控,不要互相影响
  2. 分频器尽量用整数分频,避免小数分频带来的抖动
  3. 时钟树综合时,注意不同域的时钟偏斜
  4. 仿真时一定要跑多域协同的场景

好了,这一章的内容就到这里。PLL这东西,说起来简单,做起来全是坑。下一章咱们聊聊时钟树综合和低功耗时钟设计,那才是真正考验工程师功底的地方。

课后思考:

如果你要设计一个支持DVFS的PLL,你会怎么选择环路带宽?带宽太宽锁定快但噪声大,带宽太窄噪声小但锁定慢。这个权衡,你心里有数吗?


公众号:蓝海资料掘金营,微信deep3321