ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SerDes接收端DFE均衡器:原理、电路实现与仿真验证

SerDes接收端DFE均衡器:原理、电路实现与仿真验证 1. 为什么SerDes接收端离不开DFE1.1 从一条跑不快的链路说起做过高速接口的兄弟大概都有过这种体验发送端眼图张得挺漂亮一过信道就塌了。尤其是背板走线超过20dB损耗之后接收端眼高眼宽被压缩得几乎闭合误码率怎么调都下不来。这时候如果只靠CTLE连续时间线性均衡器去硬拉高频噪声和串扰也跟着一起放大属于典型的杀敌一千自损八百。DFEDecision Feedback Equalizer判决反馈均衡器就是在这个背景下成为SerDes接收端标配的。它的核心思路和CTLE完全不同CTLE是在信号进入采样器之前做线性滤波而DFE是在信号被判决之后用已经判决出来的比特去预测当前比特会受到前面比特多大的干扰然后把这个干扰从当前信号里减掉。因为用的是已经判决的数字结果所以DFE不会放大噪声这是它最值钱的地方。我第一次接触DFE是在一个25Gbps的背板项目上信道损耗大概28dBCTLE拉满之后眼高只剩不到30mV加上DFE之后眼高直接翻了一倍多。当时最大的感受就是这玩意儿不是锦上添花是雪中送炭。1.2 DFE到底解决了什么问题要理解DFE的价值得先搞清楚信号在信道里到底遭遇了什么。高速信号在PCB走线、连接器、过孔上传输时由于趋肤效应和介质损耗高频分量衰减比低频严重得多这导致信号边沿变缓、幅度变小。更麻烦的是信道不是理想的低通滤波器它还会引入反射和码间干扰ISI。ISI的本质是当前比特的采样点上叠加了前面若干个比特经过信道延迟和衰减后的尾巴。比如你发了一个1后面紧跟一个0那个1的能量不会立刻消失它会拖到0的采样时刻上让0的电平偏高判决时就容易出错。DFE做的事情就是既然我知道前面发了什么因为已经判决了那我就知道那些比特会在当前时刻留下多大的尾巴直接减掉就行。这就像你在一个回声很大的房间里说话如果你知道刚才说了什么就可以预测回声的形状然后主动抵消它。1.3 适合哪些人看这篇内容这篇内容主要面向三类人一是刚接触SerDes接收端设计的工程师想搞清楚DFE到底怎么工作、怎么实现二是做信号完整性仿真但不太了解电路实现细节的同事想补上从算法到电路这一环三是面试准备中遇到DFE相关问题的同学需要一个从原理到实现的完整梳理。我尽量不堆公式用生活化的类比把原理讲透同时给出可参考的电路结构和参数选择方法。涉及具体工艺和电压的地方我会说明是基于常见实践实际项目需要根据工艺库调整。2. DFE的核心原理拆解2.1 判决反馈的基本逻辑DFE的全称是Decision Feedback Equalizer拆开看就是判决反馈均衡。它的工作流程可以分成三步第一步采样器对当前时刻的输入信号进行判决得到当前比特D[n]。第二步把最近判决出来的若干个比特D[n-1]、D[n-2]……D[n-N]送入反馈滤波器。第三步反馈滤波器根据每个历史比特的权重系数h1、h2……hN计算出它们对当前采样时刻的干扰总量然后从输入信号中减去这个量再送给采样器。这里有个关键点DFE的反馈环路里包含采样器而采样器是有延迟的。也就是说当前比特的判决结果要等到下一个比特周期才能用于反馈。这意味着DFE只能消除过去比特对当前比特的干扰也就是所谓的后标post-cursorISI。对于未来比特对当前比特的干扰也就是前标pre-cursorISIDFE无能为力那部分通常由发送端FFE前馈均衡器来处理。这个分工很重要发送端FFE负责前标接收端DFE负责后标CTLE负责整体高频补偿。三者配合才能把一个大损耗信道均衡回来。2.2 为什么DFE不放大噪声这是DFE最核心的优势值得单独说清楚。CTLE是一个线性滤波器它在提升高频增益的同时也会把高频段的噪声和串扰一起放大。你可以理解为CTLE就像一个音量旋钮把整首歌的音量调大但背景噪音也跟着大了。DFE不一样。它的反馈路径上走的是数字信号——已经判决出来的0和1。这些数字信号本身不携带噪声或者说噪声已经被判决器清洗掉了所以反馈滤波器减掉的只是确定性的ISI分量不会引入额外的噪声放大。用一个不太严谨但很直观的类比假设你在一个嘈杂的餐厅里听对面的人说话CTLE相当于把助听器音量调大对方声音大了但周围噪音也大了DFE相当于你根据对方刚才说的内容预测下一句可能是什么然后在大脑里减掉那些已知的干扰。后者显然更聪明。当然DFE也不是没有代价。它的最大风险是误差传播如果某个比特判决错了这个错误会通过反馈路径影响后续若干个比特的判决可能导致连续出错。这是DFE设计中最需要关注的问题之一。2.3 后标ISI的数学表达虽然我不想堆公式但理解后标ISI的基本表达对后续电路实现很有帮助。假设信道脉冲响应在采样时刻的值为h0主标、h1第一个后标、h2第二个后标……hN第N个后标那么当前采样时刻的输入信号可以写成y[n] h0·D[n] h1·D[n-1] h2·D[n-2] ... hN·D[n-N] 噪声DFE的目标就是估计出h1·D[n-1] h2·D[n-2] ... hN·D[n-N]这一坨然后从y[n]里减掉。减完之后剩下的就是h0·D[n]加上噪声采样器只需要对这个干净的信号做判决就行了。反馈滤波器的系数h1到hN就是DFE的抽头系数tap coefficient。抽头数量越多能消除的后标ISI越多但电路面积、功耗和误差传播风险也越大。实际项目中25Gbps到56Gbps的SerDes通常用3到10个抽头具体取决于信道损耗和反射情况。2.4 自适应算法为什么必要信道不是固定的。温度变化、电压波动、不同板卡的走线差异都会让信道响应发生变化。如果DFE的抽头系数写死换个环境可能就失效了。所以实际产品里的DFE都带自适应功能能根据误码率或眼图信息自动调整抽头系数。最常见的自适应算法是LMS最小均方算法。它的基本思路是用判决前后的误差信号来更新抽头系数误差大就多调一点误差小就少调一点最终收敛到让误差最小的系数组合。具体实现时可以用符号-符号LMS来简化乘法运算降低硬件开销。我在实际项目中遇到过一个问题LMS的步长step size设得太大抽头系数在收敛点附近来回震荡眼图反而不稳定设得太小收敛速度又太慢上电后要等好几毫秒才能正常工作。后来通过分段设置步长——初始阶段用大步长快速收敛接近收敛后切小步长精细调整——才解决了这个问题。3. DFE的电路实现细节3.1 整体架构从模拟前端到数字反馈一个典型的DFE接收端架构可以分成几个部分模拟前端AFE、采样器Slicer、反馈滤波器Feedback Filter、时钟恢复CDR和自适应引擎Adaptation Engine。模拟前端通常包含CTLE和可变增益放大器VGA负责初步的频域补偿和幅度调整。采样器是DFE环路里的关键模块它的速度直接决定了DFE能支持的最高数据率。反馈滤波器是DFE的核心负责根据历史比特计算并减去ISI。CDR从采样数据中恢复时钟自适应引擎则根据误差信息调整CTLE、VGA和DFE的系数。这里有个设计上的取舍反馈滤波器的输出是模拟信号还是数字信号早期DFE多用模拟反馈直接用电流舵DAC把抽头系数转换成电流从输入信号里减掉。这种方式速度快、延迟低但抽头系数是模拟量受工艺和温度影响大。后来随着工艺进步数字DFE越来越流行先把输入信号用高速ADC量化成数字然后在数字域做反馈和均衡。数字DFE的系数更稳定、更容易自适应但ADC的功耗和面积是代价。3.2 采样器DFE环路的速度瓶颈采样器是DFE反馈环路里延迟最大的模块因为信号必须经过采样判决之后才能反馈。这个延迟必须小于一个比特周期UI否则反馈就来不及在下一个比特到来之前准备好。以56Gbps为例一个UI只有约17.8皮秒。采样器的延迟包括时钟到输出的延迟、判决电路的再生时间、以及到反馈滤波器的走线延迟。要在这么短的时间里完成判决和反馈对电路设计是极大的挑战。常见的做法是用强锁存器StrongARM Latch或者CML锁存器。StrongARM速度快、功耗低但失调电压较大CML锁存器速度稍慢但失调小、线性度好。实际选择要看具体的数据率和工艺节点。在28nm及以下工艺StrongARM在56Gbps下比较常见在更老的工艺节点CML更稳妥。注意采样器的失调会直接恶化DFE的均衡效果。如果失调太大相当于在反馈信号上叠加了一个固定误差会导致眼图不对称。实际设计中通常会在采样器后面加失调校准电路。3.3 反馈滤波器的实现方式反馈滤波器是DFE最核心的电路模块。它的功能用一句话概括把最近N个判决比特按照抽头系数加权求和然后从输入信号中减去。实现方式主要有两种电流舵DAC和电阻网络。电流舵DAC的方式是每个抽头对应一个电流源抽头系数决定电流大小判决比特决定电流方向。所有抽头的电流汇总后通过一个负载电阻转换成电压就是反馈信号。这种方式的优点是速度快、结构简单缺点是电流源的匹配和噪声需要仔细设计。电阻网络的方式是用开关控制电阻分压结构更简单但精度和速度都不如电流舵DAC。在实际的高速SerDes里电流舵DAC是主流。抽头系数的精度也很关键。通常用6到8位二进制表示对应64到256个电流台阶。位数越多均衡精度越高但DAC的面积和功耗也越大。实际项目中第一个后标抽头h1的精度要求最高因为它的权重最大后面的抽头精度可以适当降低。3.4 时钟恢复与DFE的配合CDR和DFE是互相依赖的关系。CDR需要从采样数据中提取时钟相位信息而DFE的反馈信号会影响采样数据的质量进而影响CDR的收敛。如果DFE还没收敛CDR可能锁到错误的相位上如果CDR相位不对DFE的采样点也不对均衡效果大打折扣。常见的做法是让CDR和DFE联合自适应先用CTLE和VGA把信号调到大致可用的状态然后CDR和DFE同时开始收敛通过迭代逐步逼近最优。这个过程通常需要几毫秒到几十毫秒取决于信道条件和算法参数。我在一个项目里遇到过CDR和DFE打架的情况CDR收敛太快锁到了一个局部最优相位DFE在这个相位下怎么调都调不好。后来把CDR的环路带宽降低让它和DFE的收敛速度匹配问题就解决了。这个经验说明联合自适应里各个环路的收敛速度需要协调不能各跑各的。3.5 误差传播的抑制手段误差传播是DFE的固有风险。一个比特判错会影响后续N个比特的判决可能形成连续错误。抑制误差传播有几种常见手段一是限制抽头系数的最大值。如果某个抽头系数太大一旦判错影响范围就很大。实际设计中会给抽头系数设一个上限牺牲一点均衡能力来换取稳定性。二是用软判决或者部分反馈。不是直接把判决结果反馈回去而是反馈一个置信度加权的结果。这样即使判错了错误的影响也会被削弱。三是加CRC或者FEC。在协议层做前向纠错把DFE残留的错误纠正过来。这是系统级的方案在以太网和PCIe等协议里很常见。四是优化自适应算法。用更稳健的算法比如在误差大时暂时冻结抽头更新避免错误被放大。4. 从零搭建一个DFE仿真验证环境4.1 为什么需要仿真验证DFE的电路实现复杂度很高直接流片风险太大。在实际项目中通常先用行为级仿真验证算法和架构再用晶体管级仿真验证关键模块最后才做整体后仿。行为级仿真可以用Python或MATLAB快速搭建验证DFE在不同信道条件下的收敛性和误码率性能。我一般用Python做行为级仿真因为numpy和scipy的信号处理函数很全画图也方便。下面给出一个简化的DFE行为级仿真框架可以直接参考。4.2 信道建模与ISI生成首先需要建立一个信道模型。最简单的做法是用一个FIR滤波器来模拟信道的脉冲响应。比如一个4抽头的信道import numpy as np # 信道脉冲响应h[0]是主标h[1]到h[3]是后标 h_channel np.array([1.0, 0.5, 0.25, 0.1]) # 生成随机比特序列 np.random.seed(42) N 10000 bits np.random.randint(0, 2, N) * 2 - 1 # 映射到1/-1 # 通过信道 signal_through_channel np.convolve(bits, h_channel, modefull)[:N]这段代码里h_channel就是信道的脉冲响应。h[0]1.0是主标h[1]0.5表示第一个后标是主标的50%h[2]0.25是第二个后标以此类推。实际信道的后标系数可能更复杂但用FIR模型足够验证DFE的基本功能。4.3 DFE行为级模型实现接下来实现DFE的行为级模型。核心就是一个反馈滤波器加一个判决器def dfe_equalizer(signal, h_taps, n_taps): signal: 经过信道的信号 h_taps: DFE抽头系数 n_taps: 抽头数量 N len(signal) decisions np.zeros(N) output np.zeros(N) for n in range(N): # 计算反馈量 feedback 0.0 for k in range(1, n_taps 1): if n - k 0: feedback h_taps[k-1] * decisions[n-k] # 减去反馈量 equalized signal[n] - feedback output[n] equalized # 判决 decisions[n] 1.0 if equalized 0 else -1.0 return output, decisions这个模型里h_taps是DFE的抽头系数n_taps是抽头数量。每个时刻DFE根据前面n_taps个判决结果计算反馈量从当前信号里减掉然后做判决。判决结果又会被后续时刻使用。4.4 自适应抽头系数更新上面的模型用的是固定抽头系数。实际DFE需要自适应用LMS算法更新系数def dfe_lms(signal, n_taps, mu0.01, n_iter5000): signal: 经过信道的信号 n_taps: 抽头数量 mu: LMS步长 n_iter: 迭代次数 N len(signal) h_taps np.zeros(n_taps) decisions np.zeros(N) errors np.zeros(N) for n in range(N): feedback 0.0 for k in range(1, n_taps 1): if n - k 0: feedback h_taps[k-1] * decisions[n-k] equalized signal[n] - feedback decisions[n] 1.0 if equalized 0 else -1.0 # 误差信号 error decisions[n] - equalized errors[n] error # LMS更新 if n n_iter: for k in range(1, n_taps 1): if n - k 0: h_taps[k-1] mu * error * decisions[n-k] return h_taps, decisions, errorsLMS的核心就是那行更新公式h_taps[k-1] mu * error * decisions[n-k]。误差越大系数调整越多误差越小调整越少。mu是步长控制收敛速度和稳定性。4.5 仿真结果分析与参数选择跑完仿真后需要看几个关键指标收敛后的抽头系数、误码率、眼图。抽头系数应该收敛到接近信道后标系数的值。比如信道h[1]0.5DFE的h_taps[0]应该收敛到0.5附近。误码率可以用判决结果和原始比特对比来算。如果DFE工作正常误码率应该比不用DFE时低几个数量级。步长mu的选择很关键。我一般先用0.01试如果收敛太慢就加大到0.05如果震荡就减小到0.005。实际项目中步长通常不是固定的而是分段设置前1000个比特用大步长快速收敛后面切小步长精细调整。提示行为级仿真里没有考虑噪声和采样器失调实际电路里这些因素会显著影响DFE性能。行为级仿真通过后还需要在电路仿真里加入噪声和失调模型再验证一遍。5. 常见问题与排查技巧实录5.1 DFE不收敛或收敛到错误值这是最常见的问题。表现是眼图打不开或者误码率居高不下。排查思路可以按以下顺序先检查信道模型是否正确。如果信道后标系数和DFE抽头数量不匹配比如信道有5个显著后标但DFE只有3个抽头那DFE再怎么调也消不干净。这时候需要增加抽头数量或者用发送端FFE先消掉一部分。再检查LMS步长是否合适。步长太大导致震荡步长太小导致收敛太慢。可以先用一个已知的信道模型做开环测试手动设置抽头系数看眼图能不能打开确认电路本身没问题再调自适应算法。还要检查采样器失调。如果失调太大相当于在反馈信号上叠加了固定误差DFE会收敛到一个有偏的系数上。这时候需要先做失调校准再开DFE自适应。5.2 误差传播导致误码率平台误差传播的表现是误码率曲线在低信噪比区域正常下降但到某个点之后就不再改善形成一个平台。这是因为DFE判错之后错误通过反馈路径传播导致连续错误。解决误差传播可以从几个方面入手限制抽头系数的最大值避免单个抽头权重过大在自适应算法里加入误差门限误差超过门限时暂停更新在系统层面加FEC把残留错误纠正过来。我在一个项目里遇到过误差传播导致的误码率平台后来把第一个后标抽头的最大系数从1.0限制到0.7误码率平台就消失了。代价是均衡能力略有下降但稳定性提升很多。5.3 不同数据率下的DFE参数调整DFE的参数需要根据数据率调整。数据率越高一个UI越短反馈环路的延迟预算越紧。在56Gbps下采样器和反馈滤波器的延迟必须控制在十几皮秒以内这对电路设计是很大的挑战。实际做法是在低数据率下可以用更多抽头和更高精度的DAC因为时序余量大在高数据率下需要减少抽头数量、简化DAC结构优先保证时序收敛。比如25Gbps可以用10个抽头、8位DAC56Gbps可能只能用5个抽头、6位DAC。5.4 常见问题速查表问题现象可能原因排查方法解决措施DFE不收敛步长过大或过小扫描不同步长看收敛曲线分段设置步长先大后小眼图打不开抽头数量不足对比信道后标数量和DFE抽头数增加抽头或加发送端FFE误码率平台误差传播看错误是否连续出现限制抽头系数最大值加FEC收敛后眼图不对称采样器失调测量采样器失调电压加失调校准电路CDR和DFE互相干扰收敛速度不匹配分别测试CDR和DFE单独工作协调环路带宽联合自适应高温下性能下降抽头系数温漂高低温测试对比用数字DFE替代模拟DFE5.5 几个容易踩的坑第一个坑是忽略采样器失调。很多人在行为级仿真里不加入失调结果流片后发现眼图不对称DFE怎么调都调不好。建议在行为级仿真阶段就加入1到2毫伏的随机失调看看DFE的鲁棒性。第二个坑是抽头系数初始化。如果初始值全设为零DFE需要很长时间才能收敛。实际项目中可以用信道估计的结果做初始值或者用一个固定的经验值做初始值能显著加快收敛。第三个坑是忘记考虑反馈路径的延迟。行为级仿真里反馈是即时的但实际电路里采样器和DAC都有延迟。如果延迟超过一个UIDFE的反馈就来不及需要重新设计架构。建议在行为级仿真里加入一个UI的延迟提前验证时序余量。第四个坑是自适应算法在低信噪比下失效。如果信号太差判决错误率太高LMS算法会被错误带偏越调越差。这时候需要先保证CTLE和VGA把信号调到可用的状态再开DFE自适应。5.6 实测中的经验技巧在实际芯片测试中我习惯先用PRBS31码型做DFE收敛测试因为长码型能覆盖更多的ISI组合。收敛后再用PRBS7做快速验证因为短码型测试时间短。看眼图时不要只看眼高还要看眼宽和眼图的对称性。DFE主要改善眼高对眼宽的改善有限。如果眼宽不够可能需要CDR或者发送端FFE配合。调试DFE时可以先把自适应关掉手动扫描抽头系数观察眼图变化。这样能直观地看到每个抽头对均衡效果的贡献帮助理解信道特性。等手动调出最优系数后再开自适应看自适应能不能收敛到接近的值。最后分享一个我常用的调试顺序先调CTLE和VGA把信号幅度调到采样器的最佳工作范围再调CDR让采样点落在眼图中心最后开DFE自适应观察收敛过程。这个顺序能避免多个环路同时调整导致的混乱。
返回列表