3、链路基础:FPGA高速收发器内部结构(PMA层与PCS层详解)、时钟架构与参考时钟要求

各位同学,咱们今天聊点硬核的——FPGA高速收发器的内部结构。说实话,我刚入行那会儿,看着收发器的框图也是一头雾水。什么PMA、PCS,一堆缩写,感觉像在看天书。后来踩了不少坑,才慢慢摸清楚这里面的门道。

高速收发器,说白了就是FPGA跟外界高速通信的“嘴巴”。它负责把FPGA内部的并行数据,转成高速串行数据发出去;反过来,把收到的串行数据再转回并行数据。这个转换过程,就是由PMA层和PCS层共同完成的。

核心要点:收发器架构 = PMA(物理介质适配层)+ PCS(物理编码子层)。PMA管模拟,PCS管数字。两者配合,才能实现可靠的高速传输。

FPGA高速收发器内部结构 FPGA内部逻辑 用户逻辑 FIFO 状态机 并行数据 PCS层 8B/10B编码 弹性缓冲 通道绑定 时钟补偿 PRBS检测 串行数据 PMA层 PLL/CDR SerDes TX驱动 RX均衡 预加重 高速差分 数据流向:FPGA逻辑 → PCS层(编码/缓冲) → PMA层(串行化/驱动) → 外部链路

3.1 PMA层:模拟信号的“硬功夫”

PMA层,全称Physical Media Attachment,物理介质适配层。这一层处理的是纯粹的模拟信号。我习惯把它比作收发器的“肌肉”——力气大,但不太聪明。

PMA层主要干这几件事:

  • SerDes(串化/解串器):把并行数据转成串行,或者反过来。这是收发器最核心的功能。
  • PLL(锁相环):产生高速时钟,驱动串行数据的发送。PLL的性能直接决定了抖动大小。
  • CDR(时钟数据恢复):从接收到的数据流中提取时钟。没有CDR,接收端就没法正确采样数据。
  • TX驱动与RX均衡:发送端负责把信号推出去,接收端负责把衰减的信号“拉”回来。

实战经验:我在调试一个10Gbps链路时,发现眼图总是睁不开。折腾了两天,最后发现是PLL的环路带宽设置不对。PLL带宽太宽,抖动抑制差;太窄,锁定时间又太长。这个平衡点,得根据实际链路来调。

PMA层还有个容易被忽略的点——预加重和去加重。信号在PCB走线上传输,高频分量衰减比低频厉害。预加重的思路是:发送时故意把高频分量“抬一抬”,这样到了接收端,高低频就平衡了。我见过不少工程师,链路跑不上去就猛调驱动强度,其实先试试预加重,往往立竿见影。

3.2 PCS层:数字逻辑的“软功夫”

PCS层,全称Physical Coding Sublayer,物理编码子层。这一层处理的是数字信号。我把它比作收发器的“大脑”——负责编码、解码、对齐这些精细活。

PCS层的关键模块包括:

模块 功能 我的经验
8B/10B编码 将8位数据映射为10位码字,保证DC平衡和足够的跳变沿 编码后的码流中,0和1的数量尽量相等,这样CDR才能稳定工作
弹性缓冲 补偿收发两端时钟域的微小差异 缓冲深度设置很关键,太浅容易溢出,太深增加延迟
通道绑定 将多个收发器通道对齐,形成更宽的数据通路 绑定后各通道的skew必须控制在1个UI以内,否则数据会错位
时钟补偿 通过插入/删除空闲字符,调整时钟频率偏差 补偿间隔不能太频繁,否则会引入额外的抖动

8B/10B编码,说白了就是用10个bit传8个bit的数据。多出来的2个bit干嘛用?一是保证DC平衡,二是提供足够的跳变沿让CDR锁定。你想想看,如果数据全是0或者全是1,CDR就失去参考了,锁不住。

注意:8B/10B编码的效率只有80%。对于更高速度的链路(比如25Gbps以上),通常会改用64B/66B或128B/130B编码,效率更高,但实现也更复杂。

3.3 时钟架构:收发器的心脏

时钟,是高速收发器的命脉。没有稳定的时钟,一切都是空谈。

