1、DFE反馈均衡概述

大家好,我是做高速SerDes接口验证的,这么多年跟均衡器打交道是最多的。DFE(判决反馈均衡器)这玩意儿,说白了就是用来把信道畸变给“掰回来”的。你想想看,信号在PCB上跑几英寸,甚至背板走半米,高频损耗、反射、串扰全来了,眼睛图早就闭上了。这时候DFE就是那个能让你重新睁开眼的东西。

1.1 DFE的基本概念

DFE的核心思路很直白:把之前已经判决出来的比特,通过一个反馈滤波器去抵消当前符号上的后标(post-cursor)干扰。我习惯把它理解成“过去犯的错用来纠正现在的错”。它的结构由前馈部分(通常是个简单的CTLE或FFE)加上一个反馈抽头(tap)构成。

我的一个小习惯: 调试DFE时先固定前馈,只调反馈抽头,看误码率改善趋势。这样定位问题快很多。

DFE的数学表达式其实很简单,但初学者容易被公式吓到。我一般这么说:

// DFE输出 = 前馈均衡后的采样值 - 各反馈抽头 × 历史判决值
y[n] = x[n] - Σ (w_k × d[n-k])   (k = 1 to N)

其中 w_k 是第k个反馈抽头系数,d[n-k] 是第n-k个时钟周期的判决结果(+1或-1)

这个减法操作,就是把之前比特在当前符号上留下的“尾巴”给减掉。我曾经在一个224Gbps PAM4的项目里,信道插损超过30dB,前馈均衡怎么调都眼高不够,最后靠4个DFE抽头硬是把眼高拉回了150mV。嗯,那次让我彻底信服DFE的能力。

注意: DFE只能消除后标干扰,对前标(pre-cursor)无能为力。前标需要靠FFE或者CTLE去处理。你别指望一个DFE包打天下。

1.2 DFE在高速串行通信中的作用

现在的高速串行链路,比如PCIe 6.0、400G以太网、USB4,信道带宽根本不够用。信号经过连接器、过孔、走线,后标干扰能延伸到好几个UI(单位间隔)之外。如果没有DFE,光靠模拟均衡器(CTLE)和FFE,眼图可能在第三个UI就闭上了。

DFE的好处就在于它不放大噪声。你想想看,CTLE和FFE都是线性滤波器,它们在放大信号的同时也放大了高频噪声。DFE是非线性的——它依靠已经判定的数字值做反馈,不引入额外的噪声放大。这就是它比FFE更“干净”的原因。

我在项目里遇到过一种情况:链路余量紧张,CTLE增益已经推到最大,噪声底都抬高了3dB,误码率死活到不了1e-12。后来我建议把CTLE降两档,用DFE多开一个抽头,误码率反而降了两个数量级。说白了,噪声和码间干扰之间要找个平衡点。

1.3 DFE与FFE的比较

很多人常问我:FFE和DFE到底选哪个?我的回答是:两个都得有,但分工不同。下面这张表是我自己整理的核心对比:

对比维度 FFE(前馈均衡) DFE(判决反馈均衡)
干扰方向 前标+后标(线性补偿) 仅后标(非线性补偿)
噪声特性 放大高频噪声 不放大噪声
实现复杂度 简单,模拟或数字均可 需要反馈环路,时序收敛难
功耗 相对较低 抽头越多功耗越高
收敛速度 快,可用自适应算法 慢,且有误差传播风险
典型应用 CTLE+FFE组合做粗均衡 残差后标精细消除

FFE像个粗调旋钮,DFE像个微调螺丝。我习惯先让CTLE把低频抬起来,FFE把大概的脉冲响应压平到3~5个UI内,然后DFE再扫尾。举个例子:在112Gbps PAM4链路中,信道衰减在奈奎斯特频率处可能有25dB,FFE通常用5~7个tap,DFE用2~4个tap,配合起来才能达到1e-6以下的误码率。

避坑指南: 我曾经有一次把DFE抽头数设太多(12个),结果误差传播把整个突发包都打翻了。DFE的抽头数不是越多越好,要根据信道长度和后标衰减曲线来定。一般NRZ链路抽头数等于信道后标长度(UI数)减2即可,PAM4可以再多1~2个。

为了让你对DFE在整个接收链路中的位置有个直观理解,我画了下面这张图。注意信号从左到右依次经过CTLE、FFE、DFE和CDR,DFE的反馈路径是核心。

DFE在接收链路中的位置(含反馈路径) CTLE FFE ∑ DFE求和 判决器 CDR 反馈抽头组 Tap1 × d[n-1] Tap2 × d[n-2] ... TapN × d[n-N] 模拟均衡 数字均衡 数据恢复

这张图里,DFE求和节点(红色)接收来自前馈部分的信号,然后减去反馈抽头组(黄色框图)的加权和,最终送给判决器。虚线就是反馈路径:判决结果回到反馈抽头,计算下一拍的补偿值。注意这个反馈必须在下一个UI的采样之前完成,时序非常紧张。我调过28Gbps的NRZ,那时候一个UI才35ps,反馈延迟超过10ps就会导致误码率恶化。

最后再说一点:DFE的系数更新通常用LMS(最小均方)算法,但实际实现中常用Sign-Sign LMS,因为它只需要误码方向(正/负)和判决方向,数字电路极好实现。代码大概长这样:

// Sign-Sign LMS 更新DFE抽头系数
for each incoming bit {
    error = sign(sampled_value - slicer_output);  // +1, -1, or 0
    for k = 1 to N {
        w_k = w_k + μ * error * sign(d[n-k]);
    }
}

这个μ是步长,选大了收敛快但稳态抖动大,选小了相反。我一般从0.05开始试,看收敛曲线再微调。嗯,今天就先讲到这,DFE的基础概念和角色应该清楚了。