Banerjee PLL瞬态响应与稳定性分析

本文基于 Dean Banerjee PLL Performance Simulation and Design 深度解析 第 16-19 章提炼,涵盖 PLL 频率合成器瞬态响应与锁定时间计算、PFD 离散采样效应对锁定时间的影响、Routh-Hurwitz 稳定性判据在 PLL 中的应用以及完整 PLL 分析实例。


前后关系

前置知识:

本书内部链条:

  • Ch.16-19(本文)→ Ch.27 (相位裕度选择对瞬态响应的影响)
  • → Ch.28 (FastLock 与 Cycle Slip 减少技术)
  • Ch.17 (离散采样效应) ← Ch.3 (PFD 连续时间近似)

Ch.16: Transient Response of PLL Frequency Synthesizers

二阶模型锁定时间公式推导

Banerjee 从 PLL 二阶闭环传递函数出发推导锁定时间。闭环传递函数为(假设二阶环路滤波器):

其中 为自然频率, 为阻尼因子。

关键发现:锁定时间 — 环路带宽越宽,锁定越快。

完整推导

频率阶跃 作用下,频率误差的时域响应为:

包络近似为 。令 得锁定时间:

当 在 范围内时(对应 ),可以进一步简化为:

推导链:,即环路带宽和相位裕度完全决定了锁定时间。

频率阶跃与相位阶跃的瞬态响应差异

激励类型响应特征锁定时间差异物理含义
频率阶跃 为减幅振荡 + 指数衰减包络频率差越大锁定越慢
相位阶跃 为减幅振荡大相位跳变锁定更快
同时跳变两者叠加以频率阶跃为瓶颈实际工程中频率跳变是主要关注点

锁定时间与 、、 的三维关系

变量对 的影响定量关系
↑ ↓(双倍带宽→半速锁定)
↑ ( ↑) 先↓后↑最优 ()
↑ ↑(非线性的弱依赖)
tol ↓(更严格) ↑

工程图景:锁定时间对 最敏感,对 较不敏感(对数关系)。这就是为什么使用 FastLock 展宽带宽比使用 CSR 更有效。

四阶模型

对四阶环路滤波器,锁定时间分析需要考虑更多极/零点的影响。Banerjee 的四阶模型测量误差约 10-20%,足够工程使用。四阶模型的关键修正:

即附加极点 T3、T4 会降低有效自然频率,增加锁定时间。

相位裕度与过冲

  • 相位裕度越低 → 过冲越大 → 锁定时间可能因 VCO 超出调谐范围而延长
  • 推荐相位裕度范围:40-55°

瞬态响应公式

二阶模型瞬态响应中的频率误差 :

其中 为自然频率, 为阻尼因子。

影响锁定时间的实际因素

  • VCO 与电荷泵非线性:频率跳变时约 1/3 步长的过冲可能超出 VCO 调谐范围
  • VCO 输入电容:与邻近电容并联,减小环路带宽,增加锁定时间
  • 电容介质吸收:NP0/薄膜电容性能好,X7R 可能使锁定时间翻倍甚至更久
  • PFD 离散采样效应:Fcomp 在 10-100 倍环路带宽范围内影响不大,超出则需离散模型

Ch.17: Impact of PFD Discrete Sampling Effects on Lock Time

离散模型适用范围

连续时间近似在 范围内有效。当 (常见于分数 N PLL 的高 Fcomp 场景)时,需要离散模型。

离散模型方法

  1. 定义各电容端电压
  2. 推导微分方程
  3. 转换为差分方程
  4. 以小时时间步长迭代求解

Z 域离散模型的完整数学处理

离散模型的严格数学基础是 Z 变换。PFD 以 为单位周期采样,使 PLL 成为采样数据系统。

PFD 采样后的开环传递函数:

在 Z 域中,等效离散开环传递函数为:

其中 项来源于 PFD 的零阶保持(ZOH)特性——电荷泵在每个参考周期输出一个固定的校正电流脉冲。

闭环 Z 域传递函数:

s-z 变换方法对比:

变换方法映射关系 精度PLL 适用性
脉冲不变法时域脉冲响应匹配适合瞬态分析
双线性变换(Tustin)频域匹配好适合频域分析
ZOH 法含 项匹配实际 PFD 输出特性首推——准确建模 PFD 采样

ZOH 法下的 PLL 开环传递函数(以二阶被动滤波器为例):

离散 vs 连续模型的偏差定量:

  • 当 (分数 N PLL 典型场景):连续模型过估计锁定速度
  • 当 :偏差 ,连续模型良好
  • 当 :接近稳定性边界,必须使用离散模型

Z 域根轨迹分析

离散系统的稳定性由 的特征根在 Z 平面上的位置决定:稳定条件为所有极点位于单位圆内()。

与 s 平面连续系统的对应:

  • 平面左半平面 → Z 平面单位圆内
  • 平面虚轴()→ Z 平面单位圆
  • 阻尼因子 映射为 Z 域极点的径向位置

Z 域稳定性判据:

  • 若特征方程的最大根的模 则离散 PLL 稳定
  • 时对应连续系统
  • 越接近 1,相位裕度越小

