4、发送端建模:TX均衡器(FFE)原理、FFE抽头系数设计、预加重与去加重、TX抖动模型

好,我们进入发送端建模这一章。说实话,发送端是整个SerDes链路里我最喜欢琢磨的部分——因为它决定了信号出发时的「底子」好不好。底子差了,后面接收端再怎么折腾也白搭。

今天咱们重点聊四个东西:FFE的原理、抽头系数怎么设计、预加重和去加重的区别、以及TX抖动模型。嗯,一个一个来。

4.1 FFE(前馈均衡器)原理

FFE,全称Feed-Forward Equalizer,中文叫前馈均衡器。说白了,它就是在信号发射出去之前,先对信号做一次「预整形」。

为什么要预整形?因为信道会「欺负」信号。高频分量衰减大,低频分量衰减小,结果就是信号边沿变缓、码间干扰(ISI)严重。FFE的思路很简单:在发射端提前把高频分量抬一抬,或者把低频分量压一压,让信号经过信道后能恢复得更好。

FFE的结构其实就是一个有限冲激响应(FIR)滤波器。我画个图你感受一下:

FFE(前馈均衡器)结构图 输入 x[n] Z⁻¹ Z⁻¹ Z⁻¹ Z⁻¹ c₀ c₁ c₂ c₃ Σ 输出 y[n] y[n] = c₀·x[n] + c₁·x[n-1] + c₂·x[n-2] + c₃·x[n-3]

你看,输入信号 x[n] 经过一串延迟单元(Z⁻¹),每个抽头乘上一个系数 c₀、c₁、c₂、c₃……然后全部加起来。这就是FFE的核心运算。

关键点:FFE的抽头系数决定了均衡效果。主抽头(c₀)控制信号幅度,前/后抽头(c₁、c₂...)用来抵消码间干扰。

4.2 FFE抽头系数设计

抽头系数怎么定?这是很多新手问我的问题。我记得刚入行时,我天真地以为随便设几个值就行,结果仿真出来的眼图惨不忍睹。

实际上,抽头系数的设计有两种主流方法:

4.2.1 基于信道响应的直接计算法

如果你知道信道的冲激响应 h(t),那么FFE的系数可以通过迫零(Zero-Forcing)最小均方误差(MMSE)准则来求解。

迫零法的思路很简单:让FFE和信道的级联响应在采样点处为1,在其他位置为0。说白了就是「把ISI彻底干掉」。但代价是可能会放大噪声。

MMSE则更聪明一些——它在消除ISI和抑制噪声之间找平衡。我个人更推荐MMSE,尤其是在信道损耗比较大的场景下。

4.2.2 基于自适应算法的迭代法

如果信道特性未知或者会变化,那就用自适应算法。最经典的是LMS(最小均方)算法

// LMS算法伪代码
for each symbol n:
    y[n] = sum(c_k * x[n-k])   // FFE输出
    e[n] = d[n] - y[n]          // 误差 = 期望值 - 实际值
    c_k = c_k + mu * e[n] * x[n-k]  // 更新系数

mu是步长因子。步长太大,收敛快但容易震荡;步长太小,收敛慢。我一般取0.01~0.05之间,具体要看信号幅度。

我的经验:在实际项目中,我习惯先用信道仿真得到粗略的系数,再用LMS做微调。这样既快又稳。纯靠自适应从零开始收敛,有时候会跑到局部最优去。

4.3 预加重与去加重

这两个概念经常被搞混。我刚开始也迷糊过,后来想明白了一个关键点:

  • 预加重(Pre-emphasis):提升高频分量的幅度。信号跳变时(0→1或1→0)给一个更大的驱动电流。
  • 去加重(De-emphasis):降低低频分量的幅度。信号连续不变时(保持0或保持1)减小驱动电流。

你想想看,这两种做法其实等效的。都是让高频分量相对低频分量更大。区别只是参考基准不同。

举个例子,假设一个3抽头FFE,系数为 [c₋₁, c₀, c₁]:

模式 主抽头 c₀ 后抽头 c₁ 效果
预加重 1.0 0.0 跳变时幅度 = 1.0,稳态时幅度 = 0.7(假设c₁=-0.3)
去加重 0.7 -0.3 跳变时幅度 = 1.0,稳态时幅度 = 0.7

看到没?两种模式最终得到的波形一模一样。所以很多芯片手册里只提「去加重」,因为它实现起来更直观——主抽头控制稳态幅度,后抽头控制跳变幅度。

注意:去加重的dB值怎么算?公式是 20*log10(跳变幅度/稳态幅度)。比如跳变1.0V、稳态0.7V,去加重就是 20*log10(1.0/0.7) ≈ 3.1 dB。我曾经见过有人把公式记反了,结果仿真出来的眼图完全不对。

4.4 TX抖动模型

抖动(Jitter)是高速SerDes的「天敌」。发送端的抖动会直接叠加到信号上,接收端再努力也消除不了。

TX抖动主要分两类:

  • 随机抖动(RJ):由热噪声、散粒噪声等引起,服从高斯分布。单位是ps RMS。
  • 确定性抖动(DJ):由电源噪声、串扰、码型相关效应等引起。又细分为周期性抖动(PJ)、数据相关抖动(DDJ)等。

在Verilog-A建模中,我通常这样实现TX抖动:

// Verilog-A TX抖动模型(简化版)
`include "disciplines.vams"
`include "constants.vams"

module tx_jitter_model(data_in, data_out);
    input data_in;
    output data_out;
    electrical data_in, data_out;
    
    parameter real rj_rms = 1e-12;  // 随机抖动 1ps RMS
    parameter real pj_amp = 2e-12;  // 周期性抖动 2pp
    parameter real pj_freq = 100e6; // 抖动频率 100MHz
    
    real jitter, phase_noise;
    integer seed = 123;
    
    analog begin
        // 随机抖动(高斯分布)
        phase_noise = $rdist_normal(seed, 0, rj_rms);
        
        // 周期性抖动
        phase_noise = phase_noise + pj_amp/2 * sin(2*`M_PI*pj_freq*$abstime);
        
        // 将抖动叠加到信号边沿
        @(cross(V(data_in) - 0.5, 1)) begin
            // 在跳变时刻加入抖动
            // 实际实现中会使用 $delay 或 transition 函数
        end
        
        V(data_out) <+ transition(V(data_in), 0, 0, 0);
    end
endmodule

这个模型虽然简单,但已经能覆盖大部分场景。实际项目中,我还会加入码型相关抖动——比如长串的0或1会导致时钟恢复电路产生偏移,这个在建模时也要考虑进去。

避坑指南:我曾经在建模时忽略了RJ和DJ的叠加方式。记住,RJ是高斯分布,DJ是有界分布。两者叠加后的总抖动(TJ)在低误码率下要用双狄拉克模型来估算。简单说:TJ ≈ DJ + 14.1 × RJ(对于BER=1e-12)。这个公式很实用,建议记下来。

4.5 本章小结

好,咱们捋一捋今天的内容:

  • FFE原理:就是一个FIR滤波器,在发射端预补偿信道损耗。
  • 抽头系数设计:可以用迫零法、MMSE法,也可以用LMS自适应算法。我推荐MMSE+LMS组合拳。
  • 预加重 vs 去加重:本质相同,实现方式不同。去加重更常用,注意dB计算公式别搞反。
  • TX抖动模型:RJ+DJ叠加,用Verilog-A可以方便建模。别忘了码型相关抖动。

嗯,发送端建模就聊到这儿。下一章咱们进信道——那个让所有SerDes工程师又爱又恨的家伙。


公众号:蓝海资料掘金营,微信deep3321