2. 收发器时钟架构:参考时钟、恢复时钟、并行时钟的关系与抖动分析

做收发器设计,时钟就是命脉。我见过太多项目,逻辑功能全对,一上高速就挂,十有八九是时钟没整明白。今天咱们就聊聊收发器里那几路时钟——参考时钟、恢复时钟、并行时钟,它们到底什么关系,抖动又是怎么一步步搞死你的链路的。

2.1 三种时钟的定位

收发器内部,说白了就三个时钟域在打架:

  • 参考时钟(REFCLK):这是收发器的“基准音叉”。PLL靠它锁定,TX端的数据速率也由它决定。我个人习惯,选REFCLK时优先看相位噪声,频率准不准反而是其次。
  • 恢复时钟(RXRECCLK):这是从接收到的数据流里“硬生生”提出来的时钟。CDR(时钟数据恢复)模块干的活。它跟着远端发射端的时钟走,跟你本地时钟没半毛钱关系。
  • 并行时钟(USRCLK):这是收发器和FPGA内部逻辑交互用的。说白了,就是把高速串行数据降速后,给逻辑用的“慢时钟”。

嗯,这里要注意:这三个时钟的频率可能不同,相位更是天差地别。你如果直接拿恢复时钟去驱动逻辑,大概率会出事。

2.2 它们之间怎么配合?

我画个图你就明白了。收发器内部,时钟路径大概是这样的:

参考时钟 REFCLK PLL TX 串化器 并行时钟 USRCLK CDR 恢复时钟 RXRECCLK 串行数据输出 串行数据输入 本地晶振提供 频率固定 与逻辑交互 频率 = 线速率 / 串化因子 从数据中提取 频率跟随远端

你看,参考时钟进PLL,PLL出高速时钟给TX串化器,同时分频出并行时钟给逻辑。接收端呢,CDR从数据里抠出恢复时钟,再分频出并行时钟。两条路径的并行时钟,频率理论上一样,但相位和抖动完全不同。

关键点:发送端的并行时钟和接收端的并行时钟,是两个完全独立的时钟域。跨时钟域同步是必须做的,别偷懒。

2.3 抖动——收发器的头号敌人

抖动是什么?说白了就是时钟边沿不在它该在的位置上。你想想看,一个理想的时钟,每个上升沿间隔完全相等。但实际器件里,有热噪声、有电源噪声、有串扰,边沿就会左右晃。这个“晃”就是抖动。

我在项目中遇到过最头疼的一次,10Gbps的链路,误码率死活下不去。折腾了两周,最后发现是参考时钟的电源纹波太大,引入了大量抖动。换了个LDO供电,问题直接消失。

抖动通常分两类:

类型 来源 特点 影响
随机抖动(RJ) 热噪声、散粒噪声 高斯分布,无界 长期累积,影响误码率底限
确定性抖动(DJ) 电源噪声、串扰、ISI 有界,可预测 通常占主导,可针对性优化

我的经验:调试时先看确定性抖动。拿示波器看眼图,如果眼图“眼皮”厚但边界清晰,多半是DJ。如果边界模糊像毛玻璃,那就是RJ在作怪。

2.4 三种时钟各自的抖动特性

参考时钟的抖动:这是源头。PLL对参考时钟的抖动有高通特性——低频抖动会被PLL跟踪,高频抖动会被滤除。所以参考时钟最怕的是高频抖动。我曾经用过一个便宜的晶振,100kHz以上的相位噪声一塌糊涂,结果整个链路的抖动预算全被吃掉了。

恢复时钟的抖动:这个比较复杂。CDR本质上是一个低通滤波器,它会跟踪数据中的低频抖动,但高频抖动会被抑制。所以恢复时钟的抖动,主要取决于数据本身的抖动特性和CDR的带宽设置。

并行时钟的抖动:这是经过分频后的时钟。分频器本身不会引入额外抖动,但会把高速时钟的抖动按分频比“平均”掉一部分。不过要注意,并行时钟的抖动还受FPGA内部走线延迟的影响,这个往往被忽略。

警告:并行时钟的抖动虽然比高速时钟小,但它驱动的逻辑规模大、扇出多。如果时钟树不平衡,skew带来的问题比抖动本身更严重。我曾经见过一个设计,并行时钟的抖动只有20ps,但skew达到了150ps,结果时序全崩。

2.5 抖动预算怎么分?

收发器厂商通常会给你一个抖动预算表。以10Gbps为例,一个典型的预算分配是这样的:

抖动来源 预算(UI) 备注
发送端总抖动 0.15 UI TX芯片自身贡献
通道抖动 0.20 UI PCB走线、连接器
接收端总抖动 0.15 UI RX芯片自身贡献
裕量 0.10 UI 设计余量
合计 0.60 UI 通常要求 < 0.70 UI

你看,一个UI(单位间隔)在10Gbps下只有100ps。0.6 UI就是60ps。你的整个链路,从发送端到接收端,所有抖动加起来不能超过60ps。这个预算非常紧张。

我个人习惯,设计时至少留0.15 UI的裕量。别卡着极限算,量产时温度一变、电压一抖,你就知道裕量的重要性了。

2.6 约束怎么做?

说了这么多理论,来点实际的。在Vivado里,收发器的时钟约束怎么做?

# 参考时钟约束
create_clock -name refclk -period 10.000 [get_ports refclk_p]

# 并行时钟约束(TX方向)
create_generated_clock -name txusrclk \
  -source [get_pins gtpe2_inst/TXOUTCLK] \
  -divide_by 40 \
  [get_pins gtpe2_inst/TXUSRCLK]

# 并行时钟约束(RX方向)
create_generated_clock -name rxusrclk \
  -source [get_pins gtpe2_inst/RXOUTCLK] \
  -divide_by 40 \
  [get_pins gtpe2_inst/RXUSRCLK]

# 跨时钟域约束
set_clock_groups -asynchronous \
  -group [get_clocks txusrclk] \
  -group [get_clocks rxusrclk]

嗯,这里要注意:TXUSRCLK和RXUSRCLK虽然是同一个频率,但它们是异步的。必须用set_clock_groups -asynchronous告诉工具,别去分析它们之间的时序路径。否则工具会报一堆假路径,浪费你时间。

避坑指南:我曾经犯过一个错,把TXUSRCLK和RXUSRCLK设成了同一个时钟组。结果综合工具花了3个小时跑时序,最后告诉我所有路径都违例。其实那些路径根本不需要分析。从那以后,我每次做收发器约束,第一件事就是先把异步时钟域分开。

2.7 抖动测量与调试

如果你在实验室里调试,手头有示波器的话,可以这样测抖动:

  1. 先测参考时钟的抖动。用示波器的时钟恢复功能,看TIE(时间间隔误差)的峰峰值和RMS值。
  2. 再测恢复时钟的抖动。这个需要把CDR锁定后的时钟引出来(有些收发器有专门的测试引脚)。
  3. 最后看并行时钟。这个通常通过FPGA内部的ILA或逻辑分析仪来观察。

我个人的经验是:如果参考时钟的TIE RMS超过5ps,那就要小心了。对于10Gbps以上的链路,这个值最好控制在2ps以内。

抖动分析说白了就是跟时间赛跑。你每减少1ps的抖动,链路的误码率可能就下降一个数量级。所以别小看那些“看起来还能用”的时钟,它们可能正在悄悄吃掉你的裕量。

好了,关于收发器时钟架构和抖动,就聊这么多。记住一句话:时钟是收发器的灵魂,抖动是时钟的魔鬼。把时钟整明白了,你的高速设计就成功了一半。

可可精品资料库