第三章:高速收发器架构——PMA层与PCS层详解

各位工程师朋友,今天我们来聊聊高速收发器最核心的部分——PMA层和PCS层。说实话,我刚接触SerDes时,也被这两层的分工搞得有点晕。后来自己动手调过几次链路,才真正明白它们各自扮演的角色。

简单来说,PMA层负责物理信号的传输,PCS层负责数据的编码和解码。打个比方:PMA就像高速公路的路面,PCS就像路上的交通规则。路面不好,车跑不起来;规则不对,车会撞在一起。

高速收发器架构总览 PMA层(物理介质适配) PLL/CDR 时钟生成与恢复 SerDes 串行/解串器 TX/RX Buffer 发送/接收缓冲 Equalizer 均衡器 PCS层(物理编码子层) 8B/10B编码 DC平衡编码 Scrambler 扰码器 FIFO 时钟域缓冲 Comma检测 字对齐 数据流 PMA层处理模拟信号,PCS层处理数字信号

一、PMA层——物理介质适配

PMA层,全称Physical Media Attachment。它直接和物理介质打交道,比如PCB走线、同轴电缆、光纤等。我个人的理解是,PMA层负责把数字信号变成模拟信号送出去,再把模拟信号变回数字信号收回来。

1.1 发送链路(TX PMA)

发送链路的核心任务就一个:把并行数据变成高速串行数据,然后驱动出去。具体包含以下几个关键模块:

  • Serializer(串化器):把N位并行数据转成1位串行数据。比如10Gbps的链路,内部可能是40位@250MHz,串化后变成1位@10GHz。
  • TX Buffer(发送缓冲器):提供足够的驱动电流,克服PCB走线的损耗。这里有个坑——摆幅设置。摆幅太大,EMI超标;摆幅太小,远端收不到。
  • Pre-emphasis/De-emphasis(预加重/去加重):补偿高频损耗。我在项目中遇到过,预加重系数调太大,信号过冲严重,反而导致眼图闭合。

关键参数:

参数典型值说明
差分输出电压400~1200 mVpp根据链路长度调整
预加重强度0~6 dB补偿高频损耗
上升/下降时间20~80 ps影响EMI和信号质量

1.2 接收链路(RX PMA)

接收链路比发送链路复杂得多。信号经过长距离传输后,已经变得面目全非。接收端要做的事情,就是从一堆噪声和失真中把原始数据恢复出来。

  • CTLE(连续时间线性均衡器):放大高频分量,补偿信道损耗。说白了就是一个高通滤波器。
  • DFE(判决反馈均衡器):消除码间干扰(ISI)。我记得第一次调DFE时,抽头系数怎么都收敛不了,后来发现是参考时钟抖动太大。
  • CDR(时钟数据恢复):从数据中提取时钟。这是PMA层最核心的模块。没有CDR,接收端根本不知道什么时候该采样。
  • Deserializer(解串器):把1位高速串行数据转回N位并行数据。

个人经验:调试接收链路时,先看CDR是否锁定。如果CDR没锁,后面所有数据都是错的。我习惯用示波器看CDR的锁定指示信号,确认锁定后再看眼图。

二、PCS层——物理编码子层

PCS层在PMA层之上,处理的是数字域的逻辑。它的主要职责是保证数据在传输过程中的可靠性。你想想看,如果直接传原始数据,遇到连续0或连续1,CDR会失锁的。

2.1 发送链路(TX PCS)

发送PCS的处理流程一般是这样的:

  1. Scrambler(扰码器):把数据随机化,避免长连0或长连1。我见过一个案例,客户没开扰码,结果传输视频数据时,画面静止区域全是0,CDR直接失锁。
  2. 8B/10B编码:把8位数据编码成10位。好处是保证DC平衡,同时提供足够的跳变沿给CDR。代价是20%的带宽开销。
  3. FIFO缓冲:跨时钟域处理。PCS时钟和PMA时钟可能不同步,FIFO用来吸收相位差。
  4. Comma插入:插入特殊的对齐字符(比如K28.5),用于接收端字对齐。
// 8B/10B编码示例(Verilog风格)
// 输入:data_in[7:0], 输出:data_out[9:0]
always @(posedge clk) begin
    case (data_in)
        8'h1C: data_out <= 10'b001111_1010; // K28.5 Comma字符
        8'hBC: data_out <= 10'b110000_0101; // K28.5 取反
        default: data_out <= encode_8b10b(data_in); // 普通数据编码
    endcase
end

2.2 接收链路(RX PCS)

接收PCS是发送PCS的逆过程,但多了一个关键步骤——字对齐。

  • Comma检测:在比特流中寻找特殊的Comma字符。找到后,就知道字节边界在哪里了。
  • 字对齐:根据Comma位置,调整解串器的输出对齐。我曾经被坑过一次——Comma检测器误触发,导致对齐错误,整个链路的数据全乱了。
  • 8B/10B解码:把10位码字还原成8位数据。同时检查编码错误,如果发现无效码字,就报错。
  • Descrambler(解扰器):恢复原始数据。

注意:8B/10B编码不是万能的。它只能保证DC平衡,不能纠错。如果链路误码率很高,8B/10B解码器会频繁报错,这时候需要上层协议(如CRC)来保证数据完整性。

三、发送链路与接收链路的完整数据流

把PMA和PCS串起来,整个收发链路的数据流是这样的:

发送方向:

用户数据 → PCS扰码 → 8B/10B编码 → Comma插入 → FIFO缓冲 → PMA串化 → 预加重 → 驱动输出

接收方向:

输入信号 → CTLE均衡 → CDR时钟恢复 → DFE均衡 → 解串 → Comma检测 → 字对齐 → 8B/10B解码 → 解扰 → 用户数据

嗯,这里要注意:发送和接收的时钟域是独立的。发送用本地参考时钟,接收用CDR恢复的时钟。这两个时钟频率可能不完全一样,所以FIFO的设计很关键。

避坑指南:我曾经在一个项目中,发送端用了100MHz的参考时钟,接收端CDR恢复出100.001MHz。虽然只差了10ppm,但跑一小时后,FIFO就溢出了。后来加了弹性缓冲和时钟补偿机制才解决。

四、实际调试中的常见问题

最后分享几个我在项目中遇到的典型问题:

  1. 眼图闭合:先检查预加重和CTLE设置。如果还不行,看看PCB走线是不是太长,或者过孔太多。
  2. CDR无法锁定:大概率是参考时钟有问题。用频谱仪看看时钟的相位噪声。
  3. 误码率居高不下:先排除PMA层问题,再检查PCS层的字对齐是否正确。
  4. 链路间歇性断开:可能是电源噪声太大。我遇到过DC-DC转换器的开关噪声耦合到收发器电源上,导致CDR周期性失锁。

好了,关于PMA层和PCS层的架构就讲到这里。这些内容看起来理论性很强,但实际调试时,每个模块都可能成为瓶颈。多动手、多观察波形,慢慢就能建立起直觉。

可可精品资料库