FPGA 高速接口基础:SERDES 不是“并串转换器”这么简单

摘要

很多 FPGA 初学者第一次接触 SERDES,都会把它理解成"并串转换器"或者"串并转换器"。

这个理解不能算错,但太窄了。

在真实 FPGA 项目里,SERDES 更应该被理解成一条完整的高速收发链路。它不只是把并行数据变成串行数据,也负责高速信号收发、时钟恢复、均衡、编码解码、字节对齐、通道绑定、调试和动态配置等一整套工作。

如果只把 SERDES 当普通 IO 使用,很容易出现一种典型现象:

仿真看起来没问题,IP 配置也没报错,但板子上链路就是起不来;

或者眼图不够好、CDR 不锁定、协议层一直报错、lane 对齐失败。

这篇文章从 FPGA 工程视角出发,梳理 SERDES 到底是什么、解决什么问题、内部链路怎么走,以及 PMA 和 PCS 这两个最容易混淆的核心概念。


一、SERDES 到底是什么?

SERDES 是 Serializer / Deserializer 的缩写,字面意思是"串行器 / 解串器"。

从名字看,它好像只做两件事:

  • TX 方向:把并行数据变成串行数据;

  • RX 方向:把串行数据恢复成并行数据。

但在 FPGA 高速接口里,SERDES 远不止这点功能。

更准确地说,SERDES 是 FPGA 内部用于高速串行通信的 transceiver,也就是高速收发器。它通常包含:

  • PMA;

  • PCS;

  • 参考时钟;

  • PLL;

  • CDR;

  • 均衡器;

  • 串化器 / 解串器;

  • 编码 / 解码;

  • 字对齐 / lane 对齐;

  • 缓冲和速率匹配;

  • 复位控制;

  • 动态重配置接口;

  • 调试接口;

  • 与 FPGA fabric 的并行数据接口。

所以,SERDES 不应该只被看成"一个转换器",而应该被看成"高速链路的物理层发动机"。

普通 GPIO 更像乡村小路:速度低、规则简单、问题直观。

SERDES 更像高速公路:速度快、车道多、收费站多、限速规则多,任何一个环节没配置好,车都跑不起来。


二、SERDES 解决了什么问题?

SERDES 解决的核心问题是:

如何用更少的引脚、更少的走线,传输更高的数据带宽。

假设系统里有一条 64bit 并行总线,如果想跑到很高频率,会遇到一堆麻烦:

  • 需要大量 FPGA 引脚;

  • PCB 走线非常密;

  • 多根线之间很难做到严格等长;

  • 时钟和数据同步压力很大;

  • 并行总线频率越高,EMI 越难控制;

  • 板级布局布线成本上升;

  • 接口扩展性变差。

SERDES 的思路是反过来:

不要铺一大片并行线,而是把数据打包成高速串行比特流,通过一对或几对差分线传出去。

例如,一条 lane 可以理解为一条高速差分通道:

复制代码
并行数据  -->  编码/扰码  -->  串化  -->  差分通道  -->  时钟恢复  -->  解串  -->  对齐/解码  -->  并行数据

这样做的好处很明显:

  • 引脚数量减少;

  • PCB 走线减少;

  • 差分信号抗干扰能力更强;

  • 更适合跨芯片、跨板卡、跨连接器传输;

  • 带宽更容易继续往上扩展。

所以在 FPGA 项目中,只要你碰到下面这些接口,大概率就绕不开 SERDES:

  • PCIe;

  • Ethernet;

  • JESD204B / JESD204C;

  • SATA / SAS;

  • Aurora;

  • Interlaken;

  • CPRI / eCPRI;

  • 高速 ADC / DAC 接口;

  • 板间高速互连;

  • 光模块接口。

这些协议看起来名字不同,但底层都离不开高速串行链路。


三、用一条 lane 看 SERDES 内部结构

理解 SERDES,最简单的方法是抓住一条 lane。

