摘要
很多 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"的分水岭。