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频域响应示意图 频率 (Hz) 10⁶ 10⁷ 10⁸ 10⁹ 0 dB -6 dB -12 dB 增益 信道响应 CTLE响应 均衡后 零点 极点1 极点2 CTLE 均衡后 信道

你看这个图,蓝色线是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