一条 lane 可以粗略理解为一组 TX/RX 高速收发通道,通常包括一对发送差分线和一对接收差分线。实际工程中,多个 lane 还可以组合成 x2、x4、x8、x16 这样的多通道链路。

1. RX 方向:先把高速串行信号"救回来"

RX 方向的大致路径是:

复制代码
高速差分输入
    ↓
输入终端 / 接收 buffer
    ↓
CTLE / DFE 均衡
    ↓
CDR 时钟数据恢复
    ↓
Deserializer 解串
    ↓
字节对齐 / 字对齐
    ↓
解码 / 去扰码 / 速率匹配
    ↓
送入 FPGA fabric

这里最关键的是 CDR。

高速串行链路通常不会单独传一根数据时钟线,而是把时钟信息"藏"在数据跳变里。接收端需要通过 CDR,也就是 Clock Data Recovery,从数据流中恢复采样时钟。

这也是为什么高速协议经常要使用编码或扰码。

如果数据长时间不跳变,比如一直是 0 或一直是 1,接收端就很难恢复时钟。编码和扰码的作用之一,就是让数据流保持足够多的跳变,帮助接收端稳定锁定。

均衡也很重要。

高速信号经过 PCB、连接器、线缆或背板后,高频分量会被衰减,波形会变钝,码间干扰会变严重。CTLE、DFE 这类均衡模块,就是在接收端尽量把被通道"揉皱"的波形恢复回来。

可以把 RX 想象成收快递:

  • 差分输入是快递车到门口;

  • 均衡是把被压坏的箱子尽量整理好;

  • CDR 是找回正确的节奏;

  • 解串是把一长串包裹重新拆成一排排数据;

  • 对齐和解码是确认每个包裹的边界和内容;

  • fabric 接口才是最终交给业务逻辑处理。

2. TX 方向:把 fabric 数据变成能跑高速通道的比特流

TX 方向的大致路径是:

复制代码
FPGA fabric 并行数据
    ↓
编码 / 加扰 / Gearbox / Buffer
    ↓
Serializer 串化
    ↓
TX Driver
    ↓
高速差分输出

TX 看起来比 RX 简单一些,但也不是"直接串起来发出去"这么粗暴。

发送端通常要处理这些问题:

  • 数据位宽转换;

  • 编码,比如 8b/10b、64b/66b;

  • 加扰,避免数据模式过于单一;

  • gearbox,解决协议位宽和物理位宽不匹配;

  • TX swing;

  • pre-emphasis / de-emphasis;

  • 输出极性;

  • lane 绑定;

  • TX PLL 和参考时钟配置。

如果 RX 像收快递,TX 就像发快递:

业务逻辑给你的是一堆原始货物,SERDES 不能直接扔上高速路。它要先打包、贴标签、排队、装车,然后再按高速链路能接受的方式发出去。


四、PMA 和 PCS:理解 SERDES 的关键分界线

学习 SERDES 时,最容易混淆的两个词就是 PMA 和 PCS。

可以先记住一句话:

PMA 管"比特怎么在物理通道上跑",PCS 管"这些比特怎么变成协议能理解的数据"。

1. PMA:更靠近物理世界

PMA 是 Physical Medium Attachment,可以理解为更靠近模拟电路和位级链路的一层。

它通常负责:

  • TX/RX 模拟前端;

  • 终端匹配;

  • PLL;

  • CDR;

  • 串化器;

  • 解串器;

  • CTLE;

  • DFE;

  • 发送端预加重;

  • 接收端均衡;

  • loopback;

  • 眼图监测;

  • PMA direct 模式;

  • 与物理差分管脚相关的配置。

PMA 关心的是:

这个高速比特流能不能在真实通道上稳定传过去?

所以,PMA 层的问题通常表现为:

  • CDR 不锁;

  • RX loss of signal;

  • BER 高;

  • 眼图差;

  • 链路偶发错误;

  • 温度、电压、板间差异导致不稳定;

  • 同一套逻辑在一块板上能跑,换一块板就不稳。

