第二章 GTY架构与工作原理:收发器内部解剖

各位同学,今天我们深入GTY收发器的心脏。先讲一个我早年翻车的经历:第一次用GTY做12.5Gbps链路,以为照着例程把端口连上就完事了,结果眼图根本睁不开。后来才发现,我连PCS和PMA各自管什么、时钟从哪来到哪去都没搞清楚。所以这一章,咱们把架构掰开揉碎了讲。

2.1 收发器的“五脏六腑”:PCS与PMA

GTY收发器内部不是一个黑盒子,它分两大功能区——PCS(物理编码子层)和PMA(物理介质附加子层)。说白了,PCS管协议、编解码、对齐这些“数字活”,PMA管串化、解串、时钟恢复这些“模拟活”。

PCS主要干了这些事:

  • 编码/解码:8B/10B、64B/66B、64B/67B 你想用哪个,配一下寄存器就行。我记得第一次做100G项目,用了64B/66B,结果忘记配置同步头模式,数据全乱了——从那以后我再也不敢跳过PCS配置。
  • 弹性缓冲与时钟修正:跨时钟域时用弹性缓冲,时钟修正就是插删空闲字符。项目中遇到过因为弹性缓冲深度不够导致的连续CRC错误,后来我把深度从4调到了8,问题解决。
  • 通道绑定与极性反转:多通道对齐时靠通道绑定,PCB走线反了?直接配寄存器反转极性,不用改板子。这个技巧我用了无数次。
  • PRBS与环回:调试利器。我建议上板第一件事就是配个PRBS31,跑环回,链路通不通十分钟见分晓。

PMA主要管这些:

  • 串化器/解串器:PMA内部的SerDes把并行数据转成高速串行,反过来也一样。速率跟你配的参考时钟和PLL倍频有关。
  • 时钟数据恢复:接收端PMA里的CDR电路从串行数据里恢复出时钟和数据。注意,CDR锁定需要一段时间,我做过一个项目,复位后给链路的等待时间太短,结果前几百个包全丢了——加个CDR锁定标志检查就好了。
  • 发送预加重与接收均衡:高速信号经过PCB会失真,GTY的发送端有3~5级预加重,接收端有CTLE、DFE。我曾经调试一条25G链路,什么参数都正常就是误码高,最后发现DFE的抽头系数设成了默认值,根据通道损耗手调了两级就搞定了。
一个小习惯: 我每次做新板子,都是先配PMA的环回模式测参考时钟和电源,再开PCS的环回测编码,最后跑外部环回测整体通路。分步验证能省一整天排查时间。

2.2 时钟结构:GTY的“心跳”

GTY的时钟分三大层级,你想想看,就像城市供水系统:源头、泵站、水龙头。

  1. 参考时钟(GTREFCLK):源头。通常来自板上的晶振或者外部时钟芯片,通过专用引脚进入GTY的时钟缓冲器。频率可以是125MHz、156.25MHz、312.5MHz等,取决于你想要的线路速率。我习惯用156.25MHz做通用参考,因为2分频就是10G常用的155.52MHz附近。
  2. PLL(CPLL、QPLL):泵站。GTY里有两种PLL——CPLL四路共享一个,QPLL四路也共享一个。CPLL适合较低速率(~12.5Gbps以下),QPLL适合高速率(最高30.5Gbps)。这两个PLL的锁定时间、抖动特性不同。我曾经在25G项目里用了CPLL,结果抖动超标,换成QPLL后眼图立马清爽。
  3. 分频/倍频路径:水龙头。PLL输出经过分频器,生成TX位宽时钟、RX位宽时钟、以及各个PCS子模块用的时钟。注意:TX位宽时钟和TX并行数据时钟必须同源,否则弹性缓冲会溢出。
避坑提醒: GTY的参考时钟输入有差分要求,最好不要用单端时钟走长线接入。我见过一个板子用单端晶振,结果抖动大到GTY根本锁不住,换差分晶振后一调就过。

时钟关系可以用下面这张图来理解(见SVG):

GTY 时钟与数据通路架构简图 GTREFCLK PLL 区 CPLL (≤12.5G) QPLL (≤30.5G) 时钟分频 TX/RX 位宽时钟 参考路径 PMA SerDes / CDR 预加重 / 均衡 PCS 编解码 / 弹性缓冲 通道绑定 / PRBS 并行数据 FPGA 逻辑接口 AXI-Stream / 并行 用户数据 高速串行 I/O 💡 注意:PLL输出需经过 时钟分频才能匹配PCS位宽 常见分频比:2/4/8/16

2.3 数据通路:从串行到并行再到用户

咱们先走一遍发送通路,再走接收通路。嗯,你看完就会发现,本质上就是个串转并、并转串的过程,但中间加了很多“安检站”。

发送通路(TX)

  1. 用户接口:FPGA逻辑通过AXI-Stream或内部并行总线把数据送给GTY。注意数据位宽可配:16位、32位、64位甚至128位。我记得用64位位宽时,时钟频率必须对齐线速率,比如25.78125Gbps时,位宽时钟约403MHz——你算算就能明白。
  2. PCS编码:进PCS后先编码(8B/10B或64B/66B等),然后经过弹性缓冲、加扰(可选)、通道绑定等。这里有个坑:如果你用了64B/66B,同步头必须要处理,我曾经忘记在用户侧加同步头检测器,结果接收端一直失锁。
  3. PMA串化:编码后的并行数据进PMA,由串化器按线路速率逐位输出。注意GTY的串化器支持2:1、4:1多种结构,但最终都是把并行时钟域数据转到高速串行时钟域。
  4. 预加重输出:最后经过发送预加重驱动,通过差分对送到PCB。

接收通路(RX)

  1. 输入均衡:串行信号进来,PMA先做CTLE(连续时间线性均衡)和DFE(判决反馈均衡)。我调试25G链路时,DFE的抽头数调到5才收敛,这是因为PCB走线损耗偏大。
  2. CDR时钟恢复:CDR从数据边沿恢复出时钟,再用这个时钟去采样数据。CDR的环路带宽可调,窄带宽抗抖动好但锁定慢,宽带宽锁定快但容易受噪声干扰。我个人习惯:先宽带宽锁定,锁定后再切到窄带宽。
  3. 解串:串行数据转回并行,送入PCS。
  4. PCS解码与对齐:PCS做码型解码、弹性缓冲处理、通道去偏斜,最后送用户接口。注意:如果用了加扰,这里要解扰。
实战经验: 我曾经有一次接收通路老是报8B/10B错误码,查了三天,最后发现是GTX(上一代)与GTY的极性配置寄存器地址不同,我照搬了旧代码。所以每次换芯片型号,一定要重新看一遍寄存器手册——DRP操作尤其容易踩这个坑。

2.4 关键指标速查表

模块关键参数典型范围我常用的值
PLLCPLL 锁定频率0.5~12.5GHz10.3125GHz (10G)
PLLQPLL 锁定频率9.8~30.5GHz25.78125GHz (25G)
PMA TX预加重级数3~5 抽头通常用3抽头
PMA RXCTLE 增益0~15dB根据插损先算再调
PCS弹性缓冲深度4, 8, 16, 32 字符8 (多通道建议16)
时钟参考时钟频率125M, 156.25M, 312.5M156.25MHz

这张表其实是我自己做项目时贴在显示器上的,每次配新速率就扫一眼。你也可以根据自己的链路预算微调。