ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ARM与FPGA通信原理图设计:从接口选型到电平匹配的完整指南

ARM与FPGA通信原理图设计:从接口选型到电平匹配的完整指南 很多做嵌入式或FPGA开发的工程师第一次画ARM和FPGA之间的连接原理图时都容易犯一个毛病——把两边芯片的引脚直接拉根线就连上了。当时看着网表没报错觉得硬件就完事了结果板子一回来通信要么时好时坏要么完全不通然后拿着示波器一顿抓才发现问题全出在原理图阶段埋下的雷上。ARM和FPGA通信这件事本质上就是电平标准匹配、接口时序对齐、电源供电路径这几个核心问题原理图阶段如果没把这些想清楚后面调起来非常痛苦。这篇博文就聚焦在“硬件原理图”这个层面从接口选型、电平转换、隔离设计、电源与去耦、时钟与复位、再到布局布线和问题排查把ARM和FPGA通信的硬件设计完整过一遍。内容面向的是做嵌入式硬件、FPGA逻辑开发以及系统集成的工程师尤其适合那些第一次在项目里把ARM主控和FPGA放在同一块板上、需要设计它们之间通信链路的同学。如果你正准备画这样一张原理图这篇文章可以当个checklist来用。1. 接口选型不是越快越好而是合适才好1.1 从通信的本质说起电平与时序的匹配问题ARM和FPGA之间的通信往深了说就是两个数字芯片之间的接口匹配问题。数字通信的底层无非是三件事电平标准一致、时序关系正确、信号完整性可接受。原理图阶段就要把这三件事的分工想清楚。电平标准一致指的是ARM侧引脚的IO电平与FPGA侧对应BANK的IO电平必须兼容。3.3V的ARM接1.8V的FPGA BANK如果不做处理轻则信号不稳定重则直接把FPGA的IO烧掉。时序关系正确是指在选定的接口协议下时钟、数据、使能信号的建立时间和保持时间能满足双方的芯片手册要求。信号完整性则是走线阻抗、串阻端接、回流路径这些板级因素综合作用的结果。很多工程师只关注“能不能通”忽略了“为什么选这个接口”。在原理图设计前先想清楚系统的数据量、实时性、开发成本再决定用哪种接口这才是硬件设计的正确打开方式。1.2 常用接口速查SPI、UART、I2C、并行总线、以太网不同接口适合不同场景原理图设计的第一步就是把接口选对。下面这个表是我在实际项目里做选型时习惯用的对照表直接按数据量和实时性需求来筛。接口类型典型速率引脚占用时钟线原理图复杂度典型应用场景UART最高几Mbps2TX/RX地无异步很低调试、低速控制指令I2C标准100k/400k快速1M2SDA/SCL地时钟内嵌同步低需上拉电阻寄存器配置、低速传感器数据SPI几十MbpsFPGA可到百M级3~4地有SCLK中高速数据流、ADC/DAC、显示、通信模块并行总线100Mbps以上取决于位宽和时钟16~32根数据地址控制有总线时钟高布线压力大视频帧数据、高速采集、SRAM/存储类交互以太网MAC-PHY10/100/1000Mbps差分对多组有参考时钟高跨板通信、网络化系统如果把ARM和FPGA放在同一块板子上我的第一优先级选择通常是FSMC或并行总线接口。比如STM32的FSMC接口挂FPGAARM侧像访问SRAM一样直接读写地址FPGA侧只要做一个简单的总线从机时序双方配合起来非常顺手。缺点是引脚占得多、布线麻烦但换来的是极低的CPU开销和可预测的延迟。如果引脚紧张或者数据量不大SPI是折中方案。ARM做主FPGA做从用中断或轮询方式交互。SPI原理图虽然简单但要注意片选信号的时序配合FPGA侧解析命令时要有完善的FIFO或寄存器映射机制否则容易丢数据。我在很多项目里也见过用UART做ARM和FPGA之间低速通信的做法比如FPGA只是做点IO扩展、温控风扇调速这种控制类工作。UART的好处是调式方便逻辑分析仪一挂就全看明白了坏处是速率上不去双向同时传数据还要做流控稍微复杂一点的状态机可能就撑不住了。1.3 异构单芯片方案Zynq的EMIO与AXI接口这里得单独提一种特殊情况——如果ARM和FPGA不是两颗独立芯片而是集成在同一颗SoC里比如Xilinx Zynq系列或Intel Cyclone V SoC系列原理图设计思路就完全变了。Zynq内部的ARM Cortex-A9和FPGA之间走的是AXI总线芯片内部的高速互连硬件工程师不需要在外部引脚上画一根通信线。但Zynq有一个容易忽略的“硬件接口”FPGA侧的PL可编程逻辑可以通过EMIO口接到ARM PS侧的MIO引脚复用器。什么意思呢就是说ARM的UART、SPI、I2C甚至GPIO可以不走PS侧固定的物理引脚而是从FPGA里通过EMIO引出来。这在原理图阶段的影响是原本需要ARM芯片引脚和FPGA引脚连接的地方变成了FPGA里一个引脚连到SoC内部板级布线只要处理FPGA对外的那部分。这时候原理图设计的重点就转移到BANK电压分配上了。Zynq的PS侧和PL侧的供电是分开的PL侧每个BANK的VCCO决定了该BANK的IO电平标准如果你要用EMIO做SPI接外部芯片BANK电压必须和外设电压匹配。这类方案在原理图设计上更靠近“单芯片系统设计”但它仍然是ARM和FPGA通信的常见形态尤其是做图像处理和工业控制的板子用得非常多。2. 电平匹配与转换大部分通信故障的根源2.1 电平标准不匹配的典型场景与后果ARM和FPGA分属不同厂家、不同工艺节点时IO电平标准常常不一样。ARM这边常见的有3.3V TTL、2.5V、1.8VFPGA这边则更灵活按BANK供电来定1.8V、2.5V、3.3V甚至1.5V都有。电平不匹配的最常见后果是信号无法被正确识别——高电平门限不够接收端根本采不到稳定数据。举个例子一个3.3V的ARM输出接1.8V供电的FPGA BANK如果FPGA引脚的输入容忍电压VIN只有1.98V那3.3V的信号会直接超过绝对最大额定值久而久之引脚就烧了。反过来1.8V输出接3.3V输入高电平可能刚到1.8V而3.3V的TTL高电平门槛是2.0V以上结果就是“看起来有波形但接收端就是误判”。我在实际项目中踩过一个典型的坑有个项目中ARM的I2C接口直接连到FPGA的1.8V BANK上上电后I2C一直通信失败拉上示波器发现SDA线的低电平只有0.8V左右而且上升沿非常缓慢查了半天才发现问题不在I2C协议而是FPGA的BANK根本没供3.3V电引脚输入阈值和ARM侧电平完全不匹配。从那以后我画原理图的第一件事就是把两侧的IO电平标准全部列出来再决定怎么连。2.2 电平转换的几种实现方式与选型电平转换的方案我按实际使用频率排个序电平转换芯片、开漏加上拉电阻、分压电阻网络、直接串联限流电阻。原理图设计时根据通信速率和电平差幅来选择不能一概而论。电平转换芯片最可靠适合高速信号。单向的用SN74AVC4T245、TXB0104这类双向的用TXS0108E或者带方向控制的双向缓冲器。注意TXS0108E内部有自动方向检测但推挽驱动能力很弱接长走线容易出问题TXB系列适合推挽信号但不适合开漏信号。选型时必须把信号类型看清楚。开漏加上拉适合I2C这种本身就是开漏的协议。把ARM侧的SDA/SCL设置为开漏模式外部上拉到FPGA侧的电平两边就兼容了。这个方案成本最低但对上拉电阻阻值很敏感要算好上升沿时间和灌电流能力我下文会专门讲。电阻分压只适合低速单向信号比如一些状态指示、配置管脚。用两个电阻分压把一个3.3V的信号降到1.8V看似省事但接收端的输入阻抗会改变分压比而且完全没有驱动能力高速信号想都不用想。串联限流只在“低电平输出、高电平容忍”这种特殊情况下用。比如FPGA的3.3V输入可以容忍5V TTL信号ARM输出5V那串一个几百欧的电阻限制电流可以由FPGA内部的上拉钳制完成电平匹配。这个方法能省一个芯片但必须确认接收端引脚是真的5V-tolerance且对信号质量影响可接受。2.3 I2C上拉电阻的计算小而关键的细节I2C通信在原理图阶段最容易被忽视的就是上下拉电阻的计算。热词里提到“i2c上拉电阻小了不通信”这个现象我见过很多次——上拉电阻太小SDA/SCL拉低时的灌电流太大驱动器的下拉能力不足低电平反而抬高了上拉电阻太大上升沿时间过长超出I2C协议规定的最大上升时间通信一样废掉。最小上拉电阻的约束是器件的低电平输出灌电流能力IOL和低电平最大值VOL。比如一个器件的IOL3mAVOL(max)0.4V那么上拉电阻最小值就是VCC-0.4/3mA3.3V时约966Ω所以用1kΩ比较安全。最大上拉电阻的约束则是总线电容。标准模式100kHz要求最大上升时间1μs可以用公式 Rp(max) t_r / (0.8473 × C_bus) 估算。总线电容200pF时1μs / (0.8473 × 200pF) ≈ 5.9kΩ。所以常见I2C上拉电阻取2.2kΩ到4.7kΩ就是为了在这个范围里留出余量。在ARM和FPGA的I2C链路里还要考虑FPGA侧的IO引脚电容和PCB走线寄生电容。如果挂了多个器件总线电容变大上拉电阻必须相应调小。原理图上预留0402或0603封装的焊盘调试时方便换阻值这是我个人的习惯做法。3. 隔离、电源与去耦原理图里的隐形杀手3.1 什么时候需要隔离隔离芯片怎么选ARM和FPGA同板通信大多数情况不需要隔离。但一旦涉及工业现场、电机驱动、高压采集这类场景隔离就变成硬需求了。隔离的核心目的不是保护通信信号而是切断地环路、防止共模电压把芯片打坏。CAN通信是隔离需求最典型的地方。CAN收发器比如TJA1050和控制器ARM或FPGA内置的CAN控制器之间通常要加一个带隔离的CAN收发器例如ISO1042或CTM1051这种集成隔离电源的模块。原理图设计时除了隔离芯片本身还要注意隔离电源的处理——隔离侧和原边侧的GND必须分开电源模块的隔离耐压要满足现场要求常见的选1000Vrms到3000Vrms不等。数字隔离器方面我常用的是ISO7721、ISO7741TI、Si8620Silicon Labs和ADuM1201ADI。选型时看三件事隔离耐压、数据传输速率、通道方向和数量。速率不够的隔离器用在SPI时钟线上就是灾难本来能跑50MHz的SPI过完隔离器只能跑10MHz白白浪费带宽。值得提醒的是隔离芯片原边和副边的电源电压可以不同这相当于顺带做了一次电平转换。比如ARM侧3.3VFPGA侧2.5V选一个原边3.3V、副边2.5V的数字隔离器一个器件同时解决隔离和电平匹配两个问题原理图上少一颗电平转换芯片BOM成本也下来了。3.2 FPGA供电架构与电源树设计FPGA是出了名的“电老虎”尤其是大一点的FPGA内核电压VCCINT电流轻松上几个安培核心电源设计不好通信链路再干净也白搭。原理图阶段的电源树设计直接决定了整个系统的稳定性和噪声水平。以常见的Intel Cyclone V或Xilinx Artix-7为例供电通常分几路VCCINT内核一般1.0V~1.1V电流最大、VCCIOBANK IO1.8V/2.5V/3.3V按BANK需求分配、VCCAUX辅助电源1.8V或2.5V、VCCO_PS如果是Zynq还有PS侧的电源。内核电压的纹波要求通常很严比如规范里要求VCCINT纹波不超过±30mV就需要用低纹波的DCDC或LDO方案。我在原理图里习惯这样设计FPGA电源内核和IO用开关电源DCDC做降压因为电流大、效率高辅助电源用LDO因为负载小、对噪声敏感。每个电源的输出端必须有足够的去耦电容按10μF到47μF的钽电容加0.1μF陶瓷电容的组合来做。分成多个BANK时每个BANK的VCCO引脚附近都要放去耦电容不要指望一颗电容管所有引脚。ARM侧的电源相对没那么复杂但要注意ARM内核供电和IO供电的时序关系。很多ARM要求内核电源先于IO电源上电或者至少不能晚太多这个在原理图上可以用电源监控芯片或DCDC的使能脚做时序控制。FPGA也有类似的上电时序要求比如VCCINT先上电、VCCIO后上电要仔细阅读对应芯片手册的Power-Up Sequence章节。3.3 去耦电容的布局原理图标注和PCB落位的配合去耦电容在设计里有个“潜规则”——原理图上画了不代表有效必须靠近芯片电源引脚放置才起作用。ARM和FPGA这类大规模数字芯片工作时的瞬态电流变化极快电源引脚到去耦电容之间的走线电感如果太大高频噪声根本滤不掉。原理图阶段能做的是把去耦电容的封装和位置约束标注清楚。我习惯在每个电源引脚旁放一个0.1μF的0603电容同时在原理图Page上做一个注释声明所有去耦电容必须放置在距离对应电源引脚3mm以内的位置。PCB Layout时这个约束会被严格检查不能随手丢在板子边缘。大容量的体电容BULK电容也不能省。FPGA每个BANK通常需要至少一个10μF到47μF的电容放在BANK附近应对低频电流波动。ARM侧如果做高频数据处理内核电源的输入输出端都要有体电容否则DCDC输出电压会被瞬态负载拉垮。还有一个小细节模拟地和数字地如果要做分割磁珠或0Ω电阻的放置点要在原理图上提前预留不能等Layout完再补。4. 时钟、复位与配置电路通信的“心跳”和“起点”4.1 时钟源方案晶振还是有源振荡器ARM和FPGA通信的物理层很多接口依赖共同的时钟参考。比如SPI接口的时钟由ARM产生FPGA作为从机跟随这时ARM侧的时钟源质量直接影响了SPI信号的建立保持时间。我给ARM选时钟源时低速场合用无源晶振加负载电容高速场合用有源振荡器。无源晶振需要芯片内部的振荡电路配合原理图要加两个匹配电容电容值按晶振手册的CL值选常见的是18pF到22pF。有源振荡器比如说50MHz的贴片振荡器只要供电和输出使能输出直接接到ARM的时钟引脚更省事信号抖动也更小。FPGA侧的时钟则要看实际需要。如果FPGA需要和ARM的通信时钟同步通常从ARM引一个时钟输出给FPGA做主时钟或者两个芯片用同一个参考晶振经时钟缓冲器分发。时钟缓冲器比如CDCV304或ICS501可以为多个设备提供相同的时钟保证同步性。有一点要特别注意ARM和FPGA的通信接口比如SPI或并行总线有时需要两端共用同一个时钟域否则会出现跨时钟域的数据不同步问题。原理图设计时就要提前规划好时钟方向是从ARM输出给FPGA还是FPGA输出给ARM又或是外部晶振分发。这个决定比选哪个品牌方案更重要。4.2 复位电路上电复位和外部复位的实现复位电路看着简单实际踩坑的人不少。最经典的错误是用一颗电容加电阻做RC上电复位电压上升比较慢在阈值附近来回振荡造成芯片复位不稳定。调试的时候偶尔能跑、偶尔死机最后查半天发现是复位信号毛刺引起的。我现在的做法是ARM和FPGA各自使用专用的复位监控芯片。比如MAX809/MAX811这种带上电复位和手动复位输入输出低电平复位信号给芯片。复位时间要满足芯片手册要求一般至少数十毫秒。ARM和FPGA之间如果通信有握手逻辑通常让ARM的GPIO去控制FPGA的复位这样ARM启动后确认自身外设就绪再把FPGA拉出复位状态避免两边同时上电导致通信建立失败。FPGA的配置完成后也会有一个INIT或DONE信号。如果ARM和FPGA之间有复杂的协作逻辑通常会把FPGA的DONE信号反馈给ARM的一个GPIOARM等这个信号为高后才开始和FPGA通信。这个在原理图上就是一根线的事但对系统稳定性帮助极大。4.3 FPGA配置电路主动串行还是被动串行FPGA是SRAM工艺上电后需要从外部配置芯片或主控加载比特流。这个配置过程如果设计不好会让ARM等不到FPGA就绪然后通信链路一直建立不起来。FPGA的配置模式常见有主动串行AS、被动串行PS、JTAG和某些型号支持SPI Flash等方式。配置引脚的电平设置决定了哪种模式生效。以Cyclone IV/V为例MSEL引脚的上下拉就决定了配置模式原理图里不能悬空必须按数据手册的要求处理。如果采用主动串行需要一个EPCS或SPI NOR FlashFPGA上电后自己从Flash读配置。如果采用被动串行ARM可以通过GPIO模拟配置时序把比特流喂给FPGA。这种方案省一颗Flash但ARM侧的软件复杂度会高一些。值得注意的是配置模式切换时MSEL引脚的电平必须在FPGA上电前稳定否则可能出现配置失败。实际项目里我通常会预留JTAG接口用于调试和烧写同时保留主动串行作为生产模式。JTAG链路上如果同时有ARM和FPGA要设计好TDI到TDO的级联顺序以及每一级的旁路电容处理避免JTAG信号变形导致无法下载。5. 信号完整性与Layout协作原理图里就要想到的约束5.1 串阻端接小电阻解决大问题ARM和FPGA之间的高速信号线尤其是SPI时钟、并行总线数据线在原理图上就应该预留串阻位置。串阻通常22Ω到33Ω的作用是抑制反射和振铃改善信号边沿的单调性。为什么需要端接信号沿PCB走线传播时如果接收端输入阻抗和走线特征阻抗不匹配就会发生反射信号在走线上来回反弹形成过冲和下冲。反射波形叠加后接收端可能在信号电平中间抖动时钟采样就容易采错。串阻靠近驱动端放置相当于在源端做了一次阻抗匹配吸收反射波。串阻阻值怎么选我一般先用33Ω起步然后在实测里根据眼图或波形过冲情况调整。有时候大电流信号不需要串阻但控制时钟线、复位线这种对噪声敏感的信号串阻几乎是必须的。原理图上串阻应尽量靠近驱动芯片的引脚。除了串阻上拉或下拉电阻也很重要。FPGA的空闲输入引脚如果原理图上没做上下拉容易悬空产生不定态导致FPGA内部逻辑误触发。比如SPI的片选信号、复位信号在ARM和FPGA之间一般要求有一端做默认电平钳位。这个细节在原理图评审时经常被遗漏。5.2 走线长度、等长和回流路径的约束原理图阶段虽然不画线但工程师必须对Layout提出明确约束否则交给Layout工程师后高速信号出问题再回来改板代价非常大。SPI接口在几十MHz以下时对等长要求不算苛刻但时钟线尽量短DATA线和CLK线的长度差控制在几百密尔以内比较稳妥。并行总线则苛刻得多数据线之间、数据线和时钟之间的等长都要做特别是数据速率上百M时等长误差要控制在±50密尔甚至更小。原理图上可以给总线信号统一加Net Class约束设置好线宽、间距、等长规则这样Layout工程师直接按规则布线比手工量可靠得多。回流路径是很多人忽略的一点。ARM和FPGA如果分布在板子两侧信号线下方没有完整的参考地平面信号的回流就要绕路形成很大的环路面积辐射和串扰都会加剧。所以原理图阶段要规划好AGND/DGND的分割方式和禁区尽量避免高速信号跨分割平面。必要时可以在分割处加缝合电容提供一个高频回流通道。5.3 布局分区数字、模拟、功率的隔离ARM和FPGA通信的板子往往不只是这两个芯片还有模拟采集、功率驱动、通信接口等模块。布局分区是原理图阶段就要考虑的顶层规划。我的做法是把板子按功能划分为三个区域ARM主控区、FPGA逻辑区、接口/电源区。ARM和FPGA的通信信号走在这两个区域的中间地带尽量短、尽量直避免绕到功率区或模拟区。数字地和模拟地在原理图上用磁珠或0Ω电阻连接这样既兼容仿真需求也给Layout留了选择空间。大电流的DC-DC电感应远离ARM和FPGA的时钟引脚和通信信号走线。电感产生的交变磁场会耦合到邻近信号线上造成不可预测的干扰。如果板子空间紧张可以在原理图上加屏蔽罩的Keepout或者在关键信号上方预留地平面保护。这些都是原理图阶段能做的“软约束”但落到实处能省掉后续一半的调试痛苦。6. 常见问题排查实录硬件工程师的避坑笔记6.1 我踩过的通信问题与解决对照表以下问题是ARM和FPGA通信原理图设计中最高频的几类我直接整理成速查表方便你对照排查。故障现象可能原因原理图检查点SPI通信完全无响应片选信号极性/时序不匹配或者片选信号漏接确认CS是否被FPGA正确配置是否有外部上下拉SPI数据偶发错位时钟线走线过长、串阻缺失信号过冲导致重复采样检查时钟线串阻是否预留CLK走线是否远离干扰源UART偶尔收到乱码两边的波特率设置不一致或电平标准不兼容确认TX/RX交叉连接GND是否共地TX/RX电平是否匹配I2C通信时通时不通上拉电阻偏大或偏小总线电容过大按公式重新计算上拉电阻检查器件挂载数量并行总线间歇性数据错误等长约束没做好时钟和数据相位差用示波器对比数据和时钟的相位调整等长约束FPFA配置偶尔失败MSEL引脚电平在配置期间不稳定检查MSEL上下拉是否牢固配置时钟是否干净通信受电源噪声影响去耦不足电源纹波过大检查去耦电容数量和放置位置电源芯片输出电容是否足够表格里的每一条我都实际碰到过。最典型的是SPI偶发错位这个之前一个项目里ARM用SPI往FPGA写配置10次里有1次配置不对查了好几天最后用示波器看到时钟信号上升沿有回沟加了个33Ω串阻现象立刻消失。从那以后我在原理图里对所有可能的高速信号都预留了串阻位置调试时有退路。6.2 调试手段原理图阶段就要留出的测试点原理图阶段如果多花十分钟加几个测试点调试阶段能省好几个小时的抓线时间。我强烈建议在ARM和FPGA通信的关键信号上都预留测试点SPI的CLK、MOSI、MISO、CSUART的TX、RXI2C的SDA、SCL并行总线的时钟和几条关键数据线。测试点封装选0402的焊盘或者小过孔就行关键是原理图上要有明确的Net Label方便调试时用示波器或逻辑分析仪探针去抓。如果有条件把测试点尽量布置在信号线的末端靠近接收端的位置这样看到的是接收端真实波形而不是发送端的波形。调试时还经常需要断开ARM和FPGA之间的连接做单端测试。比如先用逻辑分析仪直接抓ARM发出的SPI命令是否符合预期再单独灌信号给FPGA看它能否正确响应。这个需求在原理图上可以通过预留0Ω电阻实现——在信号线上加一个串联0Ω位号调试时可以拆掉断开两侧单独测一边。量产时把0Ω换成焊接的电阻或直接短接非常灵活。6.3 上电时序与监测电路设计的经验最后再说说上电时序。ARM和FPGA通信的很多“幽灵故障”跟电源上电顺序有很大关系。FPGA如果内核和IO电源上电顺序不对可能导致IO引脚在配置期间输出不定态影响到和ARM相连的信号线。ARM如果先上电开始跑程序、去访问FPGA而FPGA还没配置完成通信自然会失败。原理图设计时我通常会给ARM加一个“等待FPGA_DONE”的逻辑。FPGA的DONE信号接ARM的GPIOARM启动后轮询这个引脚为高才继续后续初始化流程。这个引脚在FPGA配置完成前是低电平不会误触发ARM的中断或通信逻辑。如果板子对时序有严格要求也可以加电源监控芯片比如TPS3808或ADM809监控电源电压并输出复位信号保证所有芯片在电压稳定后才被释放复位。这种方案比单纯RC电路可靠得多尤其是FPGA的配置时间较长需要确保ARM不会在FPGA配置完成前就开始通信。总之在原理图里多花一点成本换来的是整个系统上电过程的确定性这笔投入非常值。在我个人的实际经验里ARM和FPGA通信的原理图设计难的不是把两个芯片连起来而是把所有影响通信的不确定因素在图纸阶段就消灭掉。电平怎么匹配、上拉电阻取多少、电源纹波能不能扛住、测试点放在哪里这些东西每一个单独看都是小问题但叠加在一起就成了系统稳定性的分水岭。希望这篇从接口选型一路讲到排查实录的文章能让你在画下一张原理图的时候少走几个弯路。
返回列表