这些问题往往不是 RTL 仿真能直接看出来的,而是需要结合参考时钟、PCB、SI、PLL、均衡参数和调试工具一起看。

2. PCS:更靠近数字协议

PCS 是 Physical Coding Sublayer,可以理解为 PMA 和上层协议之间的数字整理层。

它通常负责:

  • 8b/10b 编码 / 解码;

  • 64b/66b 编码 / 解码;

  • scramble / descramble;

  • block alignment;

  • word alignment;

  • comma detection;

  • rate match FIFO;

  • channel bonding;

  • lane alignment;

  • gearbox;

  • error detection;

  • 协议辅助逻辑。

PCS 关心的是:

这些比特能不能被正确分组、对齐、解释,并交给上层协议?

PCS 层的问题通常表现为:

  • PMA 已经锁定,但协议层 link 不起来;

  • comma 找不到;

  • block lock 失败;

  • lane 顺序错;

  • 多 lane deskew 失败;

  • 8b/10b disparity error;

  • 64b/66b block error;

  • FIFO underflow / overflow;

  • 上层 MAC 或协议 IP 一直报错。

这也是很多新手容易踩坑的地方:

CDR 锁了,不代表协议通了;PMA 通了,不代表 PCS 通了;PCS 通了,也不代表上层应用一定对。

链路是分层的,调试也必须分层。


五、为什么"链路通了"不等于"协议通了"?

在高速接口调试中,经常听到几句话:

"PLL lock 了。"

"CDR lock 了。"

"RX 有数据了。"

"PRBS 能过。"

"但是协议就是起不来。"

这其实很正常。

因为这些状态对应的是不同层次。

1. PLL lock

说明参考时钟和 PLL 配置大概率没有明显问题,但它只能证明"时钟系统初步工作"。

它不能证明数据能正确收发。

2. CDR lock

说明 RX 端大概率已经能从串行输入中恢复时钟。

但 CDR lock 只能说明"比特流节奏可能对了",不能说明字节边界一定对,也不能说明协议帧一定对。

3. PRBS 通过

PRBS 测试通常用于验证物理链路质量,例如误码率。

它很适合判断 PMA 层是否健康,但它不代表实际协议已经配置正确。

4. Block lock / align done

这类状态更接近 PCS 层,说明接收端已经能识别数据块边界或 lane 对齐关系。

但即便 PCS 状态正常,上层协议仍可能因为复位顺序、配置寄存器、训练状态机、速率协商等问题失败。

所以,调试 SERDES 时不要只问一句"链路通没通",而应该问:

复制代码
PLL 锁了吗?
CDR 锁了吗?
PMA loopback 能过吗?
PRBS 能过吗?
字对齐完成了吗?
PCS block lock 了吗?
多 lane 对齐了吗?
协议训练完成了吗?
上层数据路径正常吗?

这套问题比一句"为什么不通"更有价值。


六、SERDES 与普通 IO 的最大区别

普通 IO 的问题,很多时候是逻辑问题。

SERDES 的问题,经常是系统问题。

它同时牵涉:

  • FPGA 器件选型;

  • transceiver lane 分配;

  • 参考时钟频率和抖动;

  • PLL 类型和资源;

  • IP 参数;

  • reset sequence;

  • PCB 走线;

  • 差分阻抗;

  • AC coupling;

  • 连接器和线缆;

  • 电源噪声;

  • 均衡参数;

  • 协议层训练;

  • 调试工具。

也就是说,SERDES 不是一个"RTL 模块",而是一个跨越芯片、板级、时钟、电源、协议和软件配置的完整系统。

这也是为什么很多 FPGA 高速接口问题,不能只靠看 Verilog 解决。

