FPGA LVDS 差分 IO 用法:IBUFDS/OBUFDS、片内终端与 P/N 约束一次讲清
ADC、DAC、CMOS 图像传感器给出的接口几乎都是一对时钟加若干对数据的 LVDS 差分信号。FPGA LVDS 差分 IO 用法的核心并不神秘:片内有专门的 IBUFDS/OBUFDS 原语做差分与单端的转换,bank 上要配 2.5V 的 VCCO 和正确的 IOSTANDARD,片内还藏着一颗可开关的 100Ω 终端电阻;真正的工作量在引脚配对、bank 电压、板级等长这些约束细节上。本篇只讲 FPGA 侧的落地,通用 LVDS 电气原理(电流模驱动、3.5mA 恒流、共模偏置)在 LVDS 差分信号:为什么两根线比一根线抗干扰 里展开,bank 供电机制见 FPGA IO bank 与 VCCO 约束,单端电平基础见 FPGA LVCMOS 电平标准。
本文要回答的问题
- 一对 P/N 差分线进 FPGA,RTL 里到底例化什么、约束里到底写哪只脚?
- DIFF_TERM 打开的片内 100Ω 终端是什么,什么情况下板上不用再焊电阻?HR bank 和 HP bank 行为为何不同?
- 为什么 N 脚在 XDC 里单独写约束会报错,差分对为什么必须落在同一 bank 的相邻引脚?
- PCB 上差分对等长要做到什么数量级,100Ω 差分阻抗和跨分割怎么处理?
- 同样跑差分、同样叫高速,LVDS 普通 IO 与 ISERDESE、MGT 千兆收发器的分工界线在哪?
先用一张六步流程卡给出从原理图到上板的完整落地顺序,后面逐节展开每一步的机制与坑。
读这张卡抓住一条主线:前三步是「电气能不能通」,后三步是「工程能不能收」。灰色的 bank 选择决定一切——LVDS_25 要求所在 bank 的 VCCO 接 2.5V,bank 选错通篇返工。
一、差分信号 30 秒回顾:接收器只做一件事,减法
LVDS(Low Voltage Differential Signaling,低压差分信号)用两根线传一个比特:P(正相)和 N(反相)携带互补电平,接收端不关心任何一根线对地的绝对电压,只关心两者的差。发送端翻转时 P 升 N 降,差分电压 Vdiff = VP − VN 在正负约 350mV 之间摆动;外界干扰(电源纹波、邻近串扰、地弹)大多同时、同相地耦合到两根紧耦合走线上,形成共模电压,减法之后被对消掉。
读这张波形看减法的效果:共模干扰出现的几拍里,焊盘上的 P 和 N 对地电平同时被抬升(两条波形的中间段同向变形),两根线对地电压都变了,但二者之差不变,IBUFDS 的输出仍然干净地复现原始比特流。这就是差分抗干扰的全部物理直觉——紧耦合走线让噪声「同相、等幅」地落在两根线上,接收器再用减法把它消掉。也因此,LVDS 对「两根线被区别对待」非常敏感:一根线比另一根长、一根跨过分割缝另一根没有,干扰就从共模变成差模,减法消不掉。更完整的电流模驱动与电平定量见 LVDS 差分信号原理篇。
二、IBUFDS 与 OBUFDS:差分在 FPGA 的入口和出口
在 Xilinx 7 系列里,差分对进入 fabric 之前必须经过专用原语,用户逻辑永远只看到单端信号。
- IBUFDS(Differential Input Buffer):输入缓冲,接 P/N 两个焊盘,输出一个单端 bit 给 fabric 或直接送给 ISERDESE2。
- OBUFDS(Differential Output Buffer):输出缓冲,输入一个单端 bit,从 P/N 两个焊盘送出互补电平。
- 双向差分信号用 IOBUFDS(内含输入、输出加三态),用法是前两者的并集。
- IBUFDS_GTE2 名字相近,但它是 MGT 专用参考时钟缓冲,只服务千兆收发器的 MGTREFCLK,不进 fabric;普通随路 LVDS 时钟不要用它。
读这张图抓住一个分叉:数据对和随路时钟对都走 IBUFDS 进门,但进门之后去向不同——数据对送给 fabric 触发器或 ISERDESE2 做串并转换,时钟对则直接去 BUFG/BUFIO 这类时钟缓冲,绝不进普通布线。橙色节点是下一节的主角:终端电阻并在焊盘处,在缓冲之前就把信号「收尾」。发送方向是镜像过程:fabric 的单端 bit 进 OBUFDS,P/N 互补电平出焊盘。
例化本身只有几行,端口命名上 I 接 P 脚、IB 接 N 脚,顺序反了逻辑就全反:
IBUFDS #(
.DIFF_TERM("TRUE"), // 打开片内 100Ω 终端
.IOSTANDARD("LVDS_25") // 属性也可只写在 XDC
) u_ibufds_data (
.I (adc_data_p), // P 脚
.IB(adc_data_n), // N 脚
.O (adc_data_s) // 进 fabric 的单端信号
);IOSTANDARD 这一行最容易绊住新手。7 系列的 LVDS_25 要求 bank VCCO = 2.5V,用于 HR(High Range,宽压)bank;LVDS(隐含 1.8V)用于 HP(High Performance)bank。输入侧两个名字在不少器件上都能见到,输出侧限制更严:部分器件的 HR bank 不支持 LVDS 输出电流模驱动,需要用等效的 LVDSEXT_25 加外部电阻网络,或换到 HP bank——具体支持矩阵以目标器件的数据手册 SelectIO 资源表为准,不要凭记忆选。bank 与 VCCO 的配套规则见 FPGA IO bank 与 VCCO 约束,单端 LVCMOS 的电压命名规律见 FPGA LVCMOS 电平标准。
三、DIFF_TERM:片内 100Ω 终端何时打开、何时不能依赖它
LVDS 传输线的差分阻抗标称 100Ω,信号要在接收端被一个等值电阻吸收,否则能量反射回发送端形成振铃。传统做法是在连接器旁、接收焊盘前跨接一颗 100Ω 贴片电阻;7 系列把这颗电阻做进了芯片,IBUFDS 的 DIFF_TERM(新版原语/约束里称 DIFF_TERM_ADV,阻值可选,常用档位仍为 100Ω)置 TRUE 即在 P/N 焊盘后并入片内电阻。开了它,原理图上这颗外部电阻就不必再放——两处都留着等于 50Ω 终端,摆幅减半,反而坏事。
读这张图记住「终端只有一颗,放在接收端」:蓝色走线是 100Ω 传输线,两个橙色节点是终端的两种实现方式——外置贴片或片内电阻,同一对线上二选一;绿色是接收端。工程判据有三条:第一,终端永远在接收端,多点拓扑或收发切换场景要按数据流方向判断;第二,HR bank 的 LVDS_25 输入支持片内终端,HP bank 的部分 LVDS 输入档位片内终端不可用或要求外部终端(各代器件差异不小,UG471 与数据手册的 DCI/DIFF_TERM 表格给出准确支持情况,数量级结论是「先查表再决定焊不焊电阻」);第三,发送端不需要终端,OBUFDS 一侧不要画蛇添足开 DIFF_TERM。设计早期若拿不准,保守做法是原理图预留外部电阻焊盘、默认不贴,片内终端验证可用后再省料。
四、引脚配对与 XDC:只约束 P 脚,N 脚自动配对
FPGA 的差分引脚在封装上是固定成对的:每个可做差分的 P 脚都有一个物理相邻、同属一个 bank 的 N 脚与之绑定,封装引脚表里成对列出(如 UIO-LXXP / LXXN)。由此产生四条硬规则:
- P/N 必须在同一 bank 且物理相邻,不能从两个 bank 各挑一只脚凑成差分对,也不允许跨字节组乱配;
- XDC 里只约束 P 脚,给它起逻辑端口名并写 IOSTANDARD,工具根据封装配对自动把相邻 N 脚分配给该端口的负端;N 脚若再写一条独立的
set_property PACKAGE_PIN,实现期会直接报引脚冲突; - 一对差分脚的电平标准必须一致,由 P 脚约束带出;
- 引脚交换(swap)空间比单端小得多,做可交换位宽总线时要看封装工具报告的可交换组,P/N 对整体交换、不可拆散。
# 数据差分对:只写 P 脚,N 脚自动配对
set_property PACKAGE_PIN U19 [get_ports adc_data_p]
set_property IOSTANDARD LVDS_25 [get_ports adc_data_p]
set_property DIFF_TERM_ADV TERM_100 [get_ports adc_data_p]
# 随路时钟对:同样只写 P 脚
set_property PACKAGE_PIN V20 [get_ports adc_dclk_p]
set_property IOSTANDARD LVDS_25 [get_ports adc_dclk_p]
# 随路钟相对数据的到达关系(数值照 ADC 手册,单位 ns 量级)
set_input_delay -clock [get_clocks adc_dclk] -max 0.8 [get_ports {adc_data_p[*]}]
set_input_delay -clock [get_clocks adc_dclk] -min -0.8 [get_ports {adc_data_p[*]}]这段约束里值得解释直觉的是最后两行。随路时钟接口中,发送端让时钟和数据保持已知相位关系上路,set_input_delay 告诉工具「数据在时钟采样沿前后大约多少纳秒有效」,工具才能检查触发器(或 ISERDESE)的建立/保持裕量。min/max 两个值框出数据眼的左右边界,来源是 ADC 手册的时序表加板级走线偏斜,而不是拍脑袋填 0。约束语法全貌见 XDC 引脚与时序约束入门,基础写法见 XDC 约束基础。
五、板级规则:等长、阻抗、参考平面与 IBIS
约束写完只保证片内合法,信号质量由 PCB 决定。LVDS 板级规则数量不多但每条都硬:
| 规则 | 工程口径(数量级) | 不遵守的后果 |
|---|---|---|
| 差分阻抗 | 全线受控 100Ω ±10%,由叠层和线距决定,交板厂按阻抗控制制作 | 反射、振铃,眼图闭合 |
| 对内等长 | P/N 两根线长度差按速率换算控制在比特周期的约 5% 以内;数百 Mbps 量级常见厂商规则是数 mil(约 0.1–0.3mm 量级),具体照器件厂商设计指南 | P/N 偏斜把差分能量转成共模噪声、时序窗口收窄 |
| 对间等长 | 同一总线各数据对相对随路钟对的偏差换算成时间后,要落在采样窗口余量内(数十 ps 到数百 ps 量级,随速率收紧) | lane 间错位,训练/对齐失败 |
| 参考平面 | 差分对全程紧贴完整地平面,禁止两根线(或其中一根)跨平面分割缝、过孔换层缝 | 回流路径断裂,阻抗突变并对外辐射 |
| 过孔与扇出 | 减少过孔数量,一对线的两个过孔对称放置、同层换层 | 引入额外 P/N 不对称 |
| 远离干扰源 | 远离晶振、开关电源开关节点、接插件长边 | 差模干扰直接进数据 |
等长不是「两根线视觉平行」,而是长度数字达标:常用做法是在扇出区给较短的一根绕蛇形补偿。是否真的达标、眼图还有多少余量,靠仿真提前回答——用 FPGA 厂家提供的 IBIS 模型描述 IO 缓冲的 V/I 与 V/T 行为,叠加上 PCB 走线的传输线模型做板级仿真,可以在投板前看到拓扑各点的波形与眼图。IBIS 是什么、模型文件怎么读见 FPGA IBIS 模型入门。
六、与 SerDes 的分工:IBUFDS 只是门卫,串并化另有其人
容易混淆的一层关系:本篇讲的 IBUFDS/OBUFDS 是纯「电平格式转换」,不改变数据节拍。实际工程里三者常串在同一条链上:
- 低速并行差分(几 Mbps 到几十 Mbps):IBUFDS 之后直接进 fabric 触发器,随路钟经 BUFG 当普通时钟用;
- 源同步高速差分(约 100Mbps–1.2Gbps 单线):IBUFDS 之后进 IDELAY + ISERDESE2 做 1:4/1:8 串并转换,配 BITSLIP 训练字对齐,机制见 FPGA ISERDESE/OSERDES 串并转换;逐比特延迟微调见 IDELAY/ODELAY 延迟单元;
- 嵌入式时钟高速链路(数 Gbps 以上):根本不用 IBUFDS,进专用 MGT 引脚,CDR 从数据自身恢复时钟,见 FPGA 千兆收发器概念。
一个 ADC 随路钟加数据接口上电时的握手可以把这层分工看全:

