第 2 章:时钟与数据恢复的基本原理

在高速串行通信里,数据是跟着时钟一起走的,但接收端却常常没有单独的时钟线。你想想看,发端把时钟嵌在数据里,收端要自己想办法把时钟“抠”出来。这就是时钟与数据恢复(CDR)干的事。

我刚开始做高速接口时,总觉得这玩意儿就是个PLL,后来才明白,CDR比普通PLL麻烦得多。它不光要锁频率,还得抓相位。说白了,就是从带噪声的数据流里,把时钟和数据同时洗干净。

2.1 为什么要做 CDR?

传统并行总线里,时钟和数据走两根线,彼此对齐。但到了Gbps级,走线长度差几毫米就会导致时序出错。串行总线砍掉时钟线,用数据自己携带时钟信息。这样一来,收端必须完成两件事:

  • 频率锁定:把本地振荡器拉到和发送端相同的频率
  • 相位对齐:让采样时钟的边沿正好落在数据眼的中心

我曾遇到过一块板子,眼图明明还开着,但误码率就是下不去。查了三天,原来是CDR的环路带宽设得太低,低频抖动没滤干净。嗯,这里要注意,CDR不只是一个电路,它是个反馈系统。

核心要点:CDR的本质是接收端自己从数据中提取时钟,再利用这个时钟对数据重定时。频率和相位两个维度,缺一不可。

2.2 经典 PLL 型 CDR 架构

最常见的CDR结构是基于锁相环(PLL)的。你可以把它想象成一个自动校准的时钟刀,慢慢调整自己的频率和相位,直到精准切中数据眼中心。

基本模块就四个:

  1. 鉴频鉴相器(PFD + 电荷泵):比较输入数据和本地时钟的边沿位置,输出相位差对应的充放电电流
  2. 环路滤波器(Loop Filter):把电流脉冲平滑成控制电压,决定环路的动态性能
  3. 压控振荡器(VCO):根据控制电压调整输出时钟的频率
  4. 重定时触发器(DFF):用恢复出的时钟重新采样数据,消除亚稳态
PLL 型 CDR 各模块核心参数
模块关键参数典型影响
PFD死区宽度太小导致锁相精度差,太大引入随机抖动
电荷泵充电/放电电流匹配度失配会造成相位偏移
环路滤波器零极点位置决定带宽和稳定裕度
VCO增益 KVCO影响噪声传递特性

我建议初学者重点关注环路滤波器的设计。很多人只在意VCO好坏,实际上环路滤波器的电阻电容值稍微偏一点,相位裕度就直接掉到45°以下,环路开始振荡。我曾经因为这个避坑教训深刻——仿真时都很好,投片回来发现锁不住,最后查出来是滤波电容的寄生太大。

下面是PLL型CDR的基本结构图。注意看数据流向:输入数据进了PFD,也进了重定时器;恢复时钟既送到PFD做反馈,又送到重定时器做采样。

PLL 型 CDR 基本架构 输入数据 PFD + CP 环路滤波器 VCO 恢复时钟 反馈时钟 重定时 DFF 重定时时钟 恢复数据 数据先被PFD采样,同时VCO产生的恢复时钟反馈回PFD形成负反馈;重定时器用恢复时钟再次采样输入数据,输出干净的数据

2.3 锁定过程与关键指标

CDR锁定的过程,大致分三步:

  1. 频率捕获:环路先通过频率检测强行把VCO频率拉到接近数据速率。这个阶段可能会产生周期滑移,属于正常现象。
  2. 相位锁定:PFD开始比较边沿位置,电荷泵连续调节控制电压,最终让时钟沿和数据转换沿对齐。
  3. 跟踪与稳定:锁定后环路进入微调状态,不断修正由温度、电源引起的相位漂移。

这里面有个坑:捕获范围。如果VCO的调谐范围不够覆盖所有工艺角和温度,CDR就根本锁不上。我个人习惯在设计初期就留出30%以上的频率裕量。

避坑指南:我曾经在一个多通道项目中,发现某个通道的CDR锁定时钟频率老是偏了200ppm,排查后发现是VCO控制电压的纹波太大了。解决办法是在环路滤波器和VCO之间加了一级RC低通,把50MHz以上的纹波滤掉。记住,CDR对电源噪声极其敏感——VCO的控制电压上哪怕1mV的纹波,都会变成时钟抖动。

衡量CDR性能,主要看这几个指标:

指标含义典型要求(10Gbps级)
抖动传递特性输入抖动有多少能传到输出时钟-3dB 带宽通常在 1~10 MHz
抖动容限多大的输入抖动会导致误码≥ 0.15 UIpp (眼图高度约0.5UI)
锁定时间从上电到锁定完成的时间≤ 20 μs (取决于协议)
频率捕获范围能锁定的最大频率偏差± 5000 ppm

重要提示:锁定时间并不是越快越好。带宽太宽,锁定快但抖动传递特性差,输入噪声会被放大;带宽太窄,抖动压制好但锁定慢,可能跟不上协议要求(比如PCIe要求100μs内完成链路训练)。环路带宽的选择,是CDR设计中最需要权衡的环节之一。

2.4 从数据流中提取时钟的难点

你以为有了PLL就万事大吉?嗯,没那么简单。数据流和普通参考时钟有个本质区别:数据流不是连续翻转的。一串长连续的“0”或“1”会让PFD那边没有边沿可比较,VCO就会处于开环漂移状态。

为了解决这个问题,业界用了两种主流思路:

  • 数据编码:比如8b/10b、64b/66b编码,保证数据流中最大连“0”连“1”长度不超过某个值(通常为5或66位)。这样PFD最多在几个UI内就能见到一次边沿。
  • 环路保持:在无跳变期间让VCO的控制电压保持住,或者用更高级的相位插值器来预测下一个边沿的位置。

我个人偏好前者——编码加简单PLL,比纯模拟的相位插值器更鲁棒。我在一款40Gbps收发器芯片中用过相位插值器方案,结果工艺偏差导致相位台阶不均匀,最后不得不换成高精度PLL。

好了,CDR的基本原理就这么多。理解了PLL型的结构和锁定过程,后面再讲数字型CDR、相位插值型CDR时,你就能感觉出它们都是基于同一个核心逻辑——负反馈的频率/相位追踪。