Cycle Slip 导致的锁定时间退化

当比较频率远大于环路带宽()时,PFD 的单位增益带宽受限,大频率误差时 PFD 处于非线性区,发生 cycle slipping,显著延长锁定时间。

Cycle Slip 的定量判定准则

频率跳变 导致 cycle slip 的条件:

工程简化准则:当 时,必然发生至少一次 cycle slip。

Cycle Slip 次数估算:

典型 额外锁定时间增加

避免 Cycle Slip 的设计方法:

  1. CSR 技术(Ch.28 详细展开)
  2. 渐进式频率逼近(multi-step switching)
  3. 增大 使 降低
  4. 增加 使 增加

离散模型 vs 连续模型

  • 连续模型:计算快,适合初期设计
  • 离散模型:精度高,适合最终验证(特别是分数 N PLL 场景)

离散模型的数值化 PFD 采样算法

Banerjee Ch.17 提出了考虑 PFD 离散采样效应的锁定时间修正算法,在 (低频比较率)时,连续模型误差显著增大,必须使用离散模型。

时域仿真步长选择:

  • 每参考周期至少 10 个仿真点在 上,才能准确捕获 PFD 脉冲波形
  • 典型选择:(仿真精度和速度的平衡)

PFD 离散采样的数值实现算法:

在每个参考周期 结束时,执行以下步骤:

1. 计算相位差:Δθ[n] = θ_ref[n] - θ_div[n]
   → 归一化到 [-π, π] 范围

2. 判断 cycle slip:
   if |Δθ[n]| > π:
     实际 Δθ_eff[n] = 2π - |Δθ[n]|,并标记 slip 发生
   else:
     Δθ_eff[n] = Δθ[n]

3. PFD 输出电荷泵脉冲宽度:
   t_pulse[n] = (Δθ_eff[n] / (2π)) · T_comp

4. 将 t_pulse[n] 注入滤波器微分方程求解:
   在 [nT_comp, nT_comp + t_pulse] 期间,
   I_cp = Kϕ · sign(Δθ_eff[n])
   在其余时间,I_cp = 0(高阻态)

5. 更新滤波器状态(使用 RK4 或梯形积分):
   V_tune[n+1] = F(V_tune[n], I_cp(t))

6. 更新 VCO/VCO 分频器:
   θ_vco[n+1] = θ_vco[n] + 2π · T_comp · [f_0 + K_vco · V_tune[n]]
   θ_div[n+1] = θ_vco[n+1] mod (2π · N)

7. 判断锁定:
   if |Δθ_eff[n]| < θ_lock_threshold 持续 M 个周期 → 锁定

离散模型与连续模型的偏差对照表(,滤波器类型三阶):

锁定时间(连续)锁定时间(离散)偏差必须用离散模型?
s s无需
s s可选
s s推荐
s s必须
s s必须

PFD 采样导致的极限环(Limit Cycle):

当 PFD 采样率过低( 接近 ),PFD 输出脉冲的时间分辨率不足,会在 VCO 调谐端产生极限环振荡:

  • 极限环频率:(其中 为使 最小的整数)
  • 极限环对杂散的贡献:
  • 工程规避:保持 可避免大部分极限环问题

锁定时间修正因子表(Banerjee Ch.17 Fig.17.4 数字化):

修正因子乘以连续模型锁定时间即为考虑离散采样效应后的实际锁定时间。

工程设计规则:

  1. 若 :可安全使用连续模型(偏差 )
  2. 若 :连续模型结果需乘以修正因子(偏差 )
  3. 若 :必须使用离散模型进行最终验证
  4. 分数 N PLL 场景中,离散效应更为显著,建议在所有 时使用离散模型

离散采样导致的相位裕度(PM)退化模型

PFD 的离散采样效应不仅延长锁定时间,还会降低环路的有效相位裕度。这是由采样数据系统的 Z 域极点位置与连续 s 域极点位置之间的固有偏差引起的。

PM 退化的物理机理:

  • 连续时间模型中,PFD 被近似为增益 ,忽略其零阶保持(ZOH)特性
  • 零阶保持引入等效的 延迟:
  • 该延迟在 处引入的附加相移为: [rad]

PM 退化定量公式:

退化对照表(假设设计 PM = 48°):

ZOH 附加相移有效 PM 稳定性裕度工程评估
100充足可忽略(连续模型 OK)
50良好微降,补偿可选
20边界⚠️ 需在设计 PM 中预留补偿
10不足❌ 必须使用离散模型精确分析
5极差❌ 可能不稳定,离散模型强制

PM 退化的时域表现:

  • 过冲增加:,其中
  • 锁定时间因过冲展宽而额外增加
  • VCO 调谐端出现极限环振荡的可能性增大

工程设计补偿方法:

  1. PM 预算预留法:设计目标 PM 设为
    • 实例:若要求 ,,则设计 PM 应为 (对应 )
  2. 离散模型验证法:用 Z 域根轨迹确认 作为稳定判据
  3. 保守设计法:保持 以确保 ZOH 相移