读这张时序图注意职责边界:IBUFDS 对训练一无所知,它上电后持续输出单端电平;真正参与握手的是 ISERDESE 的串并化与训练状态机,而 ADC 送出的始终是「时钟加数据」的源同步格式——没有这路随路时钟,整条普通 IO 链路不成立,那是 MGT 用 CDR 的世界。时钟资源在片内的组织见 时钟区域与 BUFG/BUFIO/BUFR。
七、常见坑
| 坑 | 表现 | 处理 |
|---|---|---|
| bank VCCO 配错 | 实现期 DRC 报 LVDS_25 与 VCCO 不兼容,或上板电平幅度不对 | 选脚阶段就按 bank 供电规划,2.5V bank 才能放 LVDS_25;整 bank 共用一个 VCCO,不能脚内混搭 |
| HR/HP 终端规则混淆 | 该开片内终端的没开,满屏振铃;不能开的强开,DRC 报错 | 照 UG471/数据手册查该 bank 类型与 DIFF_TERM 支持表;原理图预留外部电阻位兜底 |
| 片内外终端都装 | 波形幅度约减半、噪声容限变差 | 二选一;贴了外部 100Ω 就把 DIFF_TERM 设 FALSE |
| N 脚重复写 XDC | 实现期引脚冲突报错 | 只约束 P 脚,N 脚由工具自动配对,不要出现第二条 PACKAGE_PIN |
| 仿真里 P/N 接反 | testbench 全部输出取反,训练永远不命中 | 对照原理图逐个核对 I 与 IB;接反不报错,只能靠仿真波形发现 |
| 对内不等长 | 低速一切正常,提频后偶发误码、眼图一个方向变瘦 | 投板前查长度报告,偏差按厂商规则卡数量级;已投板只能降速或加均衡类手段 |
| 差分对跨分割缝 | 近距离通过、EMI 测试超标、眼图抖动大 | 查每层平面,跨缝处缝合电容或改走线;换层处补地过孔给回流 |
| 随路钟当普通数据走布线 | 时钟延迟大且不稳,时序全面违例 | 时钟对经 IBUFDS 后进 BUFG/BUFIO,施加时钟约束而非端口延迟了事 |
这一篇在知识体系里的位置
本篇属于 FPGA 高速接口簇的电气落地层:通用电气原理向上接 LVDS 差分信号原理,bank 与电平约束向左接 IO bank 与 VCCO 和 LVCMOS 电平标准;速率往上走,逐比特延迟与串并化在 IDELAY/ODELAY 和 ISERDESE/OSERDES,越过随路时钟的边界则进入 MGT 千兆收发器;板级仿真的抓手是 IBIS 模型,XDC 写法细节在 XDC 引脚与时序约束。纯低速单端外设(GPIO、SPI 慢速档)用 LVCMOS 即可,不必为了「差分更高级」过度设计。
总结
FPGA LVDS 差分 IO 用法可以收成一句话:接收例化 IBUFDS、发送例化 OBUFDS,P 接 I、N 接 IB;HR bank 用 LVDS_25 并保证 VCCO 为 2.5V,HP bank 用 LVDS;接收端在片内 100Ω(DIFF_TERM)与板上外置跨阻之间二选一;XDC 只约束 P 脚、N 脚自动配对且 P/N 必须同 bank 相邻;PCB 守 100Ω 差分阻抗、对内等长到厂商指南的密尔量级、全程不跨平面分割,投板前用 IBIS 仿真验证眼图;而 IBUFDS 只做电平移门,串并化交给 ISERDESE、数 Gbps 无随路钟的链路交给 MGT——按「bank 电压、终端位置、引脚配对、板级等长」四张清单逐项核对,LVDS 接口从上电第一次就能稳定工作。