3、连续时间线性均衡器(CTLE)原理
CTLE,全称连续时间线性均衡器。说白了,它就是个模拟滤波器。我当年刚接触SerDes时,总觉得这名字挺唬人。后来发现,它干的事其实很朴素——把信号的高频分量抬一抬,把低频分量压一压。
为什么要这么干?因为信道这玩意儿,天生就是个低通滤波器。信号跑过一段PCB走线或者电缆,高频分量就衰减得厉害。你想想看,本来好好的方波,到了接收端就变成了圆滚滚的馒头波。眼图闭合,误码率飙升。CTLE就是来救场的。
3.1 CTLE的频域响应
CTLE的传输函数,典型形式是这样的:
H(s) = A_dc * (1 + s/ω_z) / (1 + s/ω_p1) / (1 + s/ω_p2)
这里A_dc是直流增益,ω_z是零点,ω_p1和ω_p2是两个极点。我习惯把零点放在低频段,第一个极点放在高频段,第二个极点放在更高频段做滚降。
频域响应长什么样?我画个图给你看:
你看这个图,蓝色线是CTLE的幅频响应。低频段增益低,高频段增益高。红色虚线是信道的衰减曲线。两者一叠加,就得到了绿色的平坦响应。这就是均衡的本质——用CTLE的"凸起"去补偿信道的"凹陷"。
核心要点:CTLE的频域响应是一个带通或高通形状。它在信道衰减严重的频率区域提供额外增益,从而补偿信道损耗。
3.2 零极点配置的艺术
零极点怎么放?这问题我当年琢磨了很久。后来发现,其实有套路可循。
先看零点。零点放在什么位置?我习惯把它放在信道开始明显衰减的频率点附近。比如信道在100MHz开始滚降,我就把零点放在100MHz左右。零点的作用是让增益开始上升。
再看极点。第一个极点放在哪里?放在你希望增益达到峰值的频率点。第二个极点放在更高频段,用来抑制高频噪声。你想想看,如果只提升高频不滚降,噪声会被放大得一塌糊涂。
我列个典型配置给你参考:
| 参数 | 典型值 | 作用 |
|---|---|---|
| 零点 f_z | 100 MHz ~ 500 MHz | 决定高频提升的起始频率 |
| 极点1 f_p1 | 1 GHz ~ 5 GHz | 决定峰值增益频率 |
| 极点2 f_p2 | 5 GHz ~ 20 GHz | 高频滚降,抑制噪声 |
| 直流增益 A_dc | -6 dB ~ 0 dB | 低频衰减量 |
我的经验:零点和第一个极点的间距决定了高频提升的斜率。间距越大,提升越陡。但别太陡,否则群延迟会变差。我一般保持零点到极点的频率比在5~10倍之间。
3.3 直流增益与高频提升
直流增益,就是频率为零时的增益。我习惯把它设成负值,比如-3dB或-6dB。为什么?因为CTLE本质上是个高通滤波器,低频信号本来就没怎么衰减,你没必要给它增益。反而应该压一压,给高频提升留出空间。
高频提升量怎么算?很简单:
高频提升(dB) = 峰值增益(dB) - 直流增益(dB)
举个例子。直流增益设为-6dB,峰值增益设为+6dB,那高频提升就是12dB。这12dB就是用来补偿信道在目标频率上的衰减量。
我在项目中遇到过一个问题:CTLE的高频提升量设得太大,结果信号过冲严重,眼图反而变差了。后来我加了个自适应算法,根据信道长度动态调整提升量。嗯,这才搞定。
注意:高频提升不是越大越好。提升量过大会导致:
- 信号过冲,增加ISI
- 高频噪声被放大
- 功耗增加
- 可能引起振荡
我曾经吃过这个亏,一个项目因为CTLE提升量设大了3dB,导致误码率从1e-12飙升到1e-6。排查了两天才找到原因。
3.4 VerilogA建模示例
说了这么多理论,咱们来点实际的。下面是一个CTLE的VerilogA模型:
// CTLE VerilogA 模型
// 零极点配置:fz=200MHz, fp1=2GHz, fp2=10GHz
// 直流增益:-3dB,高频提升:12dB
`include "constants.vams"
`include "disciplines.vams"
module ctle(in, out);
input in;
output out;
electrical in, out;
parameter real adc = 0.707; // 直流增益 -3dB
parameter real wz = 1.2566e9; // 零点 200MHz
parameter real wp1 = 1.2566e10; // 极点1 2GHz
parameter real wp2 = 6.2832e10; // 极点2 10GHz
real num[0:2];
real den[0:2];
analog begin
// 传输函数系数
// H(s) = adc * (1 + s/wz) / (1 + s/wp1) / (1 + s/wp2)
num[0] = adc;
num[1] = adc / wz;
num[2] = 0;
den[0] = 1;
den[1] = 1/wp1 + 1/wp2;
den[2] = 1/(wp1*wp2);
// 使用laplace_nd实现
V(out) <+ laplace_nd(V(in), num, den);
end
endmodule
这个模型很简单,但够用。你改改wz、wp1、wp2这几个参数,就能适配不同的信道。我一般先在MATLAB里算好零极点,再搬到VerilogA里仿真。
小技巧:仿真时别忘了加个负载电容。CTLE的输出阻抗不低,负载电容会影响高频响应。我习惯在输出端加个50fF的电容,模拟后级电路的输入电容。
3.5 设计中的坑与避坑
最后聊几个我踩过的坑:
- 坑一:零极点位置算对了,但工艺角下偏差很大。解决办法——留裕量,零极点位置设计成可调的。
- 坑二:CTLE的直流增益设成0dB,结果低频信号没衰减,动态范围不够。我后来都设成-3dB到-6dB。
- 坑三:高频提升量太大,导致群延迟波动大,信号抖动增加。记住,均衡不是越猛越好。
嗯,CTLE的原理就这些。说白了就是个模拟滤波器,零极点摆对了位置,增益设对了数值,就能把信道损耗补回来。下一节咱们聊DFE,那个更有意思。
公众号:蓝海资料掘金营,微信deep3321