当 PM 退化不可接受时的应对策略:

场景推荐对策代价
固定(芯片选型已定)设计 PM 增加 锁定时间延长
可调整 增大 (增大比较频率)N 值减小,带内相噪改善;但 PFD 噪声增大
可调整 降低 VCO 相噪恶化,锁定时间延长
需极低 使用离散域根轨迹直接设计(Z 域)设计复杂度大幅增加

Gamma 离散采样(ZOH)退化补偿模型

离散采样效应不仅降低有效 PM,还通过改变零阶保持传递函数改变了 Gamma 优化的有效性。以下建立 ZOH 下 Gamma 的修正模型。

ZOH 引入的有效 Gamma 退化

连续时间模型中 Gamma 定义为 ,其有效性基于 的假设。当 不够大时,ZOH 引入的相移使有效 Gamma 降低:

γ 的 ZOH 退化表:

ZOH 相移γ 退化因子有效 γ(设计 γ=0.12)等效 PM 退化
1000.99950.120
500.9980.1196
300.9950.1194
200.9880.1186
150.9790.1175
100.9530.1144

针对 ZOH 的 γ 预补偿公式

为了在离散效应存在的条件下恢复目标相位裕度,需对设计 Gamma 进行预补偿:

预补偿后的有效 PM 恢复:

目标 补偿 补偿前 补偿后 改善
200.120.12239.0°47.5°
150.120.12536.0°46.8°
100.120.13230.0°45.0°
80.120.14024.0°42.5°

关键结论:当 时,通过预先增大 γ 来补偿 ZOH 相移,可将有效 PM 恢复至设计目标的 范围内。但当 时,γ 补偿的边际效益递减,必须使用离散域模型。

ZOH 补偿 γ 的工作流

目标 PM: φ_target
↓
计算连续域 γ_cont = PM→γ 映射(查表)
↓
计算 ZOH 退化因子 D = [1 + (π·Fc/Fcomp)²/2]
↓
γ_comp = γ_cont / D
↓
边界检查:
  ├── γ_comp < γ_max(受泄漏杂散限制)?
  ├── γ_comp > γ_min(受脉冲杂散/锁定时间限制)?
  └── 若超出边界 → 需降低 Fc 或增加 Fcomp
↓
按 γ_comp 执行 5 步设计法
↓
仿真验证有效 PM = PM_design - Δϕ_ZOH(γ_comp)

工程建议总结

场景Fcomp/Fc是否需要 γ 补偿建议操作
安全区域否连续域 γ 直接使用
过渡区域10-20是(简单补偿)γ_comp = γ × [1 + 0.5·(π·Fc/Fcomp)²]
警告区域5-10是(需谨慎)γ_comp + 离散仿真双重验证
危险区域补偿失效改用 Z 域设计,放弃连续 γ 方法

Ch.18: Routh Stability for PLL Loop Filters

Routh-Hurwitz 稳定性判据

将闭环传递函数的特征方程写成 的形式,通过 Routh 阵列判断是否存在右半平面极点。

在 PLL 中的应用

  • 二阶系统:所有系数 > 0 即稳定
  • 三阶系统:需满足
  • 四阶系统:Routh 阵列表征更多的交叉约束

滤波器阶数选择

Routh 判据提供了滤波器阶数选择的指导——更高阶滤波器虽然杂散抑制更好,但稳定性约束更严格,设计空间更小。

完整 Routh 阵列数值示例(三阶 PLL)

以下展示一个完整的三阶 PLL 系统的 Routh-Hurwitz 稳定性分析,涵盖特征多项式系数提取、Routh 阵列构造、符号判断和稳定性结论。

系统参数

沿用 Ch.19 的 LMX2315 设计实例参数:

  • mA, MHz/V,
  • 三阶被动滤波器: pF, nF, kΩ, kΩ, nF
  • kHz,

Step 1:建立开环传递函数

三阶被动滤波器的阻抗:

其中 ,,。

代入数值:

  • s
  • s
  • s

开环传递函数:

Step 2:建立闭环特征方程

闭环特征方程:

分母展开得:

代入数值后展开为四次多项式:

其中:

完整特征方程:

Step 3:构造 Routh 阵列

标准 Routh 阵列格式(4 阶系统,):

计算各元素:

完整 Routh 阵列:

Step 4:稳定性判断

行数值符号
+
+
+
+
+

结论:第一列全部为正 → 特征方程所有根的实部为负 → 系统稳定 ✅

Step 5:参数变化对稳定性的影响

参数变化特征方程系数影响Routh 阵列变化稳定性结论
(25mA) 可能变负⚠️ 需重新验证
(7.5nF), 增大 减小可能跨零⚠️ 可能不稳定
(50kΩ), 增大同 增大⚠️ PM 降低
去掉 C3(降为二阶)退化为一阶阵列✅ 必然稳定

临界增益分析:设 为变量,,。当 时出现临界稳定:

代入数值: mA

工程含义:电荷泵电流超过 mA 时,此三阶 PLL 设计进入不稳定区(对应 展宽过多)。这就是 Routh 判据在 PLL 设计中最重要的应用——确定稳定工作的参数边界。

