第四章:高速模拟前端设计——CTLE、DFE与VGA的实战要点
各位同学,大家好。今天我们来聊聊PCIe Gen5 Retimer里最“硬核”的部分——高速模拟前端。说白了,就是信号从通道进来,到被数字逻辑处理之前,那一整套模拟电路该怎么设计。
我个人习惯把这一块叫做“信号急救室”。为什么?因为信号经过长距离的PCB走线、连接器、还有各种损耗之后,到了接收端已经“奄奄一息”了。CTLE、DFE、VGA就是负责把这信号“救回来”的三大法宝。
核心观点:模拟前端的设计质量,直接决定了整个Retimer芯片的误码率(BER)能不能达标。我见过太多项目,数字逻辑写得再漂亮,模拟前端拉胯,最后流片回来还是废片。
4.1 CTLE设计要点:给信号“提提神”
CTLE,全称连续时间线性均衡器。它的作用很简单——把信号里被通道衰减掉的高频分量补回来。你想想看,PCB走线就像一个低通滤波器,高频分量跑着跑着就没了,信号眼图就闭上了。
CTLE本质上是一个高通滤波器。它会在高频段提供增益,低频段保持衰减或单位增益。设计CTLE时,有几个关键参数你必须盯死:
- 直流增益(DC Gain): 通常设为0dB或负增益。为什么?因为低频分量没怎么衰减,不需要额外放大。
- 峰值频率(Peak Frequency): 这个频率点决定了CTLE在哪个频段开始“发力”。PCIe Gen5的奈奎斯特频率是16GHz,所以峰值频率一般设计在12-16GHz之间。
- 峰值增益(Peak Gain): 也就是高频能抬多少。Gen5通道损耗可能达到30dB以上,CTLE一般提供6-12dB的峰值增益就够了,剩下的交给DFE。
实战经验: 我在项目中遇到过一个问题——CTLE的峰值频率调得太高了,结果高频噪声也跟着被放大了,信噪比反而下降。后来我学乖了,CTLE的峰值增益不要一次给满,留点余量给DFE去处理。
CTLE的实现方式有很多种,最常见的是源极退化结构(Source Degeneration)。它的核心是一个差分对,源极接一个电阻和电容的并联网络。通过调节RC的值,就能控制零点和极点的位置。
// CTLE传输函数的简化表达式
// H(s) = (gm * Rd) / (1 + gm * Rs/2) * (1 + s/ωz) / (1 + s/ωp)
// 其中 ωz = 1/(Rs * Cs),ωp = (1 + gm * Rs/2) / (Rs * Cs)
// gm: 跨导,Rd: 漏极电阻,Rs: 源极退化电阻,Cs: 源极退化电容
嗯,这里要注意一点。CTLE的带宽必须足够宽。Gen5的数据率是32Gbps,信号的基频是16GHz,三次谐波都到48GHz了。虽然我们不需要放大那么高,但CTLE本身的-3dB带宽至少要做到20GHz以上,否则高频补偿效果会大打折扣。
4.2 DFE架构与实现:消除“历史遗留问题”
CTLE做完之后,信号眼图可能已经睁开了一些,但还不够。为什么?因为通道里还有码间干扰(ISI)。说白了,就是前面传的比特还在通道里“晃悠”,影响了当前比特的判断。
DFE就是来解决这个问题的。它的核心思想是:既然我知道前面发了什么,那我就能预测它对当前比特的影响,然后把这个影响减掉。
DFE的架构通常分为两种:
- 直接反馈结构(Direct Feedback): 简单直观,但时序要求很苛刻。因为判决结果要在一个UI(单位间隔)内反馈回来,Gen5的一个UI只有31.25ps,留给反馈的时间窗口非常窄。
- 展开式结构(Unrolled DFE): 也叫推测式DFE。它提前计算好所有可能的反馈情况,然后根据判决结果直接选一个。时序压力小很多,但面积和功耗会翻倍。
我个人习惯在Gen5 Retimer里用展开式结构。虽然面积大一点,但时序裕量更充足,设计风险低。我曾经在一个项目里尝试用直接反馈结构,结果后端布局布线之后,反馈路径的寄生电容太大,时序怎么也收敛不了。最后不得不改成展开式,多花了两个礼拜的迭代时间。
避坑指南: DFE的抽头数量不是越多越好。每个抽头都需要一个乘法器和加法器,功耗和面积都会增加。对于PCIe Gen5,4-6个抽头通常就足够了。我曾经见过有人设计16个抽头的DFE,结果功耗爆炸,芯片烫得能煎鸡蛋。
DFE的系数自适应算法也很关键。常用的有LMS(最小均方)算法和Sign-Sign LMS算法。Sign-Sign LMS实现简单,收敛速度也还行,是工业界的主流选择。
// Sign-Sign LMS 系数更新伪代码
// 每个时钟周期执行一次
for (i = 0; i < N; i++) {
error = slicer_input - slicer_output; // 计算误差
if (error > 0) {
coeff[i] = coeff[i] + step_size * sign(data_delayed[i]);
} else {
coeff[i] = coeff[i] - step_size * sign(data_delayed[i]);
}
}
这里有个细节——误差的计算必须精确。如果误差信号有偏差,系数就会收敛到错误的值。我建议在误差路径上加一个offset校准电路,把比较器的失调电压校准掉。
4.3 VGA设计考量:把信号调到“刚刚好”
VGA,可变增益放大器。它的任务是把信号的幅度调整到ADC或者判决器的最佳输入范围。信号太弱,判决器分不清0和1;信号太强,又会把后面的电路推饱和,产生非线性失真。
VGA的设计考量主要有以下几点:
| 参数 | 设计要求 | 我的经验值 |
|---|---|---|
| 增益范围 | 覆盖通道损耗的变化范围 | 0dB ~ 24dB,步进1dB |
| 带宽 | 至少达到数据率的0.7倍 | Gen5要求 > 22GHz |
| 线性度 | IMD3 < -40dBc | 否则会产生带内失真 |
| 噪声系数 | 越小越好 | 建议 < 6dB |
VGA的实现方式有很多种。我比较喜欢用吉尔伯特单元(Gilbert Cell)的变体结构。它的增益可以通过尾电流或者负载电阻来调节,线性度也还不错。
不过,VGA有一个很头疼的问题——增益和带宽是互相矛盾的。增益越高,寄生电容的影响越大,带宽就会下降。怎么解决?
- 采用多级级联: 每一级只提供有限的增益,比如6dB,然后多级串起来。这样每一级的带宽都可以做得很高。
- 使用电感峰化技术: 在负载端串联一个电感,利用LC谐振来拓展带宽。不过电感很占面积,而且会引入额外的寄生。
- 采用Cherry-Hooper结构: 这种结构通过局部负反馈来拓展带宽,是高速VGA的经典选择。
一个小技巧: VGA的增益控制字(GCW)最好用温度计码,而不是二进制码。为什么?因为温度计码在切换时只会改变一个比特,不会产生毛刺。我曾经用二进制码控制增益,结果增益切换时信号出现了一个大毛刺,直接把后面的DFE搞乱了。换成温度计码之后,问题就解决了。
最后,VGA的自动增益控制(AGC)环路也要设计好。AGC环路的作用是根据输入信号的强度,自动调整VGA的增益。环路带宽不能太快,否则会对信号本身的幅度变化产生响应;也不能太慢,否则跟不上通道损耗的变化。我一般把AGC环路的带宽设在1-10MHz之间。
好了,这一章的内容就到这里。CTLE、DFE、VGA这三个模块,是高速模拟前端的“铁三角”。设计的时候,一定要把它们当作一个整体来考虑,而不是各自为政。CTLE的增益给多了,DFE的负担就轻了,但噪声会变大;VGA的增益分配不合理,后面的ADC或者判决器就会工作在不理想的状态。这些trade-off,需要你在实际项目中慢慢体会。
总结一句话: 模拟前端设计没有银弹。每一个dB的增益、每一个GHz的带宽,都是你与物理世界博弈的结果。多仿真、多流片、多总结,才能把这三个模块玩得转。