ARTICLE DETAIL

资讯详情

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

FPGA LVDS接口设计实战:AC/DC耦合、共模电压与DQS_BIAS配置

FPGA LVDS接口设计实战:AC/DC耦合、共模电压与DQS_BIAS配置 FPGA项目里只要带上LVDS十有八九会在耦合方式和共模电压上栽一回。前阵子帮朋友调试一块采集板LVDS时钟进来后偶发误码示波器打上去眼图看着也算合格但隔几分钟就丢一个bit。排查到最后才发现是硬件同事照着老方案在接收端多加了一组分压偏置电阻硬生生把共模电压压到了接收器临界区间信号长期在“能通和不能通”之间反复横跳。这种问题在Xilinx FPGA的LVDS接口设计里太常见了不是信号质量本身不行而是AC/DC耦合选择、共模电压匹配、还有DQS_BIAS这个内部偏置功能没用对。这篇文章就围绕这三个核心点来拆解。我会从LVDS的电气原理讲起把什么时候选AC耦合、什么时候选DC耦合、共模电压到底怎么算、DQS_BIAS在Xilinx FPGA里怎么配置全部用实战视角过一遍。适合正在做FPGA硬件设计、板级调试或者被LVDS接口折腾过的工程师参考。1. 先说底层原理LVDS为什么能跑高速又为什么容易翻车1.1 电流环、终端电阻和350mV摆幅LVDS全称是Low-Voltage Differential Signaling低压差分信号。它的驱动端本质上是一个恒流源输出电流典型值3.5mA。接收端为了把这个电流“收集”起来必须接一个100Ω的终端电阻。电流流过100Ω电阻在电阻两端产生350mV左右的压降这就是差分信号的摆幅来源。理解这一点非常关键。LVDS不是像TTL那样靠电压高低表示0和1而是靠电流方向来定义逻辑状态。接收器内部是一个高速比较器它只关心P端和N端之间的差值也就是Vp - Vn。P端电流流入、N端流出差分电压是正350mV接收器判为1反过来就是负350mV判为0。所以LVDS的“高值”和“低值”并不是指某个引脚对地的绝对电压而是两个引脚之间的相对关系。用拉闸拔河来打比方可能更好理解差分对两端各有一个人3.5mA电流就是那股拉力拉力往左偏350mV就是“高”往右偏350mV就是“低”至于两个人站在海拔零米还是二十米的位置接收器本身并不太关心——但这里隐藏着一个条件就是两个人站的高度不能差太多否则比赛就没法进行了。这个“双方站的高度”就是共模电压。1.2 共模电压才是LVDS真正容易翻车的地方共模电压的定义很简单就是差分对P端和N端电压的平均值也就是 (Vp Vn) / 2。LVDS标准规定接收器一般可以接受0.2V到2.2V的共模范围但绝大多数驱动器的输出共模都在1.1V到1.4V之间典型值是1.2V。也就是说P端和N端如果都围绕1.2V上下摆动各自摆幅约±175mV这就是一个非常标准的LVDS信号。共模电压为什么容易翻车因为FPGA内部的输入缓冲器特别是Xilinx 7系列里最常见的HPHigh Performancebank在配置成LVDS标准时对输入共模电压的范围是有明确限制的。以VCCIO1.8V的HP bank为例参考手册给出的输入共模范围大致在0.35V到1.5V左右。如果输入信号的共模电压超出这个区间接收器内部的差分对会进入非线性区甚至饱和区轻则导致差分摆幅被压缩、时序裕量下降重则直接出现误码。而不少工程师在使用LVDS时习惯了“照着参考设计”抄看到别人加了电阻偏置网络就也跟着加看到别人用电容耦合也跟着用电容完全不考虑发送端的实际输出共模和FPGA接收端的偏置要求。结果是DC耦合时被多余的电阻分压拉偏了共模AC耦合时又没有给接收端提供有效的共模参考点信号质量当然好不了。1.3 FPGA内部输入缓冲器对共模电压的要求Xilinx FPGA的I/O bank分HP和HR两大类。HP bank支持更高性能的电平标准VCCIO通常是1.8V或更低适合DDR、LVDS这类高速接口HR bank的VCCIO可以到3.3V但是高速性能相对弱一些。LVDS接口建议优先放在HP bank上这不是随便说的因为HP bank的输入差分放大器在设计上为LVDS这类低摆幅高速信号做了优化可接受的共模范围也相对合理。很多人容易忽略一点Xilinx FPGA的LVDS输入除了要满足电平标准之外还要求P和N两条单端线路的走线尽量等长、等距保证共模信号在到达接收器时没有明显偏移。如果单端走线长度差得太多差模信号会部分转化成共模噪声接收器看到的就不再是干净的350mV摆幅而是叠加了共模干扰的信号误码率会明显上升。所以在设计LVDS接口时第一步不是急着选电阻和电容而是先搞清楚三件事发送端的输出共模电压是多少接收端FPGA所在bank支持的电平标准和共模范围是多少选择了AC耦合还是DC耦合之后接收端内部或外部的共模偏置从哪里来带着这三个问题去选方案才不会出现“乱接电阻”的尴尬。2. AC耦合还是DC耦合不是拍脑袋决定的2.1 DC耦合两端共模能对上就直接连DC耦合就是发送端和接收端之间直接连接中间不串电容不给交流信号制造任何隔断。它的最大好处是低频特性和直流特性完整信号不会因为电容的充放电而产生位模式相关的漂移眼图干净调试简单。DC耦合的适用前提只有一个发送端输出共模和FPGA接收端可接受的共模范围匹配。比如发送端是一个标准的LVDS驱动器输出共模1.2VFPGA这边是HP bankVCCIO1.8V共模范围0.35V到1.5V那么直接连过去完全没问题接收端既不需要外部偏置电阻也不需要内部DQS_BIAS。这个时候如果谁在接收端加了一组电阻分压偏置网络反而会人为改变共模电压属于典型的“好心办坏事”。另一个DC耦合的典型场景是两颗FPGA之间互联。大家都是Xilinx芯片都把IO配置成LVDS输出共模都是1.2V接收端都能接受直接连线加上终端电阻干净利落。这时候我在实际项目中还会把FPGA内部的100Ω差分终端电阻选项打开也就是在约束里给电平标准加上DIFF_TERM然后用内部终端替代外部电阻既省了器件又减少了板级布局的压力。DC耦合要注意一个细节确认发送端和接收端的电源域确实一致。我遇到过一些“DC耦合直连结果量出来电平不对”的案例最后发现是发送端供电2.5V接收端VCCIO1.8V发送器输出的共模偏高已经压到HP bank接收范围的上限附近这种场景下老老实实改AC耦合或者换一个能匹配共模的接口芯片才是对的。2.2 AC耦合隔直电容后面的共模谁来管AC耦合在串行高速接口里特别常见比如PCIe、SerDes、GTP/GTX等几乎都要求AC耦合。它的本质是用电容把直流分量隔掉只让交流差分信号通过。好处是两端的电源域和共模电压完全解耦发送端就算是2.5V电平接收端1.8V只要交流信号还在就能正常工作坏处是隔直电容后面接收端必须自己建立共模偏置否则信号的“参考高度”会悬空。这里就是“乱接电阻”问题的高发区。很多方案在AC耦合之后只在电容后面接了FPGA的输入引脚并没有任何偏置网络。这时候FPGA输入buffer的输入节点在直流上处于不确定状态——它可能被内部ESD二极管钳位到某个电源轨附近也可能因为漏电慢慢漂到一个奇怪的电平。差分信号进来后叠加在这个不确定电平上面接收器是否能正确判断完全看运气。我见过不少所谓“偶发误码”的板子就是这种原因造成的。AC耦合的正确做法是必须给接收端提供一个明确的共模参考。常见方案有三种。第一种用两个等值电阻分压从VCCIO分出一个偏置电压再接到差分对的P和N上第二种RC网络单独给P和N分别接电阻但配合一个大电容做AC旁路这种方式相对少见第三种也是最推荐在Xilinx FPGA上使用的方式借助内部的DQS_BIAS功能自动生成偏置后面会专门讲。2.3 如何快速判断用AC还是DC判断逻辑其实很简单三步走查看发送端数据手册中的输出共模电压范围记为Vcm_tx查看FPGA接收端所在bank的LVDS输入共模范围记为Vcm_rx如果Vcm_tx完全落在Vcm_rx范围内且两端电源域一致优先用DC耦合如果范围有交集但不充分或者电源域不同果断选AC耦合并安排好接收端偏置。还有一个容易被忽视的场景发送端是3.3V的LVDS器件输出共模可能接近2V而FPGA是HP bankVCCIO1.8V共模范围上限大约1.5V。这种信号如果强行DC耦合接收器长期工作在共模超范围的状态信号能跑但眼图和时序裕量会很难看。正确做法是AC耦合并且把接收端共模偏置拉低到1.2V甚至更低的安全区间。快速判断表格场景推荐耦合方式接收端偏置方案标准LVDS驱动输出共模1.2VFPGA HP bankDC耦合不需要额外偏置可开启内部差分终端两颗FPGA互连共模一致DC耦合不需要额外偏置3.3V LVDS器件接1.8V HP bankAC耦合DQS_BIAS或外部电阻分压传输距离较长需要隔离直流分量AC耦合DQS_BIAS或外部电阻分压发送端共模未知或电源域不确定AC耦合优先DQS_BIAS省成本3. 共模电压的实测与误区3.1 为什么示波器上看到的好波形可能骗了你调试LVDS时用示波器探头去打P端或者N端的单端波形看到的是大约1.2V附近、摆幅±175mV的小信号。这个波形如果刷得比较干净很多工程师就会觉得信号没问题。但实际上单端波形只能说明“某一根线相对GND在动”完全不能反映差分信号本身的质量。差分信号的质量必须看P减N的差分波形。正负脉冲幅度对不对、过冲有多大、差分眼图是否张开这些参数才是接收器真正关心的。更关键的是共模电压异常时单端波形看起来可能完全正常因为两条线的电压都同步向上或向下偏移差分波形依然是350mV摆幅可接收器就在那儿抱怨共模超范围了。所以调试LVDS有条件的一定要用差分探头或者至少用示波器的数学通道A-B功能去观察差分眼图同时还要单独监控Vcm的变化。我在一次板级调试中遇到过非常典型的案例单端波形测着漂亮眼图数学通道也正常但在快速温度变化时偶发误码。后来把P和N的直流电平分别监控才发现是某个DC-DC电源的纹波耦合到了发送端参考电源上导致共模电压在1.15V到1.35V之间周期性波动拨到了一定温度点就触发临界。这类问题不盯共模电压是根本发现不了的。3.2 外部电阻偏置网络的计算与画法如果不用DQS_BIASAC耦合后就需要外部电阻分压来建立偏置。以HP bank、VCCIO1.8V为例目标是给接收端提供一个大约0.9V左右的共模偏置。最简单的做法是用两个等值电阻比如10kΩ分别从上拉到VCCIO、下拉到GND中间节点接差分对的P和N。但这个节点接上去之后其实是在P和N上并联了一个源阻抗为R1//R2的偏置网络。R1R210kΩ并联后源阻抗是5kΩ。5kΩ对LVDS这种低阻抗驱动来讲影响不大但要注意别选太小比如两个1kΩ并联源阻抗500Ω接收端输入阻抗会被显著拉低差分信号衰减明显也别选太大比如100kΩ抗噪能力差稍微有点漏电流就会导致偏置漂移。偏置节点还需要接一个旁路电容到GND作用是降低偏置网络在高速下的交流阻抗滤掉电源噪声和耦合进来的干扰。容值一般取0.01uF到0.1uF我习惯放0.1uF配合10kΩ分压RC时间常数足够大不会对LVDS的交流信号造成明显衰减。布局上分压电阻和旁路电容必须尽量靠近FPGA的接收引脚走线要短要粗特别是偏置节点到P、N引脚的连接尽量对称避免两条路径阻抗不一致造成共模转差模。如果实在担心对称性也可以把偏置电阻做成一组0402封装放在焊盘旁边比用0805更好布置。3.3 常见错误乱加终端电阻、乱并电容“别再乱接电阻”这个标题说的就是这几种问题。第一种错误是终端电阻加重复。FPGA内部一旦把差分终端DIFF_TERM开启就是已经在P和N之间并了一个100Ω电阻外部要是再放一个100Ω等效终端就变成50Ω驱动电流不变的情况下差分摆幅直接砍半接收器还认为信号太弱。所以要么用内部终端要么用外部终端二选一不能都上。第二种错误是在差分对上并联对地小电容。有人想滤除共模噪声就在P和N各自对地加了大电容结果把差分信号的边沿拉慢了。LVDS信号本身只有350mV摆幅边沿本来就快加上电容后上升时间严重恶化接收眼图闭合。共模噪声靠偏置网络和合理的电源设计去解决不是靠对地电容乱滤波。第三种错误是分压偏置和DC耦合混用。本来发送端共模和接收端范围匹配DC耦合直接能跑结果参考电路图里带着一组分压电阻把共模硬拉到另一个电平。这种情况在复制粘贴别人的原理图时特别常见无端增加了一堆无用的元件还制造了新的故障源。4. DQS_BIASXilinx FPGA里的免电阻偏置功能4.1 DQS_BIAS到底是什么DQS_BIAS是Xilinx 7系列及部分后续系列FPGA在HP I/O bank上提供的一个内部偏置功能专门解决AC耦合差分信号的共模建立问题。它的核心作用是在输入端不需要任何外部电阻的情况下内部电路自动为P和N引脚提供一个直流偏置电平让接收器工作在正确的共模点上。这个功能最早是为了DDR接口的DQS信号设计的因为DQS在AC耦合模式下需要共模偏置而外部又不太方便放电阻去拉偏置。后来Xilinx把它开放到其他差分输入场景LVDS信号同样可以利用。偏置电平在1.8V VCCIO下大约0.6V级别处于HP bank接收器可接受范围内配合350mV的差分摆幅接收器可以非常稳定地判断信号。这里需要强调一下DQS_BIAS只适用于HP bankHR bank没有对应的内部电路不能用。同时DQS_BIAS面向的是AC耦合场景如果信号已经DC耦合且共模正常就不需要也不应该开启它否则内部偏置会和外部直流电平打架反而把共模搞到不确定状态。4.2 什么场景用DQS_BIAS什么场景不能用我实际项目里的经验是以下几种场景优先用DQS_BIASAC耦合进来的LVDS时钟信号源端是其他板卡的LVDS驱动器两块板卡电源域不同中间串了隔直电容AC耦合进来的FPGA间互联高速信号比如Aurora之类的协议虽然走GTP/GTX时不需要外部IO buffer级别的偏置但需要外部IO引脚的场景下DQS_BIAS很合适DDR接口的DQS信号AC耦合模式下用DQS_BIAS替代外部电阻偏置网络既省器件又减少走线难度。以下几种场景不能用DQS_BIASHR bank的LVDS输入遗憾7系列HR bank没有这个功能DC耦合且共模本身正常的场景没必要开启输入端还需要外加终端电阻偏置到特定高电平时外部偏置和内部偏置会冲突差分信号作为普通数据输入且后续逻辑需要比较精确的共模电平时DQS_BIAS的内部偏差可能无法满足要求。4.3 如何在Vivado里配置DQS_BIAS在Vivado里使用DQS_BIAS关键是在HDL代码中实例化IBUFDS原语并将DQS_BIAS属性设为TRUE。DIFF_TERM属性用于控制内部100Ω终端电阻可以根据是否使用外部终端决定开还是关。一个典型的AC耦合LVDS时钟输入代码如下IBUFDS #( .DIFF_TERM(TRUE), .DQS_BIAS(TRUE), .IOSTANDARD(LVDS) ) u_ibufds ( .O (lvds_clk_int), .I (lvds_clk_p), .IB(lvds_clk_n) );实例化之后引脚级约束和普通LVDS约束没有区别。时钟信号还需要加时序约束set_property PACKAGE_PIN AC18 [get_ports lvds_clk_p] set_property IOSTANDARD LVDS [get_ports lvds_clk_p] set_property DQS_BIAS TRUE [get_ports lvds_clk_p]注意一个细节虽然DQS_BIAS主要是通过原语属性控制但在XDC里也可以对顶层端口设置相关属性Vivado在综合和实现阶段会自动传递到内部IBUFDS。如果你只是把端口torance到LVDS标准而没有在IBUFDS上使能DQS_BIAS那么AC耦合后就没有内部偏置FPGA输入引脚会悬空在一个不确定电平上。另外AC耦合输入的信号如果是时钟还要注意时钟布线资源。7系列FPGA中差分时钟引脚的P端通常走专用时钟输入路径。使用DQS_BIAS不会影响时钟规划但建议在综合后检查一下时钟REPORT确认时钟进入MRCC/SRCC引脚并且没有意外落到普通IO上。4.4 DQS_BIAS与外部电阻偏置方案对比对比项目DQS_BIAS内部偏置外部电阻偏置网络适用bankHP bank所有bank外部元件数量无至少3个两个分压电阻一个电容偏置电平内部固定约0.6V级别可手动设计灵活调节抗电源噪声能力内部参考源较稳定依赖VCCIO品质VCCIO纹波会耦合进去布局面积最小需要靠近引脚摆放适用场景AC耦合LVDS/DQSAC耦合LVDS特别是HR bank必须采用从我个人的工程偏好来说只要条件允许HP bank、AC耦合我都会优先用DQS_BIAS。理由很简单板级电阻和电容再少一个PCB布局就宽松一分可调的坑就少一个。外部电阻方案当然有其价值特别是在HR bank或者需要把共模精确固定在某个值时DQS_BIAS就力不从心了这时候外部网络是唯一选择。5. 实战排查LVDS接口常见故障速查5.1 典型的5个故障现象和处理建议在调试LVDS接口时下面几个问题出现频率非常高我整理成一张速查表方便排查时对照。故障现象可能原因处理建议偶发误码眼图张不开接收端共模偏移不在FPGA允许范围测量Vcm检查是否有多余分压电阻或内部偏置冲突数据全反或者时钟相位反了差分对P/N接反交换布局或修改约束或调换CHANNEL逻辑极性高速传输时信号反射严重终端电阻位置不对或长度过长终端电阻靠近接收端差分阻抗控制在100Ω±10%长距离连“0”或连“1”后误码AC耦合电容太小低频截止过高检查隔直电容一般用0.1uF不达标就换大时好时坏温度变化后恶化共模电压临界电源纹波耦合抓共模波形加旁路或改用DQS_BIAS稳定内部参考5.2 踩过的几个坑给你提个醒第一次用DQS_BIAS时我犯过一个低级错误以为加了AC耦合电容FPGA就自动知道要偏置了结果在IBUFDS里没有设置DQS_BIASTRUEDQS信号进来之后长期工作在不确定电平上系统说不了几句话就一个bit错误。后来查了几天才发现仅仅是少了一个属性。所以每次例化IBUFDS我都会先看DIFF_TERM和DQS_BIAS两个属性有没有写对这个习惯保住了很多个晚上。另一个坑发生在HR bank上。有一款板子因为引脚扇出太多把LVDS放在了VCCIO3.3V的HR bank上设计同事想用DQS_BIAS解决AC耦合的偏置问题但综合时发现该bank根本不支持这个功能。最后只能用外部电阻分压将共模偏置到1.2V左右才稳定工作。这件事提醒我原理图阶段就要先确认IO bank类型别把方案定到实现不了的路径上。还有一次外部偏置电阻网络用了0805封装布局时为了走线方便放在了距离FPGA引脚将近1厘米的位置结果差分线在到达偏置网络之前的段阻抗不连续反射叠加在信号上眼图变成了“三层楼”。后来把偏置电阻换成0402封装紧贴着引脚放问题立竿见影地消失了。LVDS这种低摆幅高速信号布局上的一点点疏忽最终都会在时序上兑现。关于AC耦合电容的选型我再多提一句隔直电容的容值不是越大越好也不是越小越好。太小低频截止点升高长连“0”或连“1”时信号会向零电平漂移太大上电瞬间的充电电流会拉偏发送端的输出电压。LVDS接口一般0.1uF是业界常用的中间值如果数据率很高可以用0.01uF到0.1uF之间做仿真确认不要盲从别人图纸上的值。最后分享一个调试小技巧用差分探头测完眼图之后再切到共模测量模式看一下Vcm的动态范围。如果LVDS信号在高速切换时Vcm有明显波动多半是发送端参考地或电源的瞬态响应不好这时候调节偏置方案或者增加参考去耦电容比盲目加大终端电阻有效得多。这个习惯帮我解决过好几个“怎么改电阻都修不好”的疑难杂症你也可以试试。
返回列表