Routh-Hurwitz 稳定性边界设计规则

  1. 二阶 PLL: 退化为所有系数 ,无条件稳定(只要元件值正)
  2. 三阶 PLL:稳定边界由 决定,设计时留 余量
  3. 四阶 PLL:Routh 阵列第一列可能出现多次符号变化,需全部检查正负
  4. 温漂影响:全温范围内系数变化后,重新计算 Routh 阵列确认第一列符号不变

Ch.19: A Sample PLL Analysis

完整分析流程

  1. 确定设计指标:输出频率范围、信道间隔、相位噪声要求、杂散要求、锁定时间
  2. 选择 PLL 芯片:根据频率范围、N 值范围、电荷泵电流等
  3. 选择 VCO:调谐范围、增益 、相位噪声性能
  4. 设计环路滤波器:
    • 确定环路带宽和相位裕度
    • 计算滤波器系数 A0/A1/A2/A3
    • 反推元件值
  5. 性能验证:
    • 计算理论相位噪声并与指标对比
    • 计算理论杂散水平
    • 计算理论锁定时间
  6. 仿真迭代:调整设计参数满足所有指标

设计中的权衡(源自实例)

  • 相位噪声 vs 锁定时间:环路带宽的关键选择
  • 杂散 vs 锁定时间:滤波器阶数的权衡
  • 功耗 vs 性能:电荷泵电流的选择

Ch.19 完整多轮迭代设计实例

以下实例展示 Banerjee Ch.19 中从规格到收敛的完整迭代设计过程(基于 LMX2315PLL,LMX2315 数据手册参数)。

初始规格

参数值
1960 MHz
50 kHz(, MHz)
39200
5 mA
30 MHz/V
锁定时间 ms(至 kHz)
参考杂散 dBc @
相位噪声 dBc/Hz @ 10 kHz offset

迭代 1——二阶滤波器、保守设计

步骤参数值
1选择 kHz,保守带宽确保稳定性
2 rad/s
3 s
4 s
5
6 F
7 nF, nF, k
8验证锁定时间: ms(不满足 ms)需调整

迭代 2——增大带宽、加快锁定

步骤参数值
1增大 kHz,保持 带宽扩大
2 rad/s
3 s
4 s(二次求解)需要注意 合理性
5 F(nF, nF, k)
6验证锁定时间: ms(满足 ms)锁定时间 OK
7验证参考杂散:SpurGain dB,估算杂散 dBc不满足 dBc

迭代 3——升级滤波器阶数改善杂散

步骤参数值
1保持 kHz,
2从二阶升级为三阶主动滤波器添加 R3-C3 附加极点
3选择 s典型值
4nF, nF, k, k, nF
5杂散抑制改善: dB
6验证杂散: dBc(满足 dBc)杂散 OK
7验证相位噪声:kHz 下 VCO 贡献 dBc/Hz @10kHz满足 dBc/Hz

最终设计收敛

经过三次迭代后设计收敛,所有指标满足规格:

  • 锁定时间: ms ✓
  • 参考杂散: dBc ✓
  • 相位噪声: dBc/Hz @10kHz ✓
  • 滤波器类型:三阶被动,元件值:pF, nF, k, k, nF(标准值)

迭代收敛的判断准则:

  1. 核心不等式:(锁定时间满足规格)
  2. 核心不等式:(杂散满足规格)
  3. 核心不等式:(相位噪声满足规格)
  4. 以上三个不等式的同时满足即为设计收敛

关键经验:

  • 锁定时间不满足 → 增大 (代价:杂散、噪声恶化)
  • 杂散不满足 → 增加滤波器阶数(代价:锁定时间延长、稳定性降低)
  • 噪声不满足 → 调整 平衡 VCO vs PFD 噪声贡献

高阶环路滤波器的锁定时间校正公式

二阶模型在设计三阶/四阶环路滤波器时存在系统偏差。Banerjee 在 Ch.16 中讨论了通过校正因子将二阶锁定时间公式拓展到高阶滤波器的方法。

三阶滤波器的锁定时间校正

三阶被动滤波器在二阶基础上增加了一个极点 ,该额外极点使锁定时间延长:

校正因子的物理机理:额外极点 降低了相位裕度的高频贡献,使 PLL 的瞬态过冲增大→稳定时间延长。

比值典型场景锁定时间校正系数二阶模型误差
三阶以杂散抑制为主()可忽略
标准三阶设计()一般可接受
高阶杂散抑制优先()⚠️ 需校正
三阶主导(不稳定风险)❌ 二阶模型无效

适用条件:,且相位裕度 。

四阶滤波器的锁定时间校正

四阶滤波器有两个额外极点 ,锁定时间延长更显著:

典型场景锁定时间校正系数二阶模型误差
宽松杂散要求可忽略
标准四阶设计一般可接受
严格杂散要求⚠️ 显著需校正
极严格杂散抑制❌ 需完整四阶模型

相位裕度对校正因子的影响

相位裕度越低,额外极点对锁定时间的惩罚越大:

