3、SerDes核心架构:PCS层与PMA层划分、8B/10B编码原理、时钟数据恢复(CDR)概念、串行器与解串器结构

好,咱们今天聊聊SerDes的核心架构。说实话,很多刚接触高速接口的工程师,一上来就被PCS、PMA这些缩写搞晕了。我当年也一样,看了半天文档,脑子里还是一团浆糊。其实没那么复杂,咱们把它拆开看。

3.1 PCS层与PMA层:分工明确的搭档

SerDes架构,说白了就是两个大模块:PCS(物理编码子层)和PMA(物理介质接入层)。你可以这么理解——PCS负责“动脑子”,PMA负责“干体力活”。

PCS层处理的是数字逻辑,比如8B/10B编码、对齐、加扰这些。而PMA层呢,它处理的是模拟信号,比如时钟生成、串行化、驱动差分线。我在项目中遇到过一个问题:PCS和PMA之间的接口时序没对齐,结果数据老是丢包。后来发现是PCS输出的并行数据没有跟PMA的时钟域同步好。嗯,这里要注意,跨时钟域处理一定要做扎实。

核心划分:

  • PCS层:数字逻辑,负责编码、解码、对齐、加扰/解扰
  • PMA层:模拟电路,负责串行化/解串、时钟生成、驱动/接收

你想想看,如果没有PCS层,PMA直接裸奔,那数据在传输过程中遇到连续0或连续1,时钟恢复就完蛋了。所以PCS层做的编码工作,其实是在帮PMA层的CDR(时钟数据恢复)铺路。

3.2 8B/10B编码原理:为什么非要多出2位?

8B/10B编码,名字就告诉你了:把8位数据变成10位数据。多出来的2位不是浪费,而是为了保证DC平衡和提供足够的跳变沿。

我刚开始学的时候也纳闷:直接传8位不行吗?为什么非要搞成10位?后来做了一次眼图测试就明白了——如果数据流里连续出现5个以上的相同电平,接收端的CDR就锁不住了。8B/10B编码能保证最多连续5个相同电平,这就是它的价值。

编码原理其实不复杂。8位数据拆成3位和5位两部分:

  • 3位(ABC)通过3B/4B编码变成4位
  • 5位(EDCBA)通过5B/6B编码变成6位

合起来就是10位。编码表里每个8位数据对应两个10位码字,一个“正极性”(1比0多),一个“负极性”(0比1多)。编码器会根据当前“运行差异”(RD)选择其中一个,保证总体DC平衡。

我的经验: 在FPGA里实现8B/10B编码,别自己写逻辑,直接用IP核或者原语。Xilinx的GTX/GTH收发器内部已经集成了编码器,你只需要配置好就行。自己写的话,时序很难收敛,尤其是高速率下。

解码就更简单了。收到10位码字后,查表或者用组合逻辑还原回8位数据。同时检查是否有无效码字——如果有,说明传输出错了。这就是8B/10B编码的另一个好处:内建错误检测能力。

3.3 时钟数据恢复(CDR):从数据流里“榨”出时钟

CDR,全称Clock Data Recovery。它的任务是从串行数据流中提取出时钟信号。为什么需要这个?因为发送端和接收端没有独立的时钟线,只有一对差分数据线。接收端必须自己从数据里“猜”出时钟来。

CDR的核心是一个锁相环(PLL),但它跟普通的PLL不太一样。普通PLL输入是参考时钟,CDR的输入是数据流。CDR会检测数据流的跳变沿,然后调整本地VCO(压控振荡器)的频率和相位,让采样时钟正好对准数据眼的中心。

我记得有一次调试,眼图看起来很好,但误码率就是降不下来。折腾了两天,最后发现是CDR的环路带宽设得太宽了,把噪声也锁进去了。后来把带宽收窄,问题就解决了。所以CDR的环路参数一定要根据数据速率和抖动特性来调,不能照搬参考设计。

避坑指南: 我曾经在低速率(比如1Gbps以下)用CDR时踩过坑。低速率的跳变沿少,CDR容易失锁。解决方案是加扰码器,保证数据流有足够的跳变沿。或者用参考时钟辅助CDR锁定。

CDR的工作流程大致是这样的:

  1. 检测数据跳变沿
  2. 与本地时钟比较相位差
  3. 调整VCO频率/相位
  4. 用调整后的时钟采样数据
  5. 循环往复,保持锁定

说白了,CDR就是一个不断“猜-调整-再猜”的过程。只要数据流里有足够的跳变沿,它就能一直锁定。

3.4 串行器与解串器结构:并转串,串转并

串行器(Serializer)把并行数据变成串行数据,解串器(Deserializer)反过来。听起来简单,但实现起来有不少门道。

串行器的核心是一个移位寄存器加一个并转串多路器。并行数据先锁存到寄存器里,然后按位依次输出。输出速率是输入速率的N倍(N是并行位宽)。比如10位并行数据,输入时钟100MHz,输出就是1GHz的串行数据。

解串器呢,它需要先恢复出时钟,然后用这个时钟去采样串行数据,再把采到的数据拼成并行数据。这里有个关键点:位对齐。解串器怎么知道哪一位是并行数据的起始位?这就需要PCS层的对齐机制了——通常是用特殊的K码字(比如逗号序列)来标记边界。

下面我画了一张图,帮你理清整个SerDes的数据流:

SerDes核心架构数据流 发送PCS层 8B/10B编码 加扰/对齐 发送PMA层 串行器 时钟生成 差分对 接收PMA层 解串器 CDR 接收PCS层 8B/10B解码 解扰/对齐 并行数据 并行数据 并行输入 串行输出 并行输出 参考时钟 PLL倍频 时钟恢复

从图上你能看到,数据从并行输入开始,经过PCS编码,再到PMA串行化,通过差分线传输。接收端先用CDR恢复时钟,然后解串,最后PCS解码还原出并行数据。整个流程环环相扣,哪一环出问题都不行。

我的建议: 调试SerDes时,先确认PMA层能锁定(看CDR锁定指示),再看PCS层的对齐状态。如果CDR都没锁住,后面的解码肯定全是错的。别一上来就查数据对不对,先看底层状态。

关于串行器的结构,还有一种双沿采样的方式。比如DDR SerDes,在时钟的上升沿和下降沿都传输数据,这样可以在同样的时钟频率下把数据率翻倍。但代价是时序裕量更紧张,对PCB走线的要求也更高。

解串器这边,除了位对齐,还有字对齐的问题。字对齐通常靠检测特殊的K码字来实现。比如8B/10B编码里的K28.5(逗号序列),它在10位码字里是唯一的,解串器一旦检测到它,就知道这是一个并行字的边界。

好了,这一章的内容就到这里。SerDes的核心架构其实就这些:PCS和PMA的分工、8B/10B编码的原理、CDR怎么从数据里恢复时钟、串行器和解串器怎么工作。把这些搞清楚了,后面再讲具体的协议(比如PCIe、SATA、Ethernet)就容易多了。

可可精品资料库