4、发送端建模:TX均衡器(FFE)原理、FFE抽头系数设计、预加重与去加重、TX抖动模型
好,我们进入发送端建模这一章。说实话,发送端是整个SerDes链路里我最喜欢琢磨的部分——因为它决定了信号出发时的「底子」好不好。底子差了,后面接收端再怎么折腾也白搭。
今天咱们重点聊四个东西:FFE的原理、抽头系数怎么设计、预加重和去加重的区别、以及TX抖动模型。嗯,一个一个来。
4.1 FFE(前馈均衡器)原理
FFE,全称Feed-Forward Equalizer,中文叫前馈均衡器。说白了,它就是在信号发射出去之前,先对信号做一次「预整形」。
为什么要预整形?因为信道会「欺负」信号。高频分量衰减大,低频分量衰减小,结果就是信号边沿变缓、码间干扰(ISI)严重。FFE的思路很简单:在发射端提前把高频分量抬一抬,或者把低频分量压一压,让信号经过信道后能恢复得更好。
FFE的结构其实就是一个有限冲激响应(FIR)滤波器。我画个图你感受一下:
你看,输入信号 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