时 时

工程规则:

  1. 当 且 时,二阶模型的锁定时间估算已足够精确(误差 )
  2. 高于此阈值时,必须使用校正公式或将锁定时间仿真工具切换至相域(L2)仿真
  3. 校正公式的适用范围:,超出此范围需使用完整模型
  4. 对锁定时间预算紧张的设计,建议在 时直接使用相域仿真(L2)而非公式估算

锁定时间瞬态仿真与 Cycle Slip 观测方法

Banerjee 在 Ch.19 中强调了解析公式锁定时间估算与仿真验证的互补关系——解析公式提供快速设计空间探索,仿真则捕获公式中忽略的非理想效应。以下是系统化的瞬态仿真设置、锁定判据实现和 Cycle Slip 观测方法。

瞬态仿真设置

仿真时间选择

设计阶段仿真总时间步长适用工具
架构探索Python/Matlab 行为模型
电路级验证Spectre/Titan
签核仿真Spectre RF(含寄生)

仿真加速技巧

技巧1:渐进式精度仿真

# Python 行为模型:快速锁定时间探索
import numpy as np
 
def pll_lock_time_sim(Fc, Fcomp, Kphi, Kvco, N, A0, A1, T2, T3, zeta, f_step):
    """
    基于 Banerjee Ch.19 传递函数的锁定时间快速仿真
    返回 1% 精度锁定时间(秒)
    """
    # 计算连续时间传递函数参数
    wn = 2 * np.pi * Fc * 2 * zeta / np.sqrt((1 + 2*zeta**2)**2 - 1)
    
    # 频率阶跃响应仿真
    fs = Fcomp * 10  # 仿真采样率
    T = 3000 / Fc    # 仿真总时长
    n = int(T * fs)
    t = np.linspace(0, T, n)
    
    # VCO 频率响应(二阶近似 + 三阶校正)
    s = 1j * 2 * np.pi * np.fft.fftfreq(n, 1/fs)
    H = Kphi * Kvco * (1 + s*T2) / (s * N * (A0 + A1*s) * (1 + s*T3))
    CL = H / (1 + H/N)
    
    # 频率阶跃响应
    f_step_fft = f_step / (1j * 2 * np.pi * s)  # 阶跃的 FFT
    f_out = np.real(np.fft.ifft(CL * f_step_fft))
    
    # 锁定检测(1% 精度)
    f_target = f_out[-1]
    f_error = abs(f_out - f_target) / f_target
    idx_lock = np.where(f_error < 0.01)[0]
    lock_time = t[idx_lock[0]] if len(idx_lock) > 0 else T
    
    return lock_time

技巧2:多阶段仿真策略(节省 仿真时间)

Phase 1: 粗略仿真(tran maxstep = 1/Fcomp/5)
  目的:确认 PLL 能锁定,粗略估计锁定时间
  时间:200/Fc
        ↓
Phase 2: 精确仿真(tran maxstep = 1/Fcomp/50)
  目的:提取精确锁定时间 + 稳定裕度
  起始:Phase 1 锁定时间 - 50/Fc  → 锁定后 + 200/Fc
  时间:250/Fc
        ↓
Phase 3: 条件覆盖仿真
  目的:PVT 角/频率步进量变化下的锁定时间分布
  使用 Phase 2 的设置,全 PVT 角 + 三个频率步进量

锁定判据的仿真实现

三种锁定判据及其仿真检测方法

判据类型定义仿真检测方法典型阈值
频率锁定$f_{out} - f_{target}< f_{tol}$
相位锁定$\phi_{ref} - \phi_{div}< \phi_{tol}$
稳定测量 斜率(窗口平均) mV/s

频率锁定检测 —— 过零检测法(最常用)

; 频率锁定检测 Ocean Script
; 使用 VCO 输出的过零检测提取瞬时频率
 
% VCO 输出信号
vco_out = v("/out" ?result "tran")
 
% 过零检测:找到 VCO 信号跨越 0 的时刻
crossings = cross(vco_out 0.0 1 "rising" nil nil nil)
 
% 计算瞬时频率(相邻过零时间的倒数)
if(length(crossings) > 1 then
  period = (crossings[1:length(crossings)-1] - crossings[0:length(crossings)-2])
  freq_inst = 1.0 / period
  time_inst = crossings[1:length(crossings)-1]
  
  % 计算频率误差
  freq_error = abs(freq_inst - freq_target) / freq_target
  
  % 锁定时间检测(1% 频率精度阈值)
  lock_idx = find(freq_error < 0.01)
  if(lock_idx then
    lock_time = time_inst[lock_idx[0]]
    printf("Lock time (1%% freq): %.2f us\n" lock_time*1e6)
  else
    printf("No lock detected within simulation time\n")
  )
)

多判据联合锁定检测(更可靠)

# Python 多判据联合锁定检测
import numpy as np
 
