FMC子卡如何实现FPGA的富I/O扩展?从标准到实践

发布时间:2026/8/27 11:37:48
FMC子卡如何实现FPGA的富I/O扩展?从标准到实践 1. 一张FMC子卡为什么被叫作“富I/O”接口前阵子公司为高速采集设备定制前端模拟板方案会上争论半天最后有人提到直接用FMC子卡。主板上的FMCFPGA Mezzanine CardFPGA夹层卡连接器已经预留了足够丰富的I/O我们只需要按照VITA 57.1标准做一张子卡机械结构和接口协议都不用重新发明。这块板子后来很快就跑通了这也让我对“FMC Board Serves up Rich, Flexible I/O Set”这句话有了真切的体会——它不只是产品宣传语而是确实能解决问题的设计思路。FMC本质上是一个标准化子卡接口通过高密度的连接器与FPGA载板相连。载板可以是普通的PCIe采集卡、Zynq开发板也可以是专用的加固设备。子卡上可以放ADC、DAC、光纤接口、相机接口或者干脆就是一堆引脚做工业控制。对于做FPGA开发和板卡硬件设计的人来说FMC提供了一条低成本、低风险的I/O扩展路径不需要为每个外设重新画一整块大底板只需要设计一张符合标准的子卡就能与市面上几乎所有带FMC插槽的载板配合使用。这篇文章想把FMC的设计和应用讲透从标准本身的含义到信号类型的选择再到实际布局布线和调试中容易踩的坑。准备做FMC子卡的硬件工程师、正在选型FMC载板做项目的人或者只是想了解这个接口和普通总线有什么不同的人都可以参考一下。我尽量把关键细节和实际数据写清楚让大家在动手之前就对整个链路有底气。1.1 从一堆线缆到一个连接器FMC解决的核心痛点在没有FMC之前FPGA载板和功能子板之间的互联方式其实很混乱。有人用2.54mm排针有人用板对板连接器有人干脆用柔性排线。接口形式不统一就算了更麻烦的是信号定义、引脚分配、电源电压都各不相同。换一块载板原来的子卡基本作废设计要重来一版。这对于商用产品和科研快速验证都是很大的负担尤其当项目周期紧的时候这种“野路子”会让人非常痛苦。FMC的思路是把FPGA的I/O按照固定规则暴露出来用一颗经过定义的高密度连接器完成板间互联。ANSI/VITA 57.1标准规定了连接器的物理形式、引脚功能、电源引脚、信号电平以及EEPROM的读取方式。载板只要提供了FMC插槽子卡就可以通过标准的机械和电气接口接入FPGA端点上的引脚分配也相对透明。也就是说真正做到了“设计一次多块载板都能用”。FMC连接器内部集成了很多种I/O资源单端信号、差分信号、高速串行收发器、参考时钟、I2C管理总线、JTAG调试链还有一组可调电压的供电引脚。这样丰富的组合方案使得子卡可以同时承载低速控制和高速数据流而不用另接一堆转接线。实际项目里很多子卡甚至能在同一张卡上同时实现控制、采集和通信三种功能这种灵活性是普通总线架构很难做到的。1.2 FMC标准背后的VITA 57.1规格与兼容性VITA 57.1这套标准最早是针对FPGA载板设计的。它定义了单宽Single-width和双宽Double-width两种子卡尺寸以及LPCLow Pin Count低引脚数和HPCHigh Pin Count高引脚数两种连接器版本。LPC版本有160个引脚提供大约34对差分信号和4个高速收发器适合做中低速采集和简单的控制扩展。HPC版本有400个引脚差分信号对数更多高速收发器达到10个还增加了额外的参考时钟和单端引脚适合做高速ADC、大带宽DMA这类数据量很大的应用。下面这个表可以快速帮大家建立印象特性LPC低引脚HPC高引脚引脚总数160400差分信号对约34对约80对高速收发器4路10路参考时钟部分充足典型应用低速控制、中速采集高速AD/DA、光纤通信、JESD204B后续还有FMCVITA 57.4标准在机械尺寸上跟FMC差不多但电气信号等级更高可以跑到PCIe Gen3、100G以太网或者JESD204B的高速率档位。现在新出的FPGA载板很多都配了FMC接口项目选型时如果预计未来需要更大带宽可以直接选FMC省得后面再换板卡。需要注意虽然标准是统一的但不同厂商的载板在引脚分配上不一定完全“兼容”所有子卡。很多子卡会附带一个EEPROM存储子卡的ID、厂商信息、VADJ要求等。载板在启动时会读这个EEPROM并根据配置自动调整或者提示设置。如果子卡没有EEPROM或者载板不支持某个VADJ电压就需要手动在硬件或寄存器里配置了。这也是调试时最容易出问题的地方后面我专门讲。2. 富I/O背后的信号类型与电路选型FMC连接器上的引脚粗分可以分为三类GPIO类单端信号、差分信号对、高速收发器信号。严格来说差分信号里也分普通差分和高速差分但工程上更关心的是终端电平标准和最高速率。先看单端信号。FMC上的单端引脚大多数可以独立配置为输入或输出电平范围通常由VADJ引脚给出。VADJ可调电压一般在1.2V到3.3V之间具体看载板的FPGA bank电压。子卡上的数字器件如果用了3.3V而载板VADJ设成了1.8V就会导致电平不匹配信号无法正确识别。我见过不少工程现场问题都是这个原因排查半天结果就是电压配置不一致。差分信号是FMC最常用的I/O形式。常见的LVDS、LVPECL、LVCMOS差分都可以在VITA 57.1下跑速率可以做到几百Mbps到数Gbps不等。数据率比较高的时候建议画板前先仔细读FPGA的IBIS模型和载板手册确认各bank都能在目标频率下工作。高速收发器在HPC连接器上最多可以引出10个在LPC上是4个对信号完整性要求很高差分阻抗必须控制在100Ω附近走线长度要匹配且最好远离板上的大电流开关电源。2.1 单端、差分、MGT三路I/O的典型分配做一个具体的采集前端比如16bit的250MSPS ADC子卡典型I/O分配是模拟大带宽数据用差分LVDS输出到FPGA一部分单端GPIO用于切换增益和复位一两个MGT通道用于与FPGA之间的同步和快速配置另外还要有参考时钟和触发信号来自载板。这样一整组下来LPC连接器已经偏满用HPC会更从容不然通道和时钟都要精打细算。如果做光纤通信测试卡MGT通道就是主力PCIe或QSFP接口直接占用大量高速收发器。此时GPIO只用于状态指示和链路复位数据路径完全走高速串行。这两种应用对I/O需求的取舍很不一样选型时前期就要把带宽、时延和引脚计数算清楚。举个例子做QSFP光模块测试需要4路MGT加上一路MDIO/I2C管理接口LPC的4路MGT勉强够用但如果你还想同时跑一个PCIe x2链路作为控制面那LPC就真的不够了必须上HPC。工业I/O控制卡的逻辑又不太一样它往往需要很多单端或者差分输入输出用来接编码器、限位开关、门控信号。只要每路信号频率不过高用FMC的GPIO和普通差分对就够了。这种情况下把MGT通道当成备用甚至完全不使用也是常见的做法。丰富I/O的优点就在这里——你不需要勉强凑合只需要挑自己需要的部分用剩下完全当不存在驱动端也不会产生串扰。2.2 电源域与上电时序I/O稳定性的底层保障FMC标准里所有信号参考的电源都是载板通过连接器提供的。除了3.3V固定电压还有VADJ。VADJ的意义在于匹配FPGA的bank电压因为FPGA不同bank的电平标准可能不一样。比如FPGA的bank电压是1.8V那这个bank的I/O输出高电平最高也就是1.8V左右如果子卡上的器件以3.3V为逻辑高那信号大概率读不进来。子卡上的电平转换电路应该由VADJ供电保证信号电平与FPGA一致。实际设计时还要考虑上电时序如果VADJ还悬空子卡上的器件就提前上电很容易导致IO状态不确定、闩锁甚至损坏。所以载板的电源时序设计要求是先3.3V再VADJ或者至少保证VADJ在FPGA bank有输入输出需求前稳定下来。很多成熟载板会用一个小的电源管理芯片来控制这个时序但自己画板时很容易忽略。去耦电容一定要靠近连接器。FMC的引脚间距很小一不留神就会出现电源引脚边缘耦合和地弹噪声。我在调试一块ADC子卡时发现采样数据偶尔出现周期性噪声后来用近场探头发现就是电源引脚区域的旁路电容数量不够、位置太远导致的。在VADJ引脚旁边放够0.1uF和10uF电容分别兼顾高频去耦和储能能极大减少这类问题。如果子卡上有多个电源层那更要在每个过孔附近都安排一个0.1uF电容不要心疼面积。2.3 如何根据应用场景选择子卡如果项目是快速验证我建议先去市场上买现成FMC子卡。ADC、DAC、SFP、Camera Link等类型都有不少成熟产品。但买子卡前要仔细核对载板的FMC插槽是HPC还是LPC有的载板只有一个LPC插槽换子卡就要整个载板一起换这是很常见的选择失误。自己做子卡的时候要先把功能需求映射到I/O资源上。把需要的差分对数量、MGT通道数量、单端IO数量、参考时钟数量都列出来然后对照HPC或LPC的引脚表检查一遍再开始画原理图。这一步千万别偷懒等板子布局完成后发现引脚不够用改动成本会高得多。还有一点容易被忽略FMC子卡上不一定只能放一种功能芯片。你可以设计一块“多合一”子卡把低速采集、LED指示、编码器接口都放上去通过FPGA侧的引脚分配灵活使用。FMC的灵活性允许你根据项目阶段调整用法而不需要重新投板。我在一个视觉检测项目里就是一张子卡同时带了相机触发和光源控制省了很多线缆调试也方便。3. 实操记录从选型到布局的踩坑与恢复接下来进入实际设计环节。我用两块不同项目的FMC卡作为例子说明一块是LPC的中速IO扩展卡另一块是HPC的高速数据采集卡两者在很多设计原则上是通用的。3.1 第一步HPC还是LPC首先要看FPGA的可用引脚和扩展需求。若是做少量GPIO扩展LPC完全够用若要跑JESD204B并且多通道一定要HPC。其实还有定位问题LPC连接器体积小载板上容易布局HPC的400pin连接器布局空间大走线密度高对PCB工艺和叠层要求都更高意味着板子成本会上升。HPC连接器的引脚里高速收发器引脚集中在连接器一侧这样有利于贴近连接器放置FPGA和高速过孔。设计时最好把FPGA的高速串行引脚直接连到连接器对应的引脚不要多次换层。如果换层了至少要在换层过孔附近加回流地孔。我见过一块PCIe采集卡MGT走线来回换了三次层结果PCIe速率上到Gen2就开始报错后来重新布线加回流孔才通过。LPC的4个高速收发器一般也够小项目用但如果你默认使用LPC载板同时未来想升级成HPC子卡就得换载板了。所以从长期规划角度讲预算允许的情况下优先选HPC能给后续功能升级留出空间。3.2 布局布线的硬指标等长、阻抗、回流路径关于等长差分对的等长控制在正负5mil内相同信号的组内等长控制在正负10mil内对于500Mbps以内的信号足够。超过1Gbps后要结合仿真和实际眼图测试来调整。阻抗方面单端50Ω差分100Ω都推荐在叠层定义时期就确定不然布线完了发现某些层不能达到目标阻抗返工极痛苦。实际操作里有个小技巧先布完差分对再回头布单端控制线。因为差分对一旦等长调整完就不希望后面再去动它。如果你先布单端信号等差分对布完发现需要重新绕线很可能把单端信号挤得歪七扭八。这是我总结出来的顺序经验能减少不少返工。回流路径的问题是高速信号设计里的“隐形杀手”。FMC连接器下方的所有地平面必须连续千万不能在连接器正下方走高速线也不要用贯穿式凹槽割裂参考地。我调试时遇到过误码率偏高的问题最后定位到原因是FPGA到连接器之间有一小段走线跨过了两个电源平面的分割区改完铺铜和后过孔误码率立刻下来。大家画图时可以设置一条规则约束连接器下方3mm内不要走线尤其是高速线。3.3 双宽子卡尺寸与机械设计VITA 57.1对子卡尺寸的规定其实是很多人容易忽视的部分。单宽子卡的PCB区域大约为69mm x 74mm双宽子卡则大约为139mm x 74mm可以理解为两个单宽并排。大尺寸带来的好处是能放更多元器件散热面积大一些。但也意味着PCB面积成本更高板卡在机箱内占用的槽位更宽。如果是标准3U或6U机箱里的插卡式系统双宽FMC的尺寸要和面板开口、导轨位置严格匹配。设计时建议先找载板的机械图再用三维软件做一下避让检查。有些FMC子卡上装了比较大的散热器或变压器导致相邻板卡装不下这是项目中很恼人的问题。我就曾经因为一块子卡上的电感太高装进机箱后顶着隔壁卡的面板最后只能换封装。连接器位置也有讲究。单宽子卡上使用一个HPC或LPC连接器双宽子卡一般使用两个连接器。两个连接器之间的间距要严格按照标准规定来否则插到载板上的两个插槽时会出现接触不良风险。硬件工程师最不愿意遇到的就是“看着能插插紧后发现一边歪了”所以PCB画完后建议把连接器的封装放到机械层里做一次3D视图检查。3.4 一个VADJ供电设置导致子卡无输出的案例有一次做一块ADC子卡原理图和PCB都没大问题上电后通过JTAG能看到FPGA也读到了EEPROM但ADC数据一直是全零。查了半天发现载板默认VADJ输出是1.8V而ADC卡上的接口芯片工作在3.3V电平完全不匹配。因为载板支持通过EEPROM配置VADJ我们却忘了在EEPROM里写入正确的电压参数。解决方案是把子卡EEPROM配置修改成载板支持且子卡需要的3.3V重新上电后问题消失。这里给一个提醒很多FMC载板会自动读取VADJ但并不是所有子卡EEPROM都写对了。买回来的子卡第一件事就是看它EEPROM内容和载板识别结果别急着插上去就调试。如果自制子卡EEPROM最好一开始就规划好写清楚ID、VADJ和接口类型这会省下大量时间。4. 调试中的典型问题与排查思路FMC卡调试过程中的问题很多时候不是单一原因而是从硬件到软件要一层层排除。4.1 上电后不识别子卡先查JTAG链和EEPROM载板通过FPGA JTAG链去访问FMC子卡上的EEPROM和器件如果上电后FPGA报错或找不到子卡首先检查JTAG链是否完整FMC连接器的TDI、TDO、TCK、TMS引脚是否都连上了FPGA侧有没有做链式菊花链。其次利用调试器读取子卡EEPROM地址确认I2C或SPI通信是否正常。常见的坑是EEPROM地址冲突。FMC标准里EEPROM地址有规范但如果子卡上还有个其他I2C设备用了相同地址总线就会冲突。排查时用I2C扫描工具扫描整个总线能快速看出异常地址。我遇到过一块板子上的温度传感器和EEPROM地址都是0x50结果总线上数据互相干扰读卡信息时有时无。现象优先排查点检查方法FPGA不识别子卡JTAG链连接万用表量TDI/TDO通路EEPROM读取失败I2C地址冲突扫描整条I2C总线VADJ电压异常配置寄存器读载板电压监控寄存器FPGA配置正常但引脚无输出IO方向寄存器在线逻辑分析仪抓引脚状态4.2 高速信号误码率高端接、等长和参考层高速信号的误码问题我总结出三条主线第一是端接FMC子卡上高速接收端必须按照器件手册做好端接或偏置如果悬空不处理差分接收器会误判。第二是等长超过一定速率后哪怕是几十mil的差值都可能造成时序偏移。第三是参考层连续性上面已经讲过这里再强调一遍。用示波器做差分眼图测试时要使用至少带宽为信号速率5倍的探头测点尽量靠近接收芯片封装。很多误码问题在连接器处是看不到的必须测在接收芯片端。比如测1Gbps LVDS信号探头带宽至少5GHz否则眼图的张合度和抖动都会被淹没在探头带宽里。对于抖动特别大的信号还可以查看电源纹波是否过大。有时高速收发器误码是因为某个bank供电质量不好通过增加去耦电容或独立LDO能明显改善。这里有个经验在MGT的参考时钟引脚旁放一个0.1uF电容对降低时钟抖动很有效。参考时钟是高速链路的“心跳”一点杂质都会放大到数据上去。4.3 软件报错与硬件问题的区分Keil、FPGA、电平逻辑当FMC子卡上带MCU时容易遇到的尴尬是FPGA调试正常但MCU固件在Keil等IDE中报错。先别急着怀疑硬件看下编译器配置的芯片型号、宏定义和调试器连接是否匹配。比如target中的device选错就会出现大量I/O外设寄存器报错跟硬件一点关系都没有。同样如果MCU读取子卡的某个状态寄存器失败不一定是FMC链路坏很可能是电平转换芯片的使能引脚没拉高。用万用表量一下对应引脚电平能快速区分是配置问题还是物理连接问题。调试时把FPGA侧的逻辑分析仪拆线接好往往能一次性捕捉到问题帧。这类问题的排查思路其实可以通用——就像看到数据库复制线程因为源端和副本配置不一致而停摆时先别重启而是对比两边配置差异对应到硬件里就是先对比原理图上的引脚分配和实际软件里的引脚定义。还有个常用的经验先跑一个回环测试。把FMC子卡的数据输出引脚直接短路到相邻输入引脚在排线上或测试点上发送一串已知数据看接收端能否还原。回环通过代表物理链路基本正常回环失败再逐段排查。这个办法尤其适合区分“FMC链路问题”和“FPGA逻辑问题”几分钟就能得到结论。4.4 工业I/O场景中的传感器故障模拟有块FMC工业I/O子卡需要验证PLC逻辑对传感器断线、短路的处理能力。很多工业IO板卡支持通过寄存器写入故障标志从而强制将某一路传感器通道设为故障状态。这就是“factory I/O 可手动设置传感器故障”这类需求的硬件实现路径。用FMC子卡来做这事的优势是你可以在不影响载板主功能的前提下通过GPIO或者串行配置去随时切换故障注入模式。我在一块八通道DI子卡上就是通过FMC的单端引脚控制模拟开关把故障电阻切入相应通道再通过FPGA侧采集异常状态来验证上位机的报警逻辑。这类测试里要注意模拟开关的导通电阻对信号电平的影响。不要为省成本选电阻过大的模拟开关否则故障注入后通道本底噪声抬高系统可能误报。故障模拟的具体步骤可以这样先在FPGA侧把某个GPIO配置为输出控制一个MOS管或模拟开关然后把故障电阻串联到传感器信号通路中触发后观察输入通道的电平变化。如果有条件可以用逻辑分析仪同时抓取故障注入信号和输入通道状态时间对齐后能非常直观地看到延迟时间。5. 几块板子做下来一些实操体会陆陆续续用FMC做完了三四个项目后我的体会是FMC这条路适合绝大多数以FPGA为大脑的硬件系统。做产品前期可以先买现成子卡跑通原型再逐步设计自己的子卡整个开发周期能缩短不少。有个细节想再提一下FMC连接器引脚非常密手工焊接比较吃力强烈建议用回流焊或专业的精密焊接台。如果只是小批量调试焊接后一定要用放大镜或显微镜检查焊点尤其是电源和地这类大面积焊盘。我在一块子卡调试时曾遇到3.3V对地短路最后发现就是焊接时的一个锡珠把相邻的两个电源引脚短路了花了一晚上排查最后用放大镜找到的。另外FMC的EEPROM信息虽然是标准推荐的但很多自制的子卡没有写EEPROM会导致载板无法自动识别。这种情况下载板需要提前通过寄存器配置好VADJ和IO方向不然子卡插上后可能完全无反应。所以自制子卡时最好把EEPROM焊上并写入正确的ID这个工作量不大却能在调试阶段节省大量时间。最后分享一个实用技巧做完FMC子卡后先在载板上跑FPGA内部的在线逻辑分析仪ILA把FPGA到连接器之间的所有未连接信号设为observation采集上电后的默认电平。如果发现某些引脚悬空或者状态异常能大大缩小搜索范围。这也是我在一次子卡调试中无意发现的排查方法后来一直用到现在尤其是面对那些“看起来都正常但就是不工作”的隐形问题时这个办法比拿万用表挨个点引脚要高效得多。FMC的优势就在于它标准化程度高只要前期规划和设计思路正确后面调试的时间其实能压缩得很短。