第一次在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 Range(HR)和High Performance(HP)两类。这个分类直接影响你在这个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号和UG475(7 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 bank,VCCO必须接1.8V。
- LVDS_25、LVDSEXT_25:面向HR bank,VCCO必须接2.5V。
我的理解是,Xilinx在设计7系列I/O时,为HP bank的1.8V域和HR bank的2.5V域分别做了差分驱动器配置。HP走的是标准LVDS,HR走的是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要求 | 典型用途 |
|---|---|---|
| LVDS | 1.8V | 标准LVDS,ADC/DAC、图像传感器、板间互联 |
| LVDSEXT | 1.8V | 扩展驱动,较长PCB走线或背板传输 |
| RSDS | 1.8V | LCD屏幕面板接口 |
| Mini-LVDS | 1.8V | LCD时序控制器点屏 |
如果用到Kintex-7或Virtex-7,建议尽量把LVDS信号安排在HP bank。HP bank的高速性能更好,信号完整性问题更少,标准也是原生的LVDS,不需要加_25后缀绕来绕去。
3.2 HR Bank可用的差分标准
HR bank在VCCO=2.5V时,能用的标准就要带_25后缀了。这不仅是名字区别,更是驱动能力的区别。
| I/O标准 | VCCO要求 | 典型用途 |
|---|---|---|
| LVDS_25 | 2.5V | 标准LVDS的HR版本,最常见 |
| LVDSEXT_25 | 2.5V | 扩展驱动,适合更长走线 |
| RSDS_25 | 2.5V | LCD点屏 |
| Mini-LVDS_25 | 2.5V | LCD时序控制器 |
| PPDS_25 | 2.5V | 点对点差分显示接口 |
| TMDS_25 | 2.5V | DVI/HDMI类差分传输 |
HR bank在VCCO=3.3V时,绝大多数LVDS差分标准都不可用。能用的差分标准只剩下TMDS_33这类专门为3.3V设计的协议。注意TMDS_33不是LVDS,虽然是差分信号,但它是HDMI/DVI用的电平标准,逻辑上不能和LVDS直接互换。
3.3 核心结论:Artix-7全HR,BANK电压必须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换成LVDS:
set_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脚的IOSTANDARD,N脚没写。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 VCCO=2.5V on the associated bank”。这些信息已经足够定位问题了。
但我在实际项目中发现,很多人对DRC的态度是“看到几十条warning就选择性忽略”。这个习惯在普通逻辑设计里问题不大,但I/O相关的error一定不能忽略,因为这类错误往往不会影响综合和布线,你照样能生成比特流,到了板子上才发现信号完全不对。等到上板发现没波形再回来查,成本就高多了。
4.3 真实DRC报错处理过程
我做过的某块板子,BANK 16接了3.3V,XDC里写的是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.5V,LVCMOS33要求3.3V,这两个电压不可能同时出现在同一个BANK上。所以设计阶段做I/O规划时,就要把“同BANK同电压”这条铁律刻在脑子里。
5. 板级实测:不同VCCO下LVDS的表现和排查链路
5.1 实测环境
我拿一颗Kintex-7和一颗Artix-7做过对比测试。LVDS输出端各接100Ω差分负载,用1GHz示波器加差分探头观察。测了三组配置:
- HP bank,VCCO=1.8V,IOSTANDARD=LVDS
- HR bank,VCCO=2.5V,IOSTANDARD=LVDS_25
- HR bank,VCCO=3.3V,强行把IOSTANDARD写成LVDS_25
前两组工作完全正常,共模在1.2V左右,差分摆幅大约350mV,眼图清晰。第三组,也就是VCCO=3.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.5V,PCB上因为某个电源模块贴错电阻,实际输出只有1.9V,结果LVDS信号幅度明显不足。如果只看原理图不看实测电压,这个问题很难查出来。
5.3 差分终端电阻的确认
LVDS要做到规范传输,接收侧必须接100Ω差分终端电阻。如果你漏了这棵电阻,波形会反射得很厉害,可能会被误判成电平问题。7系列FPGA在部分I/O标准下可以启用片内终端(DCI或DIFF_TERM),但并不是所有HR bank和所有标准都支持。我的建议是,除非官方文档明确支持你的标准,否则一律按外部100Ω电阻来设计,最省心,也不用去记哪些标准能开片内终端。
6. 如果PCB已经做成了3.3V BANK,LVDS怎么救
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在VCCO=3.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电压问题扼杀在源头。这个小技巧不算复杂,但能省下后面大把调试时间。