做 FPGA 平台时间久了,会有一种感觉:真正卡住进度的往往不是 FPGA 本身,而是外围 I/O。传感器的电平不匹配、视频接口类型换了、客户临时要加几路同步触发,这些需求的共性是全都发生在板级物理接口这一层。FMC 这种 mezzanine 结构(FPGA Mezzanine Card)能把“I/O 形态”的选择从底板设计中抽离出来,这也是它能在工业、通信、测试测量领域存活十几年的原因。最近我评估的一块 FMC 扩展板,就把高速串行收发器、宽温并行差分信号、外部时钟和触发接口全部装在一块 VITA 57 子卡上:SFP+ 笼子负责高速链路,双排针引出 LVDS 和单端 GPIO,SMA 口专门走参考时钟与同步信号。所谓“丰沛而灵活的 I/O 集”,在硬件上的具体含义就是这些。下面的内容把这类板子的资源构成、双宽子卡的尺寸约束、载板协同设计和实测中踩过的坑一次性讲透,给正在选型或者准备自己画 FMC 的同行做个参考。
1. FMC 标准到底规范了什么?脚位结构先决定 I/O 上限
1.1 VITA 57 解决的核心问题
FMC 能成为 FPGA 生态里的事实标准,核心原因不是“多了一个连接器”,而是它把底板和接口子卡之间的物理机械尺寸、电气定义、电源体系、管理通道全部统一了。底板厂商只需要按标准把 FMC 座子布上去,用户根据自己的业务场景插不同的子卡,底板不需要因为接口形态变化而重新投板。这个思路和处理器总线标准化很像:处理器不变,总线协议变了就换接口卡。
VITA 57.1 定义了最初的 FMC 标准,后来为了适应芯片功耗和 SerDes 速率提升,又出了 FMC+(VITA 57.4)。FMC+ 在连接器机械结构不变的前提下,对差分信号完整性、地弹、屏蔽等要求更高,主要面向 10Gbps 以上的高速链路。选子卡之前先搞清楚你用的载板支持的是 VITA 57.1 还是 57.4,因为高速收发器差分对的要求完全不同。
1.2 LPC 与 HPC:同一张载板,两种 I/O 天花板
FMC 连接器按引脚数分成两种,这是选型时必须面对的第一个分叉口。
| 对比项 | LPC(Low Pin Count,160 脚) | HPC(High Pin Count,400 脚) |
|---|---|---|
| 适用场景 | 低速并行总线、少量 GPIO、简单时钟 | 高速串行链路、宽并行差分接口、ADC/DAC 采集 |
| 用户可用的差分信号组 | 通常只有 LA 一组,几十对以内 | LA + HA + HB,差分资源翻倍以上 |
| 高速收发器支持 | 看载板,一般只支持少量或者不引 | 最多能到 10 对左右的 Tx/Rx 通道 |
| 载板复杂度和成本 | 低 | 高 |
注意,LPC 和 HPC 的上限是标准定义的“能力上限”,不是每块载板都真的把那些引脚全部拉到了 FPGA。有些商用板子标着 HPC,实际为了布线方便只接了其中一部分。所以拿到载板原理图或者 pin map 之后,第一件事是核对哪些 LA/HA/HB 信号真的连到了 FPGA 的哪些 bank,哪些 MGT 通道被占用了,千万不要只看连接器外形。
1.3 按项目需求倒推脚位选择
选 LPC 还是 HPC,不是越贵越好,而是看信号类型和路数。我的习惯是先列一张接口清单,把项目里所有物理链路映射成三类资源:高速串行(SFP+、QSFP、PCIe、SRIO、JESD204B)、并行/差分采集(LVDS ADC、DAC、Camera Link)、低速控制(UART、SPI、I2C、CAN、低速 GPIO)。然后分别统计差分对数量和 MGT 通道数量,再决定 LPC 还是 HPC。
如果一个项目里既有 4 路 10G 光口,又有一组 16bit@250MSPS 的 ADC 并行 LVDS 接口,那基本直接锁定 HPC。如果只是想做几个 SPI 隔离输入、一组按键和 LED,LPC 反而更省事,载板成本低,布线压力也小。
2. 这块 FMC 板的 I/O 资源清单:高速、并行、时钟各司其职
2.1 高速串行通道:物理层只负责透明传输
这块板子我评估的版本是双宽 HPC 子卡,正面放了 4 个 SFP+ 笼子。SFP+ 信号通过 FMC 连接器上的 MGT 差分对直接回到载板 FPGA 的高速收发器,中间不走协议芯片,完全是透传路径。这样做的好处是 FPGA 内部想跑什么协议都行:10GbE、自协商 SerDes、CPRI/eCPRI,甚至自定义的裸流传输,只要逻辑和线速率支持就没有问题。
高速收发器路径上要做对几件事:
- AC 耦合电容必须放在靠近发送端一侧,具体位置按收发器手册要求,一般推荐放在差分走线离开 FPGA 引脚后的 100 到 300 mil 范围内。
- 差分对的等长控制不是越短越好,而是要保证收发两端内部的 P/N 相位延迟足够接近,通常 P/N 长度差控制在 5 mil 以内。
- SFP+ 笼子的外壳地要单独处理,用多个过孔连接到母板地平面,不要和信号地混成一小块孤岛。
载板上如果有多组 SFP+ 同时跑 10G,参考时钟的抖动指标就非常关键。这块子卡用了片内可编程时钟芯片生成 MGT 参考时钟,避免载板上的普通时钟源带来的附加抖动。
2.2 并行差分与单端 GPIO:要能同时伺候 AD/DA 和工业逻辑
并行接口部分最容易被低估。很多项目需要的不是一条高速串行线,而是几十路 LVDS、单端 TTL 电平的握手信号、数据总线。这块板子在末端留了两个 2.54mm 40pin 双排针,每个排针分成电源、地、差分信号区三块。接 AD/DA 子板时用 LVDS 差分对,接工业 IO 模块时把 bank 电压切到 3.3V 用单端模式。
这里比较关键的是 bank 电压(VCCO)的切换。FMC 标准里 VADJ 是载板提供的,但子卡上的 FPGA bank 电压往往由子卡自己产生或者通过跳线选择。这块板子的做法是每个 GPIO 排针区域单独一个 LDO,通过跳线帽在 1.8V、2.5V、3.3V 之间切换,同时还有一个电平转换芯片兜底。实际使用时必须注意:如果排针外部设备是 5V 逻辑,不能直接怼到 3.3V 排针上,需要加转换或者选配隔离挡板,否则 GPIO 芯片的 ESD 结构会先被击穿。
并行接口的阻抗匹配也很影响信号质量。板子上每个差分对附近预留了 100Ω 终端电阻焊盘,可以通过 0Ω 电阻选择是否启用。短距离排线连接时终端电阻一般建议启用,避免振铃;如果走线很长,反而要在 FPGA 内部配置 ODT 和输入终端,而不是只依赖板端电阻。
2.3 时钟与同步口:外部参考和触发信号单独走 SMA
多板同步是 FMC 板最容易“看起来简单、实际坑很多”的场景。这块板子保留了 4 个 SMA 口,两个定义为时钟输入/输出,两个定义为通用触发/标志信号。时钟 SMA 进来之后先过射频变压器转差分,再经过时钟芯片做扇出和占空比修正,最后送到 FPGA 的全局时钟引脚和 MGT 参考时钟输入。
外部时钟和板载时钟的切换不是简单用拨码开关就能完事的,需要留意切换瞬间可能出现毛刺。常见做法是用时钟芯片的输入选择 MUX,先把目标时钟锁存稳定,再通过 FPGA IO 控制切换使能。这个板子上把切换逻辑接到了一个本地 MCU,上位机可以通过 I2C 下发指令,我实测过程中切换后的第一个时钟周期毛刺基本被抑掉了,但前提是两边时钟频率必须一致,否则必须做异步切换。
时钟通路还要考虑参考地的问题。SMA 外壳地和 FMC 连接器的地之间不能是“似连非连”的状态,否则高速时钟的共模噪声会直接进到 FPGA,引入额外确定性抖动。多板级联时,建议在两个 SMA 之间用同轴电缆连接,并确保所有板子共地,不然会产生地环路电流。
3. “双宽”与“单宽”不是随意选的:尺寸、孔位、散热一起锁死方案
搜“FMC 双宽子卡尺寸”的人,多半是已经被尺寸坑过一次了。VITA 57 标准里双宽子卡的宽度是单宽的约两倍,但很多工程师第一版画的是“按单宽逻辑布线,按双宽角度抄板”,结果开孔、螺柱、连接器位置全对不上。
3.1 标准尺寸与载板兼容性
VITA 57.1 常见的两种尺寸:
- 单宽:69.0mm x 76.5mm
- 双宽:139.0mm x 76.5mm
两个方向别看反了。76.5mm 是沿连接器插入方向(纵深),69mm 和 139mm 是垂直于连接器的宽度方向。很多结构工程师第一次看图纸时,会以为双宽是纵深翻倍,但实际上双宽多出来的是板卡宽度,纵深基本不变。这个差异决定了机箱里子卡沿着导槽推入的空间是否够用。
双宽子卡的连接器位置也有讲究。标准允许双宽板正面、背面各放一个连接器,实际产品里常见的是一张双宽板只放一个 HPC 连接器,空出来的另一侧做接口面板和供电电路。选型时一定要对照载板 FMC 座子的实际位置和周围限高,尤其注意连接器旁边有没有大电容、散热器遮挡。
3.2 孔位、锁紧和装配顺序
FMC 子卡和载板之间通常用 M2.5 铜柱固定,孔位坐标在 VITA 57 里有明确规定。市面上一些便宜的“兼容 FMC”子卡孔位和标准并不完全一致,拧上去能固定,但连接器处受力不均,长期振动后可能出现接触不良。
另一个容易忽略的是装配顺序:先把 FMC 连接器对准载板插座,轻轻压合到位,再拧四角的固定柱。反过来操作容易造成连接器针脚斜插,内部弯曲。拧固定柱时建议对角交替拧,不要一颗拧到底再拧下一颗。上电之前,用万用表量一下子卡连接器两侧的地和电源是否短路,这是成本最低的保障手段。
3.3 散热约束往往决定最终能跑多少资源
双宽子卡面积大,能放的接口模块自然多,但散热问题也一起放大。SFP+ 光模块在跑到 10G 时发热非常明显,如果光模块紧贴着 ADC 或者时钟芯片,共享一个狭小空间,温度会互相传导。这块板子的布局把四个 SFP+ 集中在面板一侧,靠近结构通风口;ADC/电源放在另一侧,中间用铺铜和地孔做隔热缓冲。
功耗预算先粗算再细算。规则是一块自然对流散热的 FMC 子卡,整板功耗尽量控制在 10W 以内;如果超过 15W,建议必须加主动散热或者导风罩。双宽板虽然面积大,但并不等于能无限制堆功耗,因为载板上的 FMC 供电能力通常也有上限,这部分要回头去看载板的电源设计。
4. I/O 多了之后,供电与上电时序才是真正的隐形瓶颈
4.1 FMC 标准里的电源轨
FMC 连接器不是只传信号的,它也承载了标准定义的几个电源轨。
| 电源轨 | 典型电压 | 用途 | 容易忽略的点 |
|---|---|---|---|
| VCC3P3 | 3.3V | 子卡逻辑、EEPROM、控制电路 | 电流有限,别拿它直接带动多个 SFP+ |
| VCC12 | 12V | 子卡 DC/DC 输入 | 负载瞬态波动大,电源去耦要足 |
| VADJ | 1.2V~2.5V | FPGA bank 电压参考 | 电压匹配是硬要求 |
| 地 | 0V | 信号回流 | 连接器地脚数量决定回流质量 |
VADJ 这轨最容易出事,因为很多载板允许通过跳线或软件配置输出不同电压。子卡上的 FPGA bank 如果和 VADJ 不匹配,上电瞬间就可能出现过压,轻则 bank 损坏,重则把载板 FPGA 也带走。使用前必须确认系统里 VADJ 的实际电压,并和子卡的 bank 电压一致。
4.2 上电时序和热插拔
FMC 标准本身并不强制支持热插拔,大部分工业系统都是冷插拔。但工程上为了调试方便,很多人会带电插拔子卡,这是非常危险的操作。连接器针脚密,电源和信号在插拔瞬间顺序不确定,极易出现回压电流或者闩锁效应。
如果确实需要频繁调试,建议从硬件层面做两步:载板上的 FMC 电源用负载开关或限流器,子卡上的保护二极管和保险丝必须靠近连接器放置。同时,子卡上的状态指示 LED 要能单独指示电源是否正常,至少让你在插拔前知道系统状态。
4.3 电流估算:用数字说服自己
高速链路的电流不能拍脑袋。举例:4 路 SFP+ 光模块在 10G 模式下,每个光模块约消耗 0.5A 到 0.8A(3.3V),合计接近 3A;4 个 MGT 收发器在 FPGA 内部每通道约消耗几十毫安到上百毫安(电压 1.8V 左右);再加上 GPIO 负载、时钟芯片和 DC/DC 损耗,这还没算 ADC 子板,整板瞬时功耗很容易超过 10W。电源设计必须按最大负载预留至少 30% 余量,而不是按典型功耗算。
5. 和载板对接时最容易忽略的引脚映射与时钟协同
5.1 引脚约束要从 FMC 定义出发,而不是从 FPGA 任意选脚
FPGA 引脚是否能接到 FMC 连接器,在载板设计阶段就已经固定了。我们自己写约束时,必须沿着“FMC 连接器信号名 → 载板原理图网络 → FPGA bank/引脚”这条链路走。以 Xilinx 环境为例,一段典型的 FMC LA 差分对约束大概长这样:
set_property PACKAGE_PIN AV9 [get_ports fmc_la00_p] set_property PACKAGE_PIN AW9 [get_ports fmc_la00_n] set_property IOSTANDARD LVDS [get_ports fmc_la00_p] set_property IOSTANDARD LVDS [get_ports fmc_la00_n] set_property DIFF_TERM TRUE [get_ports fmc_la00_p]注意我这里的 AV9/AW9 只是示例,真实引脚必须以载板厂商给的 FMC pin map 为准。很多人直接拿别人工程里的 FMC 约束片段套到自己板子上,结果跑了三天发现引脚根本不在指定 bank,或者 bank 电压不匹配,白白浪费时间。
5.2 载板上 FMC 座子的版本差异
不同厂商的 FMC 座子外观几乎一样,但焊盘和结构锁扣有差异。有些座子支持加高连接器,方便子卡背面放更高器件,但加高之后信号路径变长,高速链路余量会下降。10G 以上的链路一般不建议用加高连接器,6G 以下可以看散热需求折衷。
载板端还要留意 FMC 座子周围的地孔数量和分布。FMC 连接器中间有大量地脚,如果载板设计阶段没有给这些地脚打足够多的过孔到底层地平面,高速信号的回流路径会绕远,产生额外的串扰和辐射。
5.3 时钟芯片的配置与锁定
这块子卡上的时钟芯片初始配置是通过 EEPROM 启动时读入还是通过 I2C 在线配置,会影响上电后的工作顺序。如果 FPGA 逻辑也需要时钟芯片提供启动时钟,那就会出现“鸡生蛋”问题:时钟芯片没有配置好,FPGA 无法启动;FPGA 没启动,芯片拿不到 I2C 配置。稳妥做法是让时钟芯片工作在硬件引脚设定的默认频率上,确保系统上电后第一时间有基本时钟可用,然后应用程序再通过 I2C 微调频率和相位。
多板同步时,优先使用外部 SMA 时钟作为主参考,并设置好时钟芯片的同步输入。所有子板的时钟芯片都要支持同步锁定信号,锁定时把 LOCKED 状态接到 FPGA 输入,逻辑侧只有看到全部 LOCKED 才能开始采集或输出,否则第一包数据一定是错位的。
5.4 用脚本生成 FMC 约束,减少人工出错
FMC 引脚数量多,手工敲约束除了慢还容易漏。我后来习惯把载板的 FMC 引脚定义整理成一个 CSV 或者 JSON 文件,然后用脚本生成完整的 XDC 约束。收益是换载板时只改引脚映射表,约束文件自动更新,不会出现手写 typo 导致“以为接上了,其实没接”的情况。
6. 实测中的几个高发问题和处理办法
6.1 HPC 连接器不一定是全高配
遇到过一块商用载板,外框印着 FMC HPC,但打开原理图一看,HA/HB 两组信号只连了一部分,另外一部分引脚被复用到了板载调试口。如果只按 HPC 规格选子卡,插上去某些通道必然静默。这种问题在原理图阶段就能避免:把载板 pin map 和子卡 pin map 做一次表格比对,所有实际使用的信号逐一勾选。
6.2 VADJ 电压不一致:板子能上电,但 FPGA bank 受损坏
曾有一次插上调好的子卡后,IO 电平怎么都不对,测量发现载板 VADJ 是 1.8V,子卡上一路 2.5V bank 跑到 2.5V,接口电平不一致。调试时万用表一量,实际载板 VADJ 和一个闲置跳线有关,出厂默认不是标准 2.5V。之后我再也不信“按默认配置即可”这种话,每次换载板都先测量 VADJ 和 12V 是否稳定,再插子卡。
6.3 高速信号眼图不过:先从连接器和终端查起
用 FPGA 自带 IBERT 或 GT 眼图扫描功能性验证高速链路时,发现 10G 通道眼高偏低。排查过程是先确认 AC 耦合电容在位、容值正确;再检查差分走线有没有跨分割;最后发现板子上一对 MGT 走线末端多加了一颗 50Ω 对地电阻,等于把终端阻抗拉低,导致反射严重。这种问题用规范化的原理图审查很容易发现,最怕的是靠“别人给的模板”顺手复制,把多余的电阻也抄进来了。
6.4 插拔时 FMC 连接器针脚弯曲
连接器针脚弯曲的问题比想象中高发,尤其是双宽子卡比较重的时候。双宽板比单宽板长一倍,插拔时如果只用手压一边,另一侧会先翘起来,连接器针脚受力不均就会弯。正确做法是双手握住子卡两侧,水平均匀下压,听到连接器锁扣到位的声音后再松手。一旦发现针脚弯曲,不要再硬插,用放大镜确认弯曲程度,轻度的可以用尖嘴钳小心扶正,严重的只能换连接器。
6.5 子卡温度过高导致传输不稳定
高速链路连续跑了几小时,偶尔出现链路 down 掉再恢复的情况,排查发现子卡 SFP+ 区域温度已经接近 85 度。光模块本身的温度阈值并不高,长期高温会劣化光功率。后来的处理是调整结构风道,在 SFP+ 笼子位置增加一个小型风扇。这也提醒我,FMC 功能验证不能只看室温下的短时结果,高温老化测试一定要做,尤其多通道同时满载时。
6.6 模块管理 EEPROM 不带会有什么后果
VITA 57 标准里定义了子卡上的管理 EEPROM,里面可以存放模块名称、版本、供电需求等信息。很多自制子卡不焊这个 EEPROM,实验室环境没问题,但一旦进入系统集成,载板无法自动识别子卡型号,也就无法动态调整 VADJ 和时钟配置,只能靠人工设置。我在实际工程中会把 EEPROM 直接列为必焊项,哪怕只有最基本的管理字段,也能省下大量调试时间。
最后分享一个我后来固定的习惯:每次拿到新 FMC 子卡,先不急着上系统,而是