收发器的时钟架构通常包含以下几个层级:

  1. 参考时钟(RefClk):从外部晶振或时钟芯片输入,频率通常为125MHz、156.25MHz或312.5MHz。
  2. PLL倍频:参考时钟进入PLL后,倍频到线速率。比如10Gbps链路,PLL输出时钟就是10GHz。
  3. 分频与相位调整:PLL输出时钟经过分频,得到并行时钟(如322.58MHz),用于PCS层和FPGA逻辑。
  4. CDR恢复时钟:接收端从数据中恢复出时钟,用于采样和弹性缓冲。

这里有个关键点——参考时钟的质量,直接决定了整个链路的性能。我见过太多人,花大价钱买高端FPGA,却在参考时钟上省钱,结果链路死活跑不上去。

参考时钟要求:

  • 抖动:RMS抖动通常要求小于1ps(峰峰值小于10ps)
  • 精度:频率偏差需在±100ppm以内,建议使用±50ppm的晶振
  • 上升/下降时间:通常要求小于2ns
  • 占空比:45%~55%之间

3.4 参考时钟的选型与布局

选参考时钟,我一般遵循这几个原则:

  • 优先用差分时钟:LVDS或LVPECL差分信号,抗共模噪声能力强。单端时钟容易受干扰。
  • 时钟源尽量靠近收发器:走线越短,引入的噪声和抖动越少。
  • 避免共享时钟:多个收发器如果共享同一个参考时钟,要注意时钟扇出带来的skew。
  • 注意电源噪声:时钟芯片的供电要单独滤波,别跟数字电路混在一起。

避坑指南:我曾经在一个项目里,收发器偶尔出现误码,查了三天没找到原因。后来用示波器一看,参考时钟上有个周期性的毛刺。原来是时钟芯片的电源滤波电容焊错了位置。换了个电容,问题立刻消失。嗯,电源完整性,永远不能忽视。

3.5 时钟域的划分与处理

收发器内部,时钟域划分是个大学问。简单来说,有这么几个时钟域:

  • PMA时钟域:高速串行时钟,频率等于线速率。这个域里全是模拟电路。
  • PCS时钟域:并行时钟,频率等于线速率除以串化因子(如10Gbps/16=625MHz)。
  • FPGA接口时钟域:用户逻辑侧的时钟,通常由收发器提供,也可以由用户自己生成。

跨时钟域处理,最常用的就是弹性缓冲。弹性缓冲本质上是一个异步FIFO,读写时钟分别来自PCS时钟域和FPGA接口时钟域。缓冲深度决定了能容忍的时钟偏差大小。

我个人的习惯是,弹性缓冲深度至少设到16个字节。太浅的话,一旦时钟偏差稍大,缓冲就会溢出或下溢,导致数据丢失。当然,深度越大,延迟也越大,这个需要权衡。

3.6 常见时钟问题与排查

在实际调试中,时钟相关的问题占了收发器故障的很大比例。我总结了几种常见情况:

现象 可能原因 排查方法
PLL无法锁定 参考时钟频率不对、抖动过大、电源噪声 用示波器测参考时钟波形,检查频率和抖动
CDR失锁 数据跳变沿不足、信号质量差、参考时钟偏差大 检查数据是否连续相同码字,调整均衡参数
误码率偏高 时钟抖动大、时钟域同步问题、电源噪声 用BERT测试,逐级排查时钟路径
弹性缓冲溢出 收发两端时钟频率偏差过大 检查参考时钟精度,调整缓冲深度

排查时钟问题,我有个习惯——先看参考时钟,再看PLL输出,最后看CDR恢复时钟。用示波器看波形,用频谱仪看相位噪声,一步步缩小范围。别一上来就怀疑芯片坏了,时钟出问题的概率大得多。

重要提醒:参考时钟的PCB走线,一定要做阻抗控制(通常50Ω单端或100Ω差分)。走线要远离其他高速信号,避免串扰。时钟走线两侧最好加地孔屏蔽。这些细节,决定了你的链路能不能稳定工作。

好了,关于收发器的内部结构和时钟架构,今天就聊到这儿。PMA和PCS的分工,参考时钟的重要性,这些是理解高速链路的基础。下次遇到链路问题,先别急着调参数,回头看看时钟——往往问题就出在最基础的地方。


公众号:蓝海资料掘金营,微信deep3321