时钟恢复(CDR)原理:相位检测、环路滤波器、VCO

时钟恢复,说白了就是把串行数据里藏着的时钟信息“提取”出来。

SGMII链路上只有数据线,没有单独的时钟线。接收端必须从数据跳变中重建出同步时钟,才能正确采样。这件事,就是CDR(Clock and Data Recovery)干的。

我记得刚接触高速串行链路时,总觉得这步很玄学。后来调了几个月眼图,才真正理解:CDR就是一个闭环反馈系统。核心三个环节:相位检测、环路滤波器、压控振荡器(VCO)。下面一个一个拆开讲。

相位检测:找出时钟和数据的“时间差”

相位检测器(PD)是CDR的“眼睛”。它比较接收数据边沿和本地时钟边沿,输出一个误差信号。

说白了,就是看时钟比数据“早到了”还是“晚到了”。

我当时在项目中用的是线性相位检测器,也叫“Hogge检测器”。结构很简单:

  • 数据上升沿触发第一个D触发器(时钟上升沿采样)
  • 数据下降沿触发第二个D触发器(时钟下降沿采样)
  • 两个输出异或,得到脉冲宽度信号

脉冲宽度代表相位差。误差越大,脉冲越宽。完美对齐时,脉冲宽度为零。

实际项目中要注意什么?

  • 鉴相死区:当相位差极小时,数字PD可能无法产生有效误差脉冲。我用的是Bang-Bang鉴相器,它输出“超前/滞后”二值信号,没有死区问题。虽然精度粗,但鲁棒性不错
  • 数据跳变密度:CDR需要数据中频繁出现边沿。SGMII的8B/10B编码保证了足够跳变——这是个好特性
经验之谈:我曾经在一款FPGA上调试CDR,发现锁相范围不够。翻了几遍文档才意识到:相位检测器输入端没加数据扰码。数据中连“0”长度超过15个UI,鉴相器直接罢工了。加上扰码后问题解决。搞CDR的朋友记得检查“最长连续相同码”这个指标。

环路滤波器:给误差信号“滤波”

相位检测器输出的是高频抖动信号,不能直接去调VCO。需要一个环路滤波器把噪声滤掉,提取出直流分量。

我习惯把环路滤波器理解为“系统的决策大脑”。它决定了CDR的收敛速度和抗噪能力。

常用的环路滤波器结构:

  • 一阶无源RC:最简单,但噪声性能一般。适合低速率
  • 二阶有源:性能好,常用在高速CDR中。包含比例路径和积分路径
  • 数字环路滤波器:现在流行全数字CDR,用累加器+比例系数:freq_error = integral(phase_error) * Ki + phase_error * Kp

为什么用二阶?

一阶环路只能跟踪固定频偏,对于SGMII这种有频率漂移的场景,必须用二阶。换句话说,二阶环路能无误差地跟踪斜坡输入的频率变化。我自己的项目中,比例系数Kp和积分系数Ki的配置是调了好几天才稳下来的。

关键参数经验值:

参数 典型值 太大了 太小了
比例系数 Kp 0.5~1.0 锁定快但抖动大 锁定慢
积分系数 Ki 0.01~0.1 过冲甚至振荡 跟踪不上频偏
环路带宽 数据速率/1000 自激 无法跟踪抖动
避坑提醒:千万不要把环路带宽设得太宽。我刚开始做CDR时,想着“带宽宽=锁定快”,结果系统在高频下自激振荡,眼图完全闭合。后来降到数据速率的1/2000左右才稳定。

VCO:产生可调的本地时钟

VCO的任务是根据环路滤波器的控制电压,输出一个频率可调的时钟信号。在CDR环里,它负责“输出”最终的恢复时钟。

理想VCO的特性:f_out = f_free + Kvco * V_ctrl。但现实世界是非线性的。

我记得项目早期选了一款VCO,Kvco(调谐增益)标称50 MHz/V,实测在中心频率附近增益波动超过40%。结果锁相环相位噪声恶化了3个dB。

VCO的关键指标:

  • 调谐范围:需覆盖SGMII数据速率的 ±200 ppm(SGMII规范要求)
  • 相位噪声:直接影响最终时钟抖动。通常要求< -120 dBc/Hz @ 1MHz偏移
  • 压控增益波动:尽可能平摊,避免增益突变引起环路不稳定
工程技巧:实践中,VCO的控制电压输入端一定要加去耦电容(0.1μF),滤掉电源噪声。否则时钟抖动会成倍增加。我曾经因为省掉这个电容,整块SGMII链路误码率一直下不去,查了三天才找到原因。

CDR环路完整结构

把三个模块串起来,就是完整的CDR闭环系统:

数据波形 → 相位检测器 → 误差信号 → 环路滤波器 → 控制电压 → VCO
                                                              ↕
                                                   恢复时钟(反馈回PD)

你会发现它是个负反馈系统。目标就是让VCO时钟沿锁在数据眼图的正中间。

为什么一定要锁在中间?因为那里采样余量最大,抗抖动能力最强。我个人习惯在仿真时看“相位对齐波形”——PD输出积分值归零时,就是完美对齐了。

下面这张图展示了CDR三个核心模块如何协同工作:

时钟恢复(CDR)核心结构 串行数据 相位检测器 (PD) 比较边沿 环路滤波器 (LPF) 滤除噪声 VCO (压控振荡器) 生成时钟 恢复 反馈:调整时钟相位 🚦 关键理解: CDR是一个负反馈闭环系统。相位检测器发现时钟与数据有偏差,环路滤波器等效为“低通”,VCO根据误差调整自身频率。 最终稳态:VCO时钟沿精确对准数据眼图中央——此时PD输出积分值为0。

CDR模块综合判断

三个模块放在一起,需要整体调优。我整理了一个辅助判断表:

问题表现 可能故障模块 排查方向
始终无法锁定 相位检测器/输入数据 检查数据跳变密度;确认PD极性;VCO初始频率是否在捕捉带内
锁定后眼图抖动较大 环路滤波器/VCO 降低环路带宽;检查VCO电源噪声;增加去耦电容
锁定时间长(>10μs) 环路滤波器 适当增加Kp或Ki;检查是否因PG(频率引导)逻辑异常
锁定后频率偏移大 VCO 检查Kvco线性度;确认VCO初始频率是否与标称值偏差过大;可能有温漂

我调试CDR时,常用这套排查思路——先暴力扫一下系统能否锁定,再看抖动和稳定时间。相位检测器的极性错了会直接锁反,后文会单独讲。