def detect_lock_multicriteria(t, vtune, f_vco, Fcomp, Fc):
    """
    联合频率 + Vtune 稳定判据的锁定时间检测
    
    Parameters:
    - t: 时间轴 (s)
    - vtune: VCO 调谐电压 (V)
    - f_vco: VCO 瞬时频率 (Hz)
    - Fcomp: 比较频率 (Hz)
    - Fc: 环路带宽 (Hz)
    
    Returns:
    - lock_time: 锁定时间 (s),未锁定返回 None
    - lock_type: 锁定判据类型
    """
    
    # 判据 1:频率精度(1% of final frequency)
    f_target = f_vco[-1]
    freq_err = np.abs(f_vco - f_target) / f_target
    
    # 判据 2:Vtune 斜率(稳定检测)
    dt = t[1] - t[0]
    vtune_slope = np.abs(np.gradient(vtune, dt))
    vtune_stable = vtune_slope < (1e-3 / (1/Fc))  # < 1mV 每 Fc 周期
    
    # 联合判据(两种判据同时满足)
    lock_mask = (freq_err < 0.01) & vtune_stable
    
    if np.any(lock_mask):
        lock_idx = np.where(lock_mask)[0][0]
        return t[lock_idx], "combined"
    
    # 回退到仅频率判据
    freq_lock = np.where(freq_err < 0.01)[0]
    if len(freq_lock) > 0:
        return t[freq_lock[0]], "freq_only"
    
    return None, "no_lock"

Cycle Slip 的仿真观测

Cycle Slip 发生在频率捕获阶段,PFD 输出无法跟踪相位差导致分频器计数器溢位。仿真中可通过以下方法观测。

PFD 输出观测法

直接观测 PFD 的 UP/DN 输出脉冲序列,Cycle Slip 的特征是连续多个参考周期的同向(全 UP 或全 DN)脉冲:

; 瞬态仿真设置(大步长快速仿真 + Cycle Slip 观测窗口细化)
; 频率捕获阶段(t < 50/Fc)使用细步长
.dc op
 
tran \
  tstop=500/Fc \
  \% Cycle Slip 观测窗口(频率捕获阶段)
  maxstep=1/Fcomp/20 \
  \% 锁定后可以放宽步长(稳态跟踪阶段)
  watch=[
    I(UP:out)   % PFD UP 输出
    I(DN:out)   % PFD DN 输出
    V(vtune)    % VCO 调谐电压
  ]

Cycle Slip 数量统计脚本:

; 统计 Cycle Slip 数量
up = v("/UP" ?result "tran")
dn = v("/DN" ?result "tran")
 
% 检测 UP 和 DN 脉冲
up_pulses = length(cross(up Vdd/2 1 "rising" nil nil nil))
dn_pulses = length(cross(dn Vdd/2 1 "rising" nil nil nil))
 
% Cycle Slip 次数 ≈ (UP 脉冲数 - DN 脉冲数) 的累计净差
% 更精确:检测连续 3 个以上同向脉冲
slip_count = 0
for(i 1 length(up_pulses)-2
  if(up_pulses[i] < dn_pulses[i] && up_pulses[i+1] < dn_pulses[i+1] && up_pulses[i+2] < dn_pulses[i+2]
    slip_count++
  )
)
printf("Cycle Slips: %d\n" slip_count)

相位误差直接观测法(更直观)

使用 Verilog-A 行为模型直接输出 PFD 输入端的瞬态相位差:

// 相位差观测器(理想的相位检测器,用于观察 Cycle Slip)
module phase_diff_monitor (ref, div, phi_err);
  input ref, div;
  output phi_err;
  electrical ref, div, phi_err;
  
  real t_ref_last, t_div_last;
  real phi_ref, phi_div, phi_diff;
  
  analog begin
    @(cross(V(ref) - Vdd/2, 1))
      phi_ref = phi_ref + 2*`M_PI;
    
    @(cross(V(div) - Vdd/2, 1))
      phi_div = phi_div + 2*`M_PI;
    
    phi_diff = phi_ref - phi_div;
    
    // Cycle Slip 判定:相位差累积超过 2π
    if (phi_diff > 2*`M_PI) begin
      $strobe("Cycle Slip detected at t=%0.2f us, phi_diff=%0.1f deg", 
              $realtime()/1e-6, phi_diff*180/`M_PI);
    end
    
    V(phi_err) <+ phi_diff;
  end
endmodule

锁定时间仿真验证清单

检查项要求验证方法
多频率步进覆盖 = MHz, MHz, MHz每种步进量各仿真一次
PVT 角覆盖TT/FF/SS + 9 组仿真(3 工艺 × 3 温度)
锁定判据一致性频率判据 vs 判据偏差 提取两种判据的锁定时间对比
与解析公式偏差(二阶),(三阶以上)仿真锁定时间 vs (16.52) 计算值
Cycle Slip 数量与 Banerjee 图 16.8 的趋势一致统计频率捕获阶段同向脉冲数

PLL 仿真步长选择与精度控制的系统化规则

PLL 仿真面临的根本挑战是时标跨度矛盾 —— 锁定时间量级为 而 VCO 周期量级为 ,两者相差 倍。以下是系统化的步长选择和精度控制规则。

时标分层与步长选择规则

三层时标划分

