第1章:收发器物理层架构——PMA与PCS深度解析

各位同学,今天咱们来啃一块硬骨头——收发器的物理层架构。说实话,我刚接触高速收发器那会儿,看着PMA、PCS这些缩写也是一头雾水。但后来我发现,搞懂这两层,基本就掌握了收发器80%的核心。

1.1 PMA层:模拟信号的“硬核”战场

PMA层,全称Physical Media Attachment,说白了就是处理模拟信号的那部分。它负责把数字信号变成高速串行比特流,再通过差分对送出去。反过来,接收端也要把进来的模拟信号恢复成数字信号。

1.1.1 PLL——时钟的“心脏”

PLL(锁相环)是整个收发器的时钟源。没有它,Serializer和Deserializer就是一堆废铁。PLL的核心功能有两个:一是频率合成,二是时钟恢复。

频率合成这块,我习惯用这个公式来估算:

输出频率 = 参考频率 × (N/M) × (1/K)

其中N是反馈分频比,M是参考分频比,K是输出分频比。举个例子,如果参考时钟是100MHz,N=20,M=1,K=1,那输出就是2GHz。

关键参数:PLL的抖动性能直接决定了收发器的误码率。我在项目中遇到过,PLL抖动大了0.5ps,误码率就从10^-12飙升到10^-9,直接导致链路不稳定。

1.1.2 Serializer——并转串的“魔术师”

Serializer的作用很简单:把并行数据变成串行数据。但实现起来并不简单。以Xilinx的GTH收发器为例,它支持从16位到40位的并行数据宽度,串行化后变成1位高速数据流。

我给大家画个图,看看Serializer的内部结构:

Serializer 并行数据输入 (16~40位) 串行数据输出 (1位高速) PLL时钟

Serializer的工作流程是这样的:

  1. PLL产生高速时钟(比如2GHz)
  2. 并行数据在低速时钟域(比如125MHz)被锁存
  3. 通过移位寄存器,逐位输出到高速时钟域
  4. 最终输出1位串行数据流

个人经验:我曾经在调试一个10Gbps链路时,发现Serializer输出眼图很差。后来发现是并行数据时序没对齐,导致串行化时出现了毛刺。解决办法是在并行数据路径上加了一级FIFO做同步。

1.1.3 Deserializer——串转并的“还原大师”

Deserializer是Serializer的逆过程。它把进来的高速串行数据,恢复成并行数据。这里有个关键点:时钟恢复。

接收端没有独立的时钟源,必须从数据流中提取时钟。这就是CDR(Clock Data Recovery)电路干的事。CDR的原理很简单:

  • 检测数据边沿跳变
  • 用PLL锁定数据频率
  • 生成与数据同步的采样时钟

嗯,这里要注意:CDR的锁定时间一般在几微秒到几十微秒。如果链路频繁断开重连,这个时间会直接影响系统响应。

1.2 PCS层:数字信号的“逻辑战场”

PCS层,全称Physical Coding Sublayer。它处理的是数字逻辑,负责编码、解码、缓冲、修正这些活儿。说白了,PCS层就是给原始数据“穿衣服”,让它们能在物理链路上可靠传输。

1.2.1 8B/10B编码——直流平衡的“艺术”

8B/10B编码,就是把8位数据变成10位码字。为什么要多出2位?为了保持直流平衡。你想想看,如果数据流中连续出现多个0或1,接收端的电容耦合就会出问题。

8B/10B编码的规则:

  • 8位数据拆成3位和5位两部分
  • 3位部分编码成4位(3B/4B)
  • 5位部分编码成6位(5B/6B)
  • 组合成10位码字

编码后的码字有两大好处:

  1. 最多连续5个相同的比特
  2. 0和1的数量差不超过2

避坑指南:我曾经在项目中直接用8B/10B编码表做查找表,结果发现资源消耗太大。后来改用组合逻辑实现,面积减少了60%。建议你们也这么做。

1.2.2 弹性缓冲——跨时钟域的“桥梁”

弹性缓冲(Elastic Buffer)解决的是时钟域同步问题。发送端和接收端的时钟不可能完全同频同相,总会有微小偏差。弹性缓冲就是用来吸收这些偏差的。

弹性缓冲的工作原理:

  • 写入时钟:恢复时钟(从数据中提取)
  • 读出时钟:本地参考时钟
  • 缓冲深度:一般8~16个字符

我习惯把弹性缓冲比作一个水池。写入数据就像往池子里注水,读出数据就像往外抽水。如果注水速度比抽水快,池子就会满;反之就会空。弹性缓冲就是通过调整读写指针,让池子始终保持半满状态。

注意:弹性缓冲溢出或欠载,都会导致数据错误。我在调试一个40Gbps链路时,就因为时钟偏差太大,弹性缓冲频繁溢出,误码率居高不下。后来通过调整PLL的带宽才解决。

1.2.3 时钟修正——消除频率偏差

时钟修正(Clock Correction)是弹性缓冲的补充。当频率偏差超过弹性缓冲的容忍范围时,就需要插入或删除空闲字符来调整。

时钟修正的流程:

  1. 检测弹性缓冲的水位
  2. 如果水位过高,删除一个空闲字符
  3. 如果水位过低,插入一个空闲字符
  4. 修正完成后,恢复数据传输

这里有个关键参数:修正间隔。一般每传输几千个字符才修正一次,所以对吞吐量的影响微乎其微。

1.3 TX与RX路径:独立性与关联性

收发器的TX和RX路径,既有独立性,又有关联性。理解这一点,对调试链路非常重要。

1.3.1 独立性

TX和RX路径在物理上是独立的:

  • TX有自己的PLL、Serializer、驱动器
  • RX有自己的CDR、Deserializer、均衡器
  • TX和RX可以工作在不同的数据速率

这种独立性,让收发器可以支持全双工通信。发送和接收互不干扰。

1.3.2 关联性

虽然TX和RX路径独立,但它们共享一些资源:

  • 参考时钟源(通常共用一个PLL)
  • 配置寄存器(通过同一个接口访问)
  • 电源和地(共用供电网络)

我在项目中遇到过一个问题:TX路径的串扰通过电源耦合到了RX路径,导致RX误码率升高。解决办法是在TX和RX的电源之间加磁珠隔离。

实用技巧:调试时,可以先单独测试TX路径(环回模式),再单独测试RX路径(PRBS模式)。这样能快速定位问题出在哪一侧。

1.4 本章小结

收发器的物理层架构,说白了就是PMA负责模拟信号处理,PCS负责数字信号处理。PMA的核心是PLL、Serializer、Deserializer;PCS的核心是8B/10B编码、弹性缓冲、时钟修正。TX和RX路径既有独立性,又有关联性,调试时要分开考虑。

下一章,咱们会深入讲解PLL的环路滤波器设计,这是影响抖动性能的关键。到时候我会分享一些实际项目中的调试经验。

可可精品资料库