SerDes基本原理:并行转串行与串行转并行、PLL与时钟数据恢复(CDR)、预加重与均衡技术

好,咱们今天聊聊SerDes的核心原理。说白了,SerDes就是高速数据传输的“翻译官”。为什么需要它?因为并行总线跑不快了。你想想看,一根线上跑1Gbps,十根线就是10Gbps,听起来很美对吧?但问题是,线之间的时延差、串扰、同步时钟的抖动……这些麻烦事会随着频率升高急剧恶化。所以业界想了个办法:把并行数据变成一串高速的串行数据,用一对差分线传过去,到了对面再变回并行。这就是SerDes的基本思路。

并行转串行与串行转并行

这部分其实不复杂。我习惯把并行转串行想象成一个“多车道汇入单车道”的过程。比如你有8位数据,每个时钟周期要一起发出去。现在改成串行,那就得在一个时钟周期内,把这8位数据按顺序一个一个发出去。所以串行时钟频率是并行时钟的8倍。

具体实现上,常用的是移位寄存器加一个并行的加载信号。我贴一段简单的Verilog代码,帮你理解这个思路:

// 并行转串行示例(8:1)
module p2s (
    input clk_ser,      // 串行时钟,频率是并行时钟的8倍
    input clk_par,      // 并行时钟
    input [7:0] data_in,
    output reg data_out
);
    reg [7:0] shift_reg;
    reg [2:0] cnt;

    always @(posedge clk_ser) begin
        if (cnt == 3'b000) begin
            shift_reg <= data_in;  // 加载并行数据
        end else begin
            shift_reg <= {shift_reg[6:0], 1'b0}; // 左移
        end
        data_out <= shift_reg[7];
        cnt <= cnt + 1;
    end
endmodule

反过来,串行转并行就是“单车道分流到多车道”。接收端用高速时钟把串行数据一位位收进来,攒够8位后,用一个并行时钟把它们一起送出去。这里有个关键点:接收端的时钟必须和发送端严格同步。怎么同步?这就引出了PLL和CDR。

PLL与时钟数据恢复(CDR)

PLL(锁相环)是SerDes的心脏。它的作用很简单:产生一个稳定的高频时钟。但实际做起来,坑不少。

PLL的核心结构包括:鉴频鉴相器(PFD)、电荷泵(CP)、环路滤波器(LF)、压控振荡器(VCO)和分频器。我画了一张图,帮你理清它们的关系:

PLL基本结构 参考时钟 PFD CP+LF VCO 输出时钟 ÷N 反馈路径

PLL的工作流程是这样的:参考时钟和反馈时钟进入PFD,比较相位差。如果反馈时钟慢了,PFD输出一个“UP”信号,让电荷泵给环路滤波器充电,提高VCO的控制电压,VCO输出频率就升高。反之亦然。最终,VCO的输出频率锁定在参考时钟的N倍上。

CDR(时钟数据恢复)比PLL更复杂一点。它没有独立的参考时钟,而是从数据流里“提取”时钟。怎么做?数据流里会有跳变沿,CDR就盯着这些跳变沿,调整本地时钟的相位,让它始终对准数据的眼图中心。

关键点:CDR有两种常见架构——基于PLL的CDR和基于过采样的CDR。前者适合高速率(10Gbps以上),后者适合中低速率且对抖动容忍度要求高的场景。

我的经验:我在一个10Gbps的项目里用过基于PLL的CDR。调试时发现,环路滤波器的带宽设置很关键。带宽太宽,CDR会跟着数据里的抖动跑,输出时钟噪声大;带宽太窄,CDR跟不上频率变化,容易失锁。我一般把环路带宽设在数据速率的1/1000左右,比如10Gbps就用10MHz带宽,效果不错。

预加重与均衡技术

高速信号在传输线上走,会遇到一个大麻烦:损耗。PCB走线、连接器、电缆,都会让信号的高频分量衰减。结果就是,接收端看到的眼图是闭合的,根本没法正确采样。

怎么解决?两个思路:发送端做预加重,接收端做均衡。

预加重,说白了就是“提前补偿”。发送端在发送跳变沿时,故意把信号幅度加大一点。因为跳变沿包含高频分量,传输线对高频衰减大,所以提前给它“打一针强心剂”。等信号到了接收端,高频和低频的幅度就差不多了。

预加重通常用FIR滤波器实现。我举个例子:

// 预加重FIR滤波器示例(2抽头)
// 假设主抽头系数为1,后标抽头系数为-0.3
// 输出 = 当前数据 - 0.3 * 上一个数据
module pre_emphasis (
    input clk,
    input data_in,
    output reg data_out
);
    reg data_d1;
    
    always @(posedge clk) begin
        data_d1 <= data_in;
        // 这里用模拟方式实现,实际是控制电流源
        // data_out = data_in * 1.0 - data_d1 * 0.3
    end
endmodule

均衡是接收端的事。常见的有CTLE(连续时间线性均衡)和DFE(判决反馈均衡)。

CTLE是一个模拟滤波器,它的频率响应是“高通”的——放大高频,衰减低频。正好和传输线的特性相反。CTLE的优点是功耗低、实现简单,但它的缺点是会放大噪声。

DFE就不一样了。它是个非线性均衡器,利用之前判决的结果来消除当前符号的码间干扰(ISI)。DFE不会放大噪声,但有个致命弱点:如果之前判决错了,错误会传播下去。这就是所谓的“误码传播”。

我曾经踩过的坑:在一个12.5Gbps的项目里,我一开始只用CTLE,结果发现眼图虽然打开了,但误码率死活下不去。后来加了DFE,误码率从1e-6降到了1e-12。但DFE的抽头系数需要自适应调整,我花了两周才把自适应算法调稳定。教训是:高速链路设计,预加重和均衡要协同工作,不能只靠一头。

最后,我整理了一个表格,对比一下预加重和均衡的几种常见方案:

技术 位置 优点 缺点 典型应用
预加重(FFE) 发送端 不放大噪声,实现简单 增加发送端功耗,对高频补偿有限 PCIe Gen3/4, SATA
CTLE 接收端 功耗低,连续可调 会放大高频噪声 USB 3.0, HDMI
DFE 接收端 不放大噪声,补偿能力强 有误码传播风险,需要自适应 10G Ethernet, PCIe Gen5

嗯,SerDes的基本原理就聊到这儿。并行转串行是“怎么发”,PLL和CDR是“怎么同步”,预加重和均衡是“怎么保证信号质量”。这三块合起来,就是SerDes的骨架。你把这些搞明白了,后面看具体的协议(比如PCIe、SATA、以太网)就会轻松很多。

可可精品资料库