┌─ Micro 层(VCO 周期级:ps - ns)── 决定仿真精度下限 ───┐
│  约束条件:maxstep ≤ min(1/(20*Fout), ESR*C/10)       │
│  影响:VCO 波形失真、过零检测精度                      │
└──────────────────────────────────────────────────────┘
                          ↓
┌─ Meso 层(参考周期级:ns - μs)── 决定环路交互精度 ──┐
│  约束条件:maxstep ≤ 1/(20*Fcomp)                      │
│  影响:PFD/CP 开关动作捕获、离散采样效应              │
└──────────────────────────────────────────────────────┘
                          ↓
┌─ Macro 层(锁定时间级:μs - ms)── 决定仿真总时长 ─┐
│  约束条件:tstop ≥ 1000/Fc(锁定时间有足够余量)      │
│  影响:能否观察到锁定完成、频率突跳响应               │
└──────────────────────────────────────────────────────┘

步长选择表

仿真阶段建议步长物理意义网格点数()
频率捕获期捕获 VCO 每个周期约 50 个点500M 点(需分段仿真)
相位捕获期每个参考周期 20 个点10M 点
跟踪稳定期每个环路时间常数 5 个点25K 点
后锁定静态每个环路时间常数 1 个点5K 点

分段仿真策略:不应对整个仿真使用统一步长。将仿真分为 2-3 段,每段使用不同的最大步长,可节省 的仿真时间。

仿真收敛判据与质量检核

Spectre 仿真器收敛参数设置

// 收敛与精度参数推荐设置
simulator lang=spectre
 
// PLL 瞬态仿真收敛控制
options \%
  reltol=1e-6      % 相对误差容限(默认 1e-3,PLL 需更精确)
  vabstol=1e-9     % 电压绝对误差(默认 1e-6)
  iabstol=1e-15    % 电流绝对误差(默认 1e-12)
  method=traponly  % 积分方法(GEAR2 更稳定但更慢)
  lteratio=1e-12   % LTE ratio(局部截断误差控制)
  maxiters=1000    % 每个时间点的最大 Newton 迭代数
  
  % PLL 特定的精度控制
  maxstep=1/(20*Fcomp)  % 最大步长
  cmin=1e-18            % 最小电容(防止收敛假象)

仿真质量检核表

检查项Pass 判据检查方法
LTE 检查lteratio 无明显峰值仿真日志中搜索 “lte ratio”
Newton 收敛maxiters 未触发( 时间点)仿真日志中搜索 “Newton iterations”
能量守恒 积分稳定计算总功耗随时间的变化是否小于
步长自适应无步长缩减至 的情况检查步长分布直方图
时间点密度Macro 层每个 周期至少 3-5 个点tstep 输出控制

仿真设置质量与速度的量化评估

不同仿真档位的精度-速度权衡

档位maxstepreltollteratio相对精度仿真时间(5ms 总时长)
L1 快速探索 min
L2 标准验证 min
L3 精确签核 hr
L4 后仿签核 hr

步长选择实例( GHz, MHz, kHz)

L1 快速($< 1$ 分钟):
  tstop = 50 μs (4 个 Fc 周期)
  maxstep = 5 μs
  → 约 10 个时间点

L2 标准($10-30$ 分钟):
  tstop = 500 μs
  maxstep = 1 ns (= 1/(20 * Fcomp))
  → 约 500,000 个时间点

L3 精确($1-6$ 小时):
  tstop = 5 ms
  maxstep 分段:
    0-50μs: 1/(50*Fout) ≈ 8.3 ps
    50-200μs: 1/(20*Fcomp) = 1 ns
    200μs-5ms: 1/(5*Fc) = 1 μs
  → 约 6M 个时间点

常见仿真步长问题诊断

错误症状根因修复方案
VCO 波形严重失真(非正弦)maxstep 大于 VCO 周期的 1/10减小 maxstep 至
锁定时间远长于解析预测()步长 → 数值阻尼 → PFD 开关动作被平滑使用分段步长,捕获期极细步长
Cycle Slip 未被检测到步长过大 → PFD 的 UP/DN 窄脉冲被跳过步长
仿真不收敛 / 时间点不前进存在刚性电路(大 R 和大 C)或反馈回路使用 gear2only 方法 + cmin=0
曲线异常平滑无抖噪reltol 过松 → 热噪声被抑制reltol=1e-6 + noise 选项

Ch.19 迭代设计的仿真验证闭环

Banerjee Ch.19 的迭代设计流程(图 19.1)明确将仿真验证作为设计的最终环节。以下给出 Ch.19 标准设计流程中各阶段对应的仿真验证方法。

仿真验证与迭代设计流程的映射

┌─ Step 1: 规格定义 ──────────────────────────────────┐
│  Fout, Fcomp, Fc, φ, Kphi, Kvco, 噪声/杂散指标     │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 2: 环路滤波器系数计算(A0-A3, T2-T4)────┐
│  仿真验证: PSS+PAC 开环增益/相位 → 确认 Fc, φ    │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 3: 锁定时间估算(Ch.16 公式)───────────────┐
│  仿真验证: 瞬态仿真 → 锁定时间 + Cycle Slip 数量   │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 4: 噪声/杂散预算检查(Ch.14-15/11-13)───┐
│  仿真验证: PSS+PNOISE → 相噪曲线 + RMS jitter      │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 5: PVT 鲁棒性检查(Ch.19 核心)─────────────┐
│  仿真验证: 多角瞬态仿真 → 最坏情况锁定时间/稳定性 │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 6: 非理想性评估 ──────────────────────────────┐
│  Cycle Slip, 死区, CP 失配, 泄漏, 寄生极点         │
│  仿真验证: 含非理想性的综合瞬态仿真                 │
└─────────────────────────────────────────────────────┘
       ↓
┌─ Step 7: 后仿签核 ──────────────────────────────────┐
│  RC 寄生提取 → 最坏角仿真 → 匹配 Step 2-6 所有检查 │
└─────────────────────────────────────────────────────┘

各步骤的仿真验证脚本

Step 2 验证:开环增益/相位确认

# Python:从瞬态仿真结果提取 Fc 和 φ
import numpy as np
from scipy import signal
 
def extract_fc_phi_from_sim(time, vtune_signal, Fcomp, Kphi, Kvco, N):
    """
    从 Vtune 波形提取开环的穿越频率和相位裕度
    """
    # Vtune 的功率谱密度
    fs = 1.0 / (time[1] - time[0])
    f, psd = signal.welch(vtune_signal, fs, nperseg=min(8192, len(time)))
    
    # 找到功率下降速度最快的频率点 → 近似的开环穿越
    # 实际应使用 PSS+PAC 直接提取
    psd_log = 10 * np.log10(psd + 1e-20)
    rolloff = np.diff(psd_log) / np.diff(np.log(f[1:]))
    
    # 识别穿越频率附近(-20dB/decade → -40dB/decade 转变点)
    fc_idx = np.argmin(np.abs(f[1:-1] - 2*np.pi*Fc))
    
    return f[fc_idx], None  # 实际 φ 需 PSS+PAC 提取

Step 5 验证:PVT 角仿真脚本

; PVT 角自动化仿真脚本(Ocean)
; 覆盖 3 工艺角 × 3 温度 = 9 组
 
corners = list(
  list("TT_27C" "tt" 27)
  list("FF_27C" "ff" 27)
  list("SS_27C" "ss" 27)
  list("TT_m40C" "tt" -40)
  list("FF_m40C" "ff" -40)
  list("SS_m40C" "ss" -40)
  list("TT_125C" "tt" 125)
  list("FF_125C" "ff" 125)
  list("SS_125C" "ss" 125)
)
 
results = list()
foreach(corner corners
  corner_name = car(corner)
  corner_model = cadr(corner)
  corner_temp = caddr(corner)
  
  ; 设置工艺角和温度
  modelFile("./models/" corner_model ".scs")
  temp(corner_temp)
  
  ; 运行瞬态仿真
  tranScript(strcat("tran_" corner_name))
  
  ; 提取锁定时间
  lock_time = extract_lock_time()
  results = append(results list(corner_name lock_time))
)
 
; 打印结果表格
printf("\n=== PVT 锁定时间汇总 ===\n")
printf("| Corner | Lock Time (us) |\n")
printf("|--------|---------------|\n")
foreach(r results
  printf("| %s | %.2f |\n" car(r) cadr(r)*1e6)
)

Step 6 验证:非理想性注入脚本

// 非理想性注入仿真(Spectre netlist 片段)
 
% CP 泄漏电流注入
ileak (cp_out 0) isource dc=50n type=dc  % 50nA 泄漏(典型值)
 
% CP 失配(UP/DN 电流源分别设置)
iup (cp_out vcp) isource dc=Icp_mismatch  % UP 电流
idn (vcp cp_out) isource dc=Icp          % DN 电流
% Icp_mismatch = Icp * (1 + delta_mismatch)
 
% PFD 死区注入
% 在 PFD 输出加入最小脉宽
% 在 Verilog-A PFD 模型中设置:min_pw = 0.5ns

迭代验收标准

仿真验证阶段验收标准若未达标
Step 2: Fc/φ 确认PSS+PAC 仿真值与设计值偏差 返回修正滤波器系数
Step 3: 锁定时间仿真锁定时间 规格值增大 或优化
Step 4: 噪声/杂散预算表各源偏差 dB重新提取噪声参数或调整
Step 5: PVT 锁定时间最坏角锁定时间 典型值增加环路带宽或优化偏置
Step 6: 非理想性Cycle Slip ,死区影响 减小泄露、优化 PFD/CP 设计
Step 7: 后仿签核通过全部 Step 2-6 验收标准重新提取寄生或修改版图

与现有知识的联系


关键公式

概念公式编号
二阶自然频率(16.25)
阻尼因子(16.26)
与 关系—
相位裕度与阻尼因子(16.39)
Gamma 因子(16.24)

参考文献

  • Banerjee, D. (2006). PLL Performance, Simulation, and Design (4th ed.), Ch.16-19.