第二讲:物理层基础——PMA与PCS架构、时钟数据恢复(CDR)原理、串行器与解串器

各位同学,欢迎来到第二讲。上一讲我们聊了高速收发器的整体框架,今天咱们深入到底层,看看物理层到底是怎么工作的。

说白了,高速收发器的物理层就是负责把并行数据变成串行比特流,扔到线上去,再从线上把歪歪扭扭的信号捞回来。这中间涉及三个核心模块:PMA、PCS,以及它们的灵魂——CDR和SerDes。

2.1 PMA与PCS:物理层的左右手

收发器的物理层通常分成两大部分:PMA(物理介质适配层)PCS(物理编码子层)。我个人习惯把它们比作「体力活」和「脑力活」的分工。

2.1.1 PMA——干粗活的

PMA负责最底层的模拟信号处理。它不关心数据是什么含义,只关心电压、电流、时序对不对。

  • 发送端PMA:把数字信号转成差分模拟信号,驱动出去。说白了就是个大功率的差分驱动器。
  • 接收端PMA:把线上微弱的差分信号放大、均衡,再送给CDR恢复时钟和数据。

我在项目中遇到过一个问题:某次板卡互联,眼图总是张不开。查了半天,发现是PMA的预加重参数没配好。嗯,这里要注意,PMA的均衡器不是越强越好,过犹不及。

2.1.2 PCS——干细活的

PCS负责数字域的编码、解码、对齐、加扰等操作。它处理的是有逻辑含义的数据。

功能 说明
8B/10B编码 把8位数据扩展成10位,保证直流平衡和足够的跳变沿
64B/66B编码 更高效率的编码方式,用于10G以上速率
通道绑定 把多个低速通道合并成一个高速通道
加扰/解扰 打散数据中的长连0或长连1,避免CDR失锁
我的经验:初学者容易忽略PCS的加扰功能。你想想看,如果发送的全是0x5555这种交替数据,CDR很开心。但如果突然来一段全0数据,CDR就抓瞎了。加扰就是为了避免这种情况。

2.2 时钟数据恢复(CDR)原理

CDR是整个收发器里最精妙的部分。它要从数据信号里把时钟「挤」出来。为什么会这样?因为高速信号没有单独的时钟线,时钟是隐含在数据跳变沿里的。

2.2.1 CDR的基本架构

典型的CDR由三个部分组成:

  • 鉴相器(PD):比较数据边沿和本地时钟的相位差
  • 环路滤波器(LF):滤除高频噪声,输出控制电压
  • 压控振荡器(VCO):根据控制电压调整输出频率

说白了,这就是个锁相环(PLL),只不过参考信号变成了数据流。

2.2.2 CDR的工作模式

CDR有两种工作模式,我当年刚接触时也搞混过:

  1. 频率捕获模式:上电时,CDR先粗调频率,让它接近数据速率。这个阶段需要参考时钟。
  2. 相位跟踪模式:频率锁定后,CDR进入精细的相位跟踪,跟随数据边沿的微小抖动。
避坑指南:我曾经遇到过一块板卡,上电后偶尔能锁定,偶尔锁不住。查了三天,发现是参考时钟的精度不够。CDR的频率捕获范围是有限的,参考时钟偏差超过±100ppm就可能锁不住。所以,选晶振时别图便宜。

2.2.3 CDR的关键指标

指标 含义 典型值
抖动容限 CDR能容忍的输入抖动幅度 0.15 UI @ 10Gbps
抖动传递 输入抖动有多少传递到输出时钟 -3dB带宽约1~10MHz
锁定时间 从失锁到重新锁定的时间 通常< 1μs

2.3 串行器与解串器(SerDes)

SerDes是Serializer/Deserializer的缩写。说白了,就是把并行数据串行化发送,再把串行数据并行化接收。

2.3.1 串行器的工作原理

串行器内部就是一个高速移位寄存器。并行数据在并行时钟下加载进去,然后在高速串行时钟下一位一位地移出来。

// 伪代码示意:8:1串行器
always @(posedge tx_clk_high) begin
    if (load_en)
        shift_reg <= parallel_data[7:0];  // 加载8位并行数据
    else
        shift_reg <= {shift_reg[6:0], 1'b0}; // 右移输出
end
assign serial_out = shift_reg[7]; // 最高位先出

实际FPGA里的串行器比这个复杂得多,但核心思想就是这个。我建议初学者先理解这个简化模型,再去啃厂商的文档。

2.3.2 解串器的工作原理

解串器是串行器的逆过程。它用CDR恢复出来的时钟,把串行数据逐位采样,然后拼成并行数据。

这里有个关键点:位对齐。串行数据没有帧头,解串器怎么知道哪一位是字节的边界?答案是靠PCS层的comma字符对齐。

核心要点:SerDes的速率匹配是通过弹性缓冲(FIFO)实现的。发送端和接收端的时钟频率可能有微小差异,这个差异由FIFO吸收。如果FIFO空了或满了,就会产生错误。

2.3.3 常见的SerDes架构

  • 并行SerDes:多路并行数据同时串行化,用于高带宽场景
  • 串行SerDes:单路数据串行化,用于点对点连接
  • 双向SerDes:同一对差分线同时收发数据(全双工)

我个人在项目中用得最多的是Xilinx的GTH/GTY收发器,它们内部集成了完整的PMA+PCS+SerDes。你只需要配置好参数,剩下的硬件自动完成。但如果你不了解底层原理,出了问题就抓瞎了。

2.4 物理层设计的常见陷阱

最后,我总结几个实际项目中容易踩的坑:

  1. AC耦合电容选型:电容太小会衰减低频分量,太大则影响建立时间。一般10nF~100nF比较合适。
  2. 参考时钟的抖动:CDR对参考时钟的抖动很敏感。我建议用专用的时钟芯片,别从FPGA内部PLL分出来。
  3. PCB走线阻抗:高速差分线的阻抗必须控制在100Ω±10%。我曾经见过一块板子,走线阻抗只有85Ω,结果眼图完全闭合。
  4. 电源噪声:PMA的模拟电路对电源噪声极其敏感。记得用LDO单独供电,别和数字电路共用开关电源。
一个小技巧:调试CDR时,先发一个固定的K28.5码型(0xBC),这个码型有丰富的跳变沿,CDR最容易锁定。锁定后再切换成正常数据。

好了,这一讲的内容就到这里。物理层是高速收发器的根基,理解PMA、PCS、CDR和SerDes的工作原理,后面学习链路层和协议层就会轻松很多。下一讲我们聊聊链路层的8B/10B编码和通道绑定,到时候见。