你可能需要同时看:

  • RTL;

  • IP 配置;

  • XDC / SDC 约束;

  • device handbook;

  • board schematic;

  • PCB layout;

  • IBIS-AMI 或 SI 报告;

  • transceiver debug log;

  • 协议 IP 状态寄存器;

  • 示波器眼图;

  • 误码率测试结果。

调 SERDES 很像查案。

RTL 只是现场之一,不是整个案发过程。


七、初学 SERDES 应该先抓住哪些主线?

如果刚开始接触 SERDES,不建议一上来就陷进上千页 user guide 里。

可以先抓住五条主线。

1. 先分清 PMA 和 PCS

这是第一优先级。

看到问题时先判断:

这是物理位级问题,还是数字编码 / 对齐 / 协议问题?

如果 CDR 都不锁,先别急着查 MAC。

如果 PRBS 能过但协议不通,就要重点看 PCS 和上层协议状态。

2. 先单 lane,再多 lane

多 lane 问题更复杂,因为会多出 lane bonding、deskew、lane polarity、lane reversal、通道顺序等问题。

新手调试时,能单 lane 验证就先单 lane 验证。

3. 先 loopback,再外部链路

常见调试顺序可以是:

复制代码
内部 PCS loopback
    ↓
内部 PMA loopback
    ↓
近端板级 loopback
    ↓
远端外部链路
    ↓
真实协议互通

这样可以逐步缩小问题范围。

4. 先 PRBS,再协议

PRBS 是判断高速物理链路质量的好工具。

如果 PRBS 都过不了,说明物理层大概率还有问题。

这时直接调协议,容易越调越乱。

5. 先看复位和时钟

SERDES IP 很多问题不是数据路径错,而是复位和时钟顺序错。

例如:

  • refclk 没稳定就释放 reset;

  • TX PLL 未锁就启动发送;

  • RX CDR 未锁就开始对齐;

  • reset 信号跨时钟域处理不规范;

  • IP 要求的 reset sequence 没按文档做。

高速接口里,复位不是"拉一下就完事"。

很多时候,复位顺序本身就是协议的一部分。


八、一个简单记忆模型

可以把 SERDES 链路想象成一条高速物流系统。

层次 类比 负责内容
PMA 高速公路和车辆 信号、电气、时钟恢复、均衡、串并转换
PCS 分拣中心 编码、解码、对齐、分组、lane 整理
Protocol IP 业务系统 PCIe、Ethernet、JESD204 等协议行为
User Logic 用户应用 真正的数据处理逻辑

如果高速公路塌了,分拣中心再聪明也没用。

如果分拣规则错了,车能到站也分不出正确包裹。

如果业务系统配置错了,底层全绿,上层照样不工作。

这就是 SERDES 调试的基本逻辑:

一层一层确认,不要跨层猜 bug。


九、总结

SERDES 不是简单的并串转换器,而是 FPGA 高速通信中的完整收发链路。

它解决的是高速数据传输中的引脚数量、走线复杂度、同步压力、功耗和 EMI 等问题。它背后支撑的是 PCIe、Ethernet、JESD204、SATA、Aurora、Interlaken 等一系列高速接口。

理解 SERDES,重点不是背多少寄存器,而是先建立分层认知:

  • PMA 更靠近物理通道,关注信号、电气、PLL、CDR、均衡和串并转换;

  • PCS 更靠近数字协议,关注编码、解码、对齐、gearbox、FIFO 和 lane 整理;

  • PMA 通了,不代表 PCS 通;

  • PCS 通了,不代表协议通;

  • 协议通了,才轮到用户逻辑稳定传数据。

如果只记一句话,可以记这个:

SERDES 是 FPGA 里的高速公路系统,PMA 负责让比特跑起来,PCS 负责让比特排好队,协议层负责让数据真正说得通。

对 FPGA 工程师来说,学 SERDES 的目标不是"会点 IP 配置",而是能在链路不通时判断问题在哪一层。

这才是从"能用 SERDES"到"能调 SERDES"的分水岭。