第一次在Artix-7上栽跟头就是LVDS这件事。板子上一个BANK接了3.3V外设输出标准LVDS信号我在Vivado里把IOSTANDARD随手填成LVDS综合、布线全过上板拿示波器量差分对死活没有波形。排查了一整天才发现7系列FPGA的BANK分成HR和HP两大类LVDS能不能用、用哪个版本跟这个BANK的VCCO电压严格绑定。这个问题听起来基础但实际项目里踩坑的人真不少。尤其是PCB已经投板、电源网络改不动的时候才发现某个BANK跑不了LVDS非常被动。这篇文章就把Xilinx 7系列FPGA不同BANK的LVDS工作电压问题完整讲一遍HR/HP bank的区别、LVDS为什么依赖VCCO、Vivado里怎么防止踩坑、实测波形长什么样以及板子已经做错之后的补救思路。适合正在用Artix-7、Kintex-7、Virtex-7或Zynq-7000做LVDS接口、图像采集、屏幕点屏的工程师参考。1. 先搞清楚7系列的BANK类型HR和HP到底差在哪1.1 HR bank与HP bank的定位和供电范围7系列FPGA和Zynq-7000的I/O bank并不是千篇一律的官方把它们分成了High RangeHR和High PerformanceHP两类。这个分类直接影响你在这个BANK上能选什么I/O标准尤其是差分标准。HR bank面向接口电平复杂的场景VCCO支持1.2V、1.35V、1.5V、1.8V、2.5V、3.3V。它的优势是兼容老设备和多电压系统但高速差分性能相对弱一些。HP bank面向高性能场景VCCO只支持1.0V、1.2V、1.35V、1.5V、1.8V。它的优势是高速I/O性能好很多高速接口标准只在HP bank上可用。放到具体器件上情况是这样的Artix-7全系列基本都是HR bank所以在Artix-7上你要找“能接1.8V LVDS的HP bank”基本找不到Kintex-7、Virtex-7和Zynq-7000则根据封装不同同时包含HR和HP两种bank。这里有一个很常见的误解以为HR和HP只是VCCO范围不同其它一样。实际上两者的I/O缓冲器结构、可用的I/O标准集合都不一样。同样的差分信号在两种bank上的标准命名、电压要求、终端方式都可能是两套逻辑。所以设计一开始就要弄清楚当前这颗器件、当前封装下你用的那些引脚属于哪个BANK。1.2 怎么快速确认BANK类型我建议画原理图之前就把BANK类型全部确认好不要等到PCB回来再对着示波器发呆。确认方式有三个看官方封装和引脚文件Xilinx官网每个器件封装都有Pinout File是CSV格式。文件里每个引脚都标注了BANK号。把BANK号和UG4757 Series FPGAs Packaging and Pinout里的封装图对照就能看到每个BANK是HR还是HP。在Vivado里看新建工程后打开Device视图鼠标点击任意BANK界面会直接显示该BANK是High Performance还是High Range也会列出VCCO支持范围。这个最直观适合快速检查。打开UG471查表7 Series SelectIO Resources User Guide里面有每个I/O标准对BANK类型和VCCO的完整要求。遇到不确定的标准翻这张表最保险。我个人的习惯是在原理图评审阶段就把每个BANK的VCCO、HR/HP类型、用到的I/O标准列成一张表格评审时直接核对。因为Vivado的DRC虽然能拦住一部分问题但如果你漏看了某个BANK的约束DRC也不是每次都那么显眼。2. LVDS为什么必须绑死VCCO不能随便接2.1 LVDS电平的物理需求LVDS信号本身的电气参数不复杂记住三个数就行共模电压大约1.2V差分摆幅典型350mV范围250mV到450mV接收端接100Ω差分终端。发送端要稳定输出这个信号内部差分驱动器的输出级必须工作在一个合适的电源域里这个电源域就是VCCO。如果VCCO和驱动器的设计参数不匹配输出级会偏离正常工作区出来的波形要么完全没有差分分量要么共模和摆幅都不在规格内。我习惯用一个类比来解释就像标称输出12V的电源适配器你非要接到5V输出的档位上虽然芯片有电但你拿不到标称的12V。LVDS也一样不同VCCO对应的是驱动器不同的“校准参数”不能拿3.3V的供电去硬驱动为1.8V域设计的LVDS输出级。很多第一次用7系列的朋友还是按照老款FPGA的习惯去选BANK电压和IOSTANDARD。老款器件可能对VCCO的要求没那么严格到7系列这里I/O标准和VCCO的对应关系是硬约束不符合就是不能用没有模糊空间。2.2 为什么有LVDS和LVDS_25两套标准在Vivado的I/O标准列表里7系列相关的主要有LVDS、LVDSEXT、LVDS_25、LVDSEXT_25。这些名字看起来只是后缀不同实际代表的是两套完全不同的驱动器配置。LVDS、LVDSEXT面向HP bankVCCO必须接1.8V。LVDS_25、LVDSEXT_25面向HR bankVCCO必须接2.5V。我的理解是Xilinx在设计7系列I/O时为HP bank的1.8V域和HR bank的2.5V域分别做了差分驱动器配置。HP走的是标准LVDSHR走的是LVDS_25。如果你的BANK电压是3.3V那么不管LVDS还是LVDS_25从官方支持矩阵看都是不支持的。还有个细节值得提一下。LVDSEXT和LVDSEXT_25属于扩展驱动模式驱动能力更强、摆幅更大适合走线更长或者对信号边沿速率要求更高的场景但功耗和电磁干扰也会变大。普通板内互联用LVDS或LVDS_25就够了没必要一上来就选EXT版本。3. 不同BANK能用的LVDS标准一张表看懂矩阵3.1 HP Bank可用的差分标准HP bank的VCCO上限只有1.8V所以它能用的差分标准基本都围绕1.8V设计。最常用的就是LVDS和LVDSEXT。除此之外像RSDS、Mini-LVDS的1.8V版本也属于这一族通常用在LCD点屏或者短距离高速并转串的场景中。I/O标准VCCO要求典型用途LVDS1.8V标准LVDSADC/DAC、图像传感器、板间互联LVDSEXT1.8V扩展驱动较长PCB走线或背板传输RSDS1.8VLCD屏幕面板接口Mini-LVDS1.8VLCD时序控制器点屏如果用到Kintex-7或Virtex-7建议尽量把LVDS信号安排在HP bank。HP bank的高速性能更好信号完整性问题更少标准也是原生的LVDS不需要加_25后缀绕来绕去。3.2 HR Bank可用的差分标准HR bank在VCCO2.5V时能用的标准就要带_25后缀了。这不仅是名字区别更是驱动能力的区别。I/O标准VCCO要求典型用途LVDS_252.5V标准LVDS的HR版本最常见LVDSEXT_252.5V扩展驱动适合更长走线RSDS_252.5VLCD点屏Mini-LVDS_252.5VLCD时序控制器PPDS_252.5V点对点差分显示接口TMDS_252.5VDVI/HDMI类差分传输HR bank在VCCO3.3V时绝大多数LVDS差分标准都不可用。能用的差分标准只剩下TMDS_33这类专门为3.3V设计的协议。注意TMDS_33不是LVDS虽然是差分信号但它是HDMI/DVI用的电平标准逻辑上不能和LVDS直接互换。3.3 核心结论Artix-7全HRBANK电压必须2.5V才能用LVDS拿最常用的Artix-7来说全系HR bank没有HP bank。所以你在这颗芯片上做LVDS必须满足两个条件VCCO必须是2.5V。IOSTANDARD必须写成LVDS_25不能写成LVDS。很多成品板卡为了兼容3.3V外设把BANK的VCCO统一设计成3.3V。这种板卡上你要接LVDS屏或者LVDS的ADC基本就是死路一条。要么把该BANK的VCCO独立成2.5V要么外接转换芯片没有别的选择。这个结论我在后面补救方案里会再展开。4. Vivado约束与DRC检查把电压问题提前暴露4.1 XDC约束怎么写差分对约束的时候P和N引脚都要设置成同一个IOSTANDARD。以LVDS_25为例set_property -dict [list PACKAGE_PIN AE12 IOSTANDARD LVDS_25] [get_ports lvds_out_p[0]] set_property -dict [list PACKAGE_PIN AE11 IOSTANDARD LVDS_25] [get_ports lvds_out_n[0]]如果是HP bank的LVDS写法一样只是IOSTANDARD换成LVDSset_property -dict [list PACKAGE_PIN AE12 IOSTANDARD LVDS] [get_ports lvds_out_p[0]] set_property -dict [list PACKAGE_PIN AE11 IOSTANDARD LVDS] [get_ports lvds_out_n[0]]有一点要提醒很多人写XDC时只写了P脚的IOSTANDARDN脚没写。Vivado在部分版本里会自动推导但有时候会报warning。最好养成P和N成对写的习惯避免后续版本升级或者跨工程移植时出问题。4.2 Report DRC能抓到什么问题在Vivado里完成综合或布局布线后运行Report DRC如果IOSTANDARD和BANK电压不匹配会看到类似这样的错误“I/O standard LVDS is not valid on bank X because VCCO is not in the supported range”或者“LVDS_25 requires VCCO2.5V on the associated bank”。这些信息已经足够定位问题了。但我在实际项目中发现很多人对DRC的态度是“看到几十条warning就选择性忽略”。这个习惯在普通逻辑设计里问题不大但I/O相关的error一定不能忽略因为这类错误往往不会影响综合和布线你照样能生成比特流到了板子上才发现信号完全不对。等到上板发现没波形再回来查成本就高多了。4.3 真实DRC报错处理过程我做过的某块板子BANK 16接了3.3VXDC里写的是LVDS_25跑完Report DRC后直接报这个BANK的VCCO不符。处理步骤很简单先把该BANK的VCCO从3.3V改成2.5V然后再确认这个BANK上其它所有信号的I/O标准都兼容2.5V。如果这个BANK上还挂了3.3V的LVCMOS器件那就不能简单改电压得换BANK或者换方案。这里引申出一个重要的设计原则一个BANK只能有一种VCCO。你在同一个BANK里同时安排LVDS_25和LVCMOS33本身就是矛盾的需求因为LVDS_25要求2.5VLVCMOS33要求3.3V这两个电压不可能同时出现在同一个BANK上。所以设计阶段做I/O规划时就要把“同BANK同电压”这条铁律刻在脑子里。5. 板级实测不同VCCO下LVDS的表现和排查链路5.1 实测环境我拿一颗Kintex-7和一颗Artix-7做过对比测试。LVDS输出端各接100Ω差分负载用1GHz示波器加差分探头观察。测了三组配置HP bankVCCO1.8VIOSTANDARDLVDSHR bankVCCO2.5VIOSTANDARDLVDS_25HR bankVCCO3.3V强行把IOSTANDARD写成LVDS_25前两组工作完全正常共模在1.2V左右差分摆幅大约350mV眼图清晰。第三组也就是VCCO3.3V强行跑LVDS_25的情况FPGA引脚上基本看不到正常的差分波形示波器上只有类似共模漂移的杂乱噪声完全没法用。这说明官方支持矩阵不是随便写的电压不对波形就是不对。5.2 排查链路从“没波形”到定位BANK电压如果你也遇到LVDS没波形的问题别急着怀疑芯片坏了按这个顺序排查确认XDC里的IOSTANDARD和实际使用的BANK类型是否匹配。比如Artix-7全HR就只该用LVDS_25而不是LVDS。打开Vivado的Device视图检查该BANK的HR/HP类型和VCCO支持范围。用万用表量PCB上该BANK的VCCO引脚确认实际电压。这一步最容易被忽略因为原理图设计和实际焊接可能不一致特别是外购板卡必须量到引脚上才算数。查一遍Report DRC重点看I/O相关的error和warning。用示波器在FPGA引脚处量差分信号确认不是PCB走线短路、串了电阻、或者接错线。这里面第一步和第三步最关键。我见过一个案例原理图上BANK电压画的是2.5VPCB上因为某个电源模块贴错电阻实际输出只有1.9V结果LVDS信号幅度明显不足。如果只看原理图不看实测电压这个问题很难查出来。5.3 差分终端电阻的确认LVDS要做到规范传输接收侧必须接100Ω差分终端电阻。如果你漏了这棵电阻波形会反射得很厉害可能会被误判成电平问题。7系列FPGA在部分I/O标准下可以启用片内终端DCI或DIFF_TERM但并不是所有HR bank和所有标准都支持。我的建议是除非官方文档明确支持你的标准否则一律按外部100Ω电阻来设计最省心也不用去记哪些标准能开片内终端。6. 如果PCB已经做成了3.3V BANKLVDS怎么救6.1 改BANK供电是首选如果这个BANK上只挂了LVDS相关的外设没有其它3.3V单端器件那么直接把该BANK的VCCO改成2.5V就是最优解。改之前要确认三件事FPGA该BANK的VCCO引脚是否独立。有些封装里相邻BANK共用电源网络不一定能单独分割。其它挂在同一个BANK上的外设是否也能工作在2.5V。特别是那些原来工作在3.3V的外设2.5V下可能不满足输入高电平阈值。外设的IO是否可能往FPGA灌入超过VCCO的电压。如果外设还是3.3V供电而FPGA该BANK是2.5V就有漏电和闩锁风险需要在中间加电平转换。6.2 增加LVDS转换芯片如果改不了供电那就只能加芯片。可以用LVDS转LVCMOS、或者LVDS中继器把外设的LVDS信号先转成单端或转换到合适的电平再进FPGA普通IO。反向也就是FPGA要输出LVDS但BANK只有3.3V时可以用单端转LVDS的驱动器芯片。这个方案的问题是增加成本和PCB面积而且转换芯片会引入延迟不适合每一条链路都盲目加。但对于已经做错的板子这是最务实的救法。选型时注意看转换芯片的共模范围、速率、以及差分摆幅是否匹配真正的LVDS不要拿个RS422的片子糊弄电平标准都不一样。6.3 换用HR bank支持的3.3V差分标准HR bank在VCCO3.3V下能用的差分标准很少TMDS_33是其中一个。如果对端设备支持TMDS协议例如接了DVI/HDMI的接收端那么可以试着用TMDS_33跑。但如果你对面是个标准LVDS屏或LVDS ADC这条路就走不通因为LVDS和TMDS的电气参数、共模电压、逻辑定义完全不同不能直接互换。6.4 换FPGA选型把LVDS放到HP bank如果项目还没有定型最一劳永逸的方案是选带HP bank的器件把LVDS信号全部放到HP bank上VCCO做1.8V用标准LVDS。Kintex-7、Virtex-7、Zynq-7000的部分封装都有HP bank。Artix-7没有HP bank这也是很多低成本方案里LVDS难用的根源。我不止一次在项目里见到硬件工程师为了省成本选了Artix-7结果发现要做LVDS接口BANK电压规划不出来最后要么改板要么加转换芯片整体成本反而更高。所以选型阶段就把LVDS的需求摆到台面上比什么都重要。最后分享一个我自己的习惯。现在我画FPGA板子会把每个BANK的VCCO设计成可跳线切换1.8V、2.5V、3.3V各留一个跳线位置调试时可以根据实际外设灵活调整。再配合Vivado的I/O Planning在生成XDC之前就把所有差分对约束过一次跑一遍DRC再画PCB基本能把LVDS电压问题扼杀在源头。这个小技巧不算复杂但能省下后面大把调试时间。