CDR 锁相环基础:PLL 工作原理与 CDR 架构概述
CDR,全称是 Clock and Data Recovery。说白了,就是从一串高速数据流里把时钟信号“提”出来,同时把数据重新对齐。你想想看,在高速串行通信里,发送端只扔数据过来,不给时钟。接收端要是不知道时钟在哪儿,根本没法采样。我早年做第一个 10Gbps SerDes 项目时,觉得这玩意儿不就是个 PLL 加点逻辑嘛,后来才发现坑多着呢。
- 从数据边沿提取时钟相位信息
- 产生与数据同步的恢复时钟
- 用恢复时钟对数据进行重定时,消除抖动
为什么需要 CDR?
在芯片与芯片之间、板卡与板卡之间,数据是串行传输的。没有单独的时钟线,因为那样会多出一倍的引脚和功耗。接收端必须自己从数据里“猜”出时钟。怎么猜?靠的就是数据跳变沿。每次数据从 0 变 1 或从 1 变 0,都隐含了一个时钟参考点。CDR 的任务就是把这种隐含的参考点变成稳定的时钟信号。
我记得有一次调试一块 28Gbps 的接收芯片,数据眼图看着还行,但 CDR 就是锁不住。折腾了两天,最后发现是数据里的连续相同位(CID)太长,CDR 的相位更新跟不上。从那以后,我设计 CDR 时一定会先检查数据编码有没有保证足够的跳变密度。
PLL 工作原理——CDR 的“心脏”
大多数 CDR 的核心都是一个 PLL(锁相环)。PLL 本身是个闭环负反馈系统,用来生成一个与输入参考信号频率和相位同步的输出时钟。在 CDR 里,输入参考就是数据流,输出就是恢复时钟。
一个典型的 PLL 由四部分组成:
| 模块 | 功能 | 输出 |
|---|---|---|
| 鉴相器(PD) | 比较输入信号与反馈时钟的相位差 | 相位误差信号 |
| 电荷泵(CP) | 将相位误差转换为电流脉冲 | 充放电电流 |
| 环路滤波器(LF) | 滤除高频噪声,稳定环路 | 控制电压 Vctrl |
| 压控振荡器(VCO) | 根据控制电压调整输出频率 | 恢复时钟 |
反馈路径把 VCO 输出分频后送回 PD,形成闭环。当环路锁定时,PD 的两个输入频率相同,相位差恒定(通常接近 0)。
怎么理解闭环带宽呢?PLL 的闭环带宽决定了它对输入相位变化的跟踪速度。带宽越宽,跟踪越快,但滤除输入噪声的能力越差。反之亦然。这个 trade-off 是 CDR 带宽优化的核心。
下面这张图展示了 CDR 锁相环的基本架构:
CDR 核心架构
CDR 架构主要分三类。我在不同项目里都接触过,各有各的脾气。
| 架构类型 | 检测方式 | 优势 | 劣势 | 典型应用 |
|---|---|---|---|---|
| 线性 CDR | 线性鉴相器(如 Hogge PD) | 低抖动,线性范围宽 | 功耗较高,电路复杂 | 25Gbps+ 高速 SerDes |
| 二进制 CDR | Bang-Bang 鉴相器 | 结构简单,功耗低 | 输出抖动大,锁定特性硬 | 消费电子、USB、PCIe |
| 混合 CDR | 双模式(线性 + 二进制) | 兼顾锁定速度与抖动 | 控制逻辑复杂 | 高端通信、FPGA 收发器 |
线性 CDR 的鉴相器输出与相位误差成正比。环路分析起来比较“干净”,可以用经典的 PLL 线性模型。但模拟电路面积大,功耗也高。
二进制 CDR 用的 Bang-Bang PD 只输出超前/滞后两个状态。说白了,就是“快了”或者“慢了”。环路呈非线性,分析起来复杂些,但数字友好,容易集成。我做过一个 28Gbps 的二进制 CDR,锁定时间只有几百纳秒,但随机抖动比线性架构大了将近一倍。
- 信号速率高、抖动预算紧 → 优先线性 CDR
- 成本敏感、允许一定抖动 → 二进制 CDR 更合适
- 想兼顾两者 → 混合 CDR,但要做好模式切换的毛刺管理
带宽——CDR 的灵魂
CDR 的带宽直接决定了:
- 跟踪能力:带宽越宽,对输入频率/相位变化的响应越快
- 抖动传递:带宽以内输入抖动被传递,带宽以外被抑制
- 抖动容限:带宽越宽,能容忍的低频抖动越大,但对高频抖动更敏感
我曾经在一个 56Gbps PAM4 项目中,因为 CDR 带宽设得太宽,结果发送端的低频抖动全被传递过去了,导致恢复时钟的相位噪声超标。后来把带宽从 20 MHz 降到 8 MHz,抖动瞬间压下来了。但也别降太多——带宽太窄,CDR 跟不上数据里的频率漂移,会失锁。
- 带宽不能超过输入数据跳变速率的 1/10(经验法则)
- 带宽太低 → 锁定慢,跟踪差,长 CID 时易失锁
- 带宽太高 → 输入抖动传递多,恢复时钟干净度差
- 做工艺角仿真时,带宽可能变化 2~3 倍,一定要留裕量
怎么确定最佳带宽?我个人习惯分三步走:
- 系统级分析:根据数据编码(如 NRZ 或 PAM4)、参考时钟精度、预期抖动,算出理论带宽范围
- 行为级仿真:用 Verilog-A 或 Simulink 搭 CDR 模型,扫带宽看锁定时间和抖动
- 芯片验证:流片后在 ATE 上测锁定范围和抖动容限,反标修正模型
下面是一个简单的环路滤波器参数计算代码(Python 风格伪代码),用来估算 RC 时间常数与带宽的关系:
# 环路滤波器参数估算
# 给定:电荷泵电流 Icp = 100 uA
# VCO 增益 Kvco = 200 MHz/V
# 分频比 N = 1(无分频)
# 目标带宽 f_c = 10 MHz
Icp = 100e-6 # A
Kvco = 200e6 # Hz/V
N = 1
f_c = 10e6 # Hz
# 二阶 PLL 近似:带宽 ≈ (Icp * Kvco * R) / (2 * pi * N)
# 解得 R ≈ (2 * pi * N * f_c) / (Icp * Kvco)
R = (2 * 3.14159 * N * f_c) / (Icp * Kvco)
print(f"建议 R ≈ {R/1e3:.1f} kOhm")
# C 由相位裕度决定,通常选 C = 1/(2 * pi * f_c * R * 4)
C = 1 / (2 * 3.14159 * f_c * R * 4)
print(f"建议 C ≈ {C*1e12:.1f} pF")
最后说一句,CDR 带宽优化不是一个孤立的任务。它跟数据编码、信道特性、时钟树设计都紧密相关。设计时一定要跳出 PLL 的小圈子,从系统层面看问题。