ARTICLE DETAIL

资讯详情

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

FPGA启动失败排查:JTAG连接与Vivado调试的三个隐藏条件

FPGA启动失败排查:JTAG连接与Vivado调试的三个隐藏条件 干FPGA调试这行最怕的往往不是RTL仿真没过而是板子拿回来下载器插上去Vivado硬件管理器里死活扫不到器件。更邪门的是有时候JTAG能连上bitstream也下载成功了但板子就是跑不起来DONE灯不亮IO口毫无反应——这种“启动失败”最费头发。我前前后后调过好几块不同平台的板子踩了不少坑发现很多问题根本不是逻辑代码的锅而是JTAG连接和FPGA启动流程里那几个特别隐蔽的条件没满足。今天就把Vivado硬件管理器这块的避坑经验整理出来重点说说FPGA启动失败背后三个最容易被忽略的隐藏条件。这篇文章适合正在做FPGA开发、尤其是刚接触Vivado和JTAG调试的工程师也适合那些被板卡“莫名其妙启动失败”折磨的硬件联调人员。我会从故障类型判断开始逐步拆解电源与时序、JTAG链路信号、配置模式与状态信号这三个隐藏条件再给出一套完整的实操排查流程和常见问题速查表。内容全部来自实际调试中的真实案例可以直接当排查手册用。1. 先搞清故障类型JTAG连不上和启动失败是两码事很多初学者一看到“FPGA启动失败”第一反应就是板子坏了或者代码写错了然后开始疯狂改逻辑、重新综合折腾半天毫无进展。实际上JTAG连接和FPGA启动是两条相关但不同的链路必须先分清楚你遇到的到底是哪一类故障。1.1 打开Vivado硬件管理器后我们到底在看什么Vivado硬件管理器Hardware Manager的工作机制可以理解成一条数字链路PC上的Vivado通过USB接口驱动下载器比如Digilent JTAG-HS3、Xilinx Platform Cable USB II下载器再通过JTAG四根信号线TCK、TMS、TDI、TDO连接到目标板上的FPGA。这条链路的末端是FPGA内部的JTAG TAP控制器和IDCODE寄存器。当你点击“Open Target”并选择“Auto Connect”时Vivado会往JTAG链上发送扫描指令读取链上所有器件的IDCODE。如果能正常读到你的FPGA型号说明JTAG链路物理连通、电源基本正常、TAP状态机工作正常。如果读不到IDCODE那问题大概率出在链路本身或者FPGA的最基本供电上。这里要特别注意JTAG能扫到器件只能说明FPGA的JTAG接口和核心逻辑区域有电、TAP控制器能响应不代表整个FPGA能正常完成配置和启动。这两个层次必须分开看排查思路才能清晰。1.2 常见报错速查从“No hardware target”到“DONE not high”实际调试中Vivado硬件管理器的报错信息千奇百怪但归类下来就那么几类。我把常见报错和它们对应的故障方向整理成了一个速查思路方便你第一时间定位问题大致范围。报错/现象含义优先排查方向No hardware target / Cannot find targetVivado没找到下载器或目标板USB驱动、下载器是否识别、线缆连接Device not detected / No device foundJTAG链上没读到器件IDCODEJTAG信号线、电源、TCK频率、链路拓扑IDCODE mismatch / Unsupported IDCODE读到的IDCODE和工程不匹配器件型号选择、链上多个器件时选错目标Configuration failed / DONE not highbitstream下载失败或DONE信号没拉高配置模式引脚、DONE上拉、bit文件是否正确CRC error ...配置过程中CRC校验失败时钟稳定性、电源纹波、flash中的bit流损坏Programming failed烧写flash失败flash型号、SPI配置模式、电平匹配这里想多提一句有些人用过ARM调试器看到过“could not stop cortex-m device! please check the jtag cable.”这类报错其实道理相通——几乎所有JTAG调试器报出“cable”相关错误时核心都在于信号链路和供电而不是芯片逻辑本身。这个思路在FPGA调试里同样适用。1.3 用DONE灯和INIT_B信号快速定位故障阶段FPGA的启动过程有几个关键状态信号看懂它们你就能在“JTAG连不上”和“配置启动失败”之间快速划清界限。首先是DONE信号。这是一个开漏输出引脚FPGA成功完成配置后会被释放再依靠外部上拉电阻拉高。所以正常情况下配置完成后DONE引脚应该为高电平。如果DONE灯不亮可能性有两种要么配置根本没完成要么上拉电阻没接或者被外部电路强行拉低。其次是INIT_B信号它在上电后有一段低电平时间用于FPGA内部初始化然后会被释放拉高表示初始化完成、可以开始接收配置数据。如果INIT_B一直为低或者配置过程中突然拉低通常意味着CRC校验错误、外部配置模式出错或者配置源有问题。我在调试中用得最多的判断方法是上电后先看DONE和INIT_B的状态。如果JTAG能扫到器件、下载bitstream时报DONE没拉高重点查配置引脚和DONE上拉如果JTAG本身就扫不到先不要碰配置相关的问题回头查电源和链路。把这两条路分开排查能节省大量时间。2. 隐藏条件一电源树和上电时序JTAG连接最容易被忽略的地基第一个隐藏条件也是最容易踩的坑电源。别觉得这是一句废话我见过太多人把JTAG连不上归结为下载器坏了最后发现是板子上某个电压轨根本没起来或者电压值不对。2.1 供电压差导致扫描不到器件一个实测案例之前调试一块Artix-7板卡现象是Vivado偶尔能扫到器件偶尔扫不到而且只要扫不到重新插拔下载器或者给板子重新上电概率上又能扫到。一开始怀疑是JTAG插座虚焊补焊了好几遍没用。后来用万用表挨个测量FPGA的电源轨发现VCCO_0的实际电压只有1.6V。这块板子的Bank 0是配置相关的BankVCCO_0应该供电3.3V结果板子上一个LDO虚焊输出被拉低了将近一半。为什么VCCO电压不对会影响JTAG扫描因为JTAG引脚分布在特定的Bank上这些Bank的IO电平参考就是VCCO。JTAG链上TMS、TCK、TDI、TDO的电平标准都由这个Bank的供电决定。如果电压不对电平标准就不满足数据手册要求器件内部的输入缓冲可能无法可靠识别信号自然就出现时好时坏、扫不到IDCODE的情况。所以检查JTAG连接问题时第一件事不是换下载器而是拿万用表把FPGA的所有关键电压轨都量一遍。具体来说至少要看这几组VCCINT核心逻辑电压7系列通常是1.0VUltraScale系列可能是0.85V或0.9VVCCAUX辅助电压7系列一般为1.8V这个电压不稳会导致IDCODE读取异常甚至配置失败VCCO各个Bank的IO电压尤其是Bank 0和JTAG所在BankVCCBRAM块RAM电压7系列通常与VCCINT一致。2.2 上电时序与JTAG配置的关系电源电压正确还不够上电顺序同样重要。FPGA数据手册里都会给出上电时序要求比如VCCINT要先于VCCAUX上电、各电源轨的上升时间要在规定范围内。违反时序要求轻则导致DONE无法拉高、配置失败重则损伤器件。为什么上电时序会影响JTAG和启动在FPGA内部JTAG TAP控制器和配置逻辑在上电初期会经历一个PORPower-On Reset过程。如果某些电压轨还没稳定POR状态机可能进入异常状态导致TAP控制器无法正确响应JTAG指令。排查上电时序可以用示波器同时测量多路电源轨的上电曲线。很多商用开发板上都设计有电源监控芯片比如TI的TPS38x系列可以观察电源正常输出时序。如果是自己画的板子最好在调试阶段就把每个电源轨的斜坡时间、到达稳定值的先后顺序摸清楚。我踩过的一个比较典型的坑某块板子使用外部电源模块给FPGA供电上电顺序是VCCO先起来、VCCINT后起来结果板子有时能启动有时不能。后来在电源模块的使能引脚上加了一个RC延时电路把上电顺序调整成VCCINT→VCCAUX→VCCO问题立刻消失。所以在排查FPGA启动问题时如果电压值都正常但行为不稳定一定要考虑时序因素。2.3 排查电源问题的三步法如果你怀疑电源有问题按照下面三步来基本不会漏第一步用万用表测量所有核心电压轨的对地阻值排除短路和虚焊。上电之前测一次上电之后再测一次。第二步用示波器抓取各电压轨的上电波形确认电压稳定值、上升时间、时序关系。特别关注VCCAUX和VCCO这两个电压异常造成的JTAG问题最多。第三步检查电源指示灯和电源芯片的PGPower Good信号。如果PG信号没有正常拉高说明前级电源有问题FPGA侧再正常也没用。注意Vivado硬件管理器如果闪退或者出现“Cannot find hardware target”先看是否真的识别到了下载器再排查FPGA侧电源。不要把顺序搞反了。3. 隐藏条件二JTAG链路拓扑与TCK信号完整性扫不到器件的元凶第二个隐藏条件集中在JTAG链路本身。电源没问题的情况下大部分“JTAG连不上”的故障都出在链路拓扑和信号完整性上。这个方向的坑比较细需要靠示波器和耐心去抠。3.1 菊花链上的“老大哥”和“小弟”先聊聊JTAG菊花链。如果你的板子上只有一个FPGA链路非常简单TDI进FPGATDO出FPGA。但如果板子上有多个支持JTAG的器件比如几个FPGA、一个CPLD、甚至一个带JTAG的MCU它们一般会被串成一条菊花链。菊花链的规则是前一个器件的TDO接到后一个器件的TDI最后一个器件的TDO回到下载器。Vivado扫描时会把链上所有器件的IDCODE都读出来然后让你选择操作哪个。听起来很简单但实际调试时有个很经典的坑链上某个器件的TDO虚焊会导致它后面所有器件都扫不到。我处理过一块板子JTAG链上有两个FPGA扫描时只能识别第一个第二个始终读不到IDCODE。一开始怀疑第二个FPGA没供电量了电压正常。后来用示波器量第一个FPGA的TDO输出发现波形异常再查才发现第一个FPGA和一个CPLD之间的TDI连线有一个过孔内部断了。这种问题光看原理图完全看不出来只能在板子上顺着信号一个个量。如果你遇到链上部分器件扫不到建议按下面的顺序查确认链上所有器件的电源都正常检查每个器件的TDI/TDO连接是否真正导通确认最后一个器件TDO到下载器之间有合适的上拉通常板子上需要上拉到VCCO排除下载器自己的TDO引脚虚焊或者排线断路。3.2 TCK频率和线缆质量高速信号的低速问题JTAG链路是相对低速的接口但低速不代表没有信号完整性问题。TCK时钟频率如果设置太高或者线缆太长TCK边沿会变差导致TAP状态机跳错状态直接表现就是扫描不到器件或者偶尔能连上偶尔连不上。Vivado硬件管理器默认的连接频率通常是6MHz或15MHz修订后的版本可能更高。如果你的下载器和板卡之间用的是较长的杜邦线或者质量一般的扁平线这个频率很容易出问题。我的经验是板卡调试阶段优先把TCK频率降到3MHz甚至1MHz等确认链路稳定后再提升。不要觉得降频率丢人能稳定扫到器件比什么都重要。修改TCK频率的方法很简单在Vivado硬件管理器里右键点击目标器件选择“Device Properties”或者直接在Tcl Console里输入命令设置。具体Tcl命令我后面单独讲这里先给一个直观感受高频连不上、低频能连上90%的可能是信号完整性问题查线缆、查走线、查连接器。3.3 JTAG四根线的上拉要求与电平匹配JTAG信号的上拉电阻也是个容易翻车的地方。按照Xilinx官方文档和常见的板级设计规范TMS、TDI、TCK在FPGA内部一般会有上拉或内部下拉机制但TDO通常需要板级上拉。如果TDO的上拉电阻缺失或者上拉电压和下载器的参考电平不匹配轻则扫描不稳定重则完全扫不到。还有一个更隐蔽的点下载器的参考电压VREF必须和板卡JTAG接口的电平一致。大多数下载器比如Digilent的JTAG-HS3会从目标板读取一个VREF用来确定IO电平标准。如果你板卡上的JTAG接口的VREF引脚没有连接或者连接的电压和FPGA实际Bank电压不一致下载器输出的信号电平就会不匹配导致FPGA无法正确识别。实测定下来一块板卡如果出现“常温下能连、低温/高温下偶尔连不上”的诡异现象除了检查焊接质量之外一定要用示波器看TCK和TMS的上升沿确认是不是因为上下拉电阻阻值偏大导致边沿过缓。边沿太缓的情况下温度变化会把本来就不大的时序裕量彻底吃掉。4. 隐藏条件三配置模式引脚与DONE状态启动失败的真正元凶第三个隐藏条件也是最容易被忽视的FPGA从上电到完成配置中间有一个“启动源选择”的过程而这个过程是由配置模式引脚决定的。很多所谓的“启动失败”其实是配置模式引脚被人为或者硬件上设置成了错误的状态导致FPGA根本不知道从哪里读取配置文件。4.1 M[2:0]配置模式引脚FPGA的“开机启动盘”以Xilinx 7系列FPGA为例芯片上有M[2:0]三个配置模式引脚。这三个引脚的电平组合决定了FPGA上电后从哪个“启动盘”加载配置。常见模式包括Master SPIFPGA主动从SPI flash读取配置Master BPI从并行NOR flash读取Slave SelectMAP被动接收外部配置数据Slave Serial被动串行接收JTAG完全通过JTAG接口配置不以其他方式加载。问题的关键在于M[2:0]的电平是采样的上电瞬间就会被锁存之后改变引脚电平不会重新触发配置。如果你板子上的M[2:0]跳线帽设置成了Master SPI模式而SPI flash里既没有烧录程序或者程序不对FPGA就会一直尝试从flash读取数据读取失败后反复重试DONE永远拉不高表现出来的现象就是“板卡完全没有启动”。这个时候你用Vivado硬件管理器连接却发现JTAG是可以识别器件的下载bitstream也提示成功但DONE就是不亮。很多人卡在这里百思不得其解。实际上解决办法是把M[2:0]模式改成JTAG模式或者直接通过JTAG下载后强制启动再重新下载验证逻辑是否正常。我遇到过一个案例某块板子用了拨码开关设置M[2:0]工程调试阶段一直正常某天突然“启动失败”DONE灯不亮。查了半天发现是拨码开关的焊盘有一侧氧化导致接触电阻变大模式引脚电平被拉到了错误状态。把拨码开关换新后一切恢复正常。硬件问题往往就藏在最不起眼的地方。4.2 INIT_B和DONE的微妙关系配置过程的气压表除了模式引脚INIT_B和DONE这两个信号的状态组合几乎是FPGA配置过程中最直接的“故障仪表盘”。我总结了以下几种组合对应的含义INIT_B拉低、DONE拉低FPGA正在初始化或者外部配置模式被拉低等待配置INIT_B释放、DONE拉低初始化完成正在接收配置数据但还没收到完整的配置帧INIT_B在配置过程中突然拉低多半是CRC校验失败或者配置数据源异常DONE拉高但逻辑不工作可能配置完成了但配置数据本身bitstream和实际板卡不匹配比如引脚约束错误、bank电压不对导致IO无法正常工作。这个组合判断法在实际调试里非常有用。我以前碰到一块板子上电后DONE灯亮着但外设完全没反应。起初以为是FPGA逻辑没跑起来后来用ChipScope一抓发现是约束文件里把某个Bank的IO标准定义成了LVCMOS33但板子上这个Bank实际供电是2.5VIO输出电平完全不对外设自然不识别。这种“配置成功但逻辑异常”的最快定位方式就是回过去检查硬件设计和约束文件的匹配度。4.3 使用Vivado硬件管理器读取设备状态信息Vivado硬件管理器本身提供了不少调试信息。当JTAG识别到FPGA器件后右键点击器件选择“Device Properties”可以看到当前器件的IDCODE、版本、状态寄存器等信息。这些信息对于判断“到底是没配置成功还是配置成功但运行异常”非常有帮助。另外一个实用操作是在硬件管理器里点击“Program Device”下载bitstream时注意观察Console窗口的输出。如果下载过程中抛出“CONFIG_ERROR”之类的错误基本可以锁定是配置链路问题如果是“DONE not high”重点查我上面说的模式引脚和DONE上拉。提示在怀疑FPGA启动失败但JTAG能正常连接时先不要着急改代码重编译。先用JTAG强制下载一个最简单的、只点亮LED的bitstream试试。如果连这种最简工程都无法让DONE拉高问题基本不在逻辑代码而在硬件配置链路。5. 实操从零排障一个“连不上、启动不了”的板卡理论归理论实际调试还是需要一套规范化的操作流程。下面是我个人比较常用的排障流程照着做基本能覆盖80%以上的问题。5.1 上电前检查清单2分钟快速排查硬件拿到一块无法正常连接的板卡先不要急着接下载器。花两分钟按下面的清单过一遍很多低级错误就能直接排除。检查项检查内容常见问题电源输入外部电源是否接入、开关是否打开电源开关位置不对板子压根没上电电源输出电压各电压轨是否正常电源模块损坏、保险丝烧断配置模式M[2:0]跳线/拨码是否设置正确跳线帽松动、位置错误JTAG接口排线方向是否正确、是否插紧10pin/14pin排线插反、虚接下载器下载器与PC的连接是否正常USB线接触不良、驱动未安装共地下载器与板卡是否共地使用隔离电源时地电位不一致DONE上拉DONE引脚是否有上拉电阻到VCCO上拉缺失导致DONE无法拉高这个清单看上去简单但每一条我都踩过。尤其是共地问题使用实验室可调电源给板卡供电时如果电源和下载器各自接地存在压差JTAG信号很容易异常。这种问题示波器都不一定好抓但检查起来最快。5.2 Vivado硬件管理器标准操作流程硬件检查完毕进入Vivado实际操作。以下是我经常使用的标准流程打开Vivado在Flow Navigator中点击“Open Hardware Manager”点击“Open Target”选择“Auto Connect”如果链路正常硬件管理器窗口会出现JTAG链上的器件列表选中FPGA器件右键点击“Program Device”选择bitstream文件勾选“Program”点击下载观察Console窗口输出和DONE状态变化。如果Auto Connect扫不到器件可以先点击“Open Target”下的“Open New Target”手动选择下载器类型和连接方式。有时候下载器固件需要刷新在Vivado中也可以执行“Refresh JTAG”操作。还有一个细节新下载器第一次插到电脑上Windows可能会识别成未知设备。这时候需要手动安装下载器驱动。Vivado安装目录下自带驱动位置一般在安装目录的data/drivers下面。安装完成后确认设备管理器里能识别到下载器的COM口或者USB设备再打开Vivado硬件管理器。5.3 Tcl Console排查命令比界面更高效的手段如果你和我一样喜欢用命令行Vivado的Tcl Console在硬件调试时能节省不少时间。下面几个常用命令分享给大家# 打开硬件管理器 open_hw_manager # 连接本地硬件服务器 connect_hw_server # 打开目标设备 open_hw_target # 获取当前目标上的所有器件 get_hw_devices # 查看器件属性包括IDCODE、状态等 get_hw_device [current_hw_device] # 设置TCK频率为3MHz注意具体属性名可能因版本而异 set_property PARAM.FREQUENCY 3000000 [current_hw_target] # 下载bitstream set_property PROGRAM.FILE {/path/to/your/top.bit} [current_hw_device] program_hw_devices [current_hw_device]这几个命令组合起来可以在脚本里快速循环多次重新扫描经常能抓到偶发性的连接问题。我调试恶劣链路时喜欢写个小Tcl循环每两秒扫描一次配合示波器观测可以快速定位是时序问题还是接触问题。5.4 一个完整的排障实战记录最后分享一个比较有代表性的实战案例。客户的板子现象是JTAG偶尔识别到FPGA但大多数时候无法识别且DONE灯从不亮。我的排查顺序是这样的第一步量电压。VCCINT 1.0V正常VCCAUX 1.8V正常VCCO各个Bank电压正常。电源OK排除第一个隐藏条件。第二步降TCK频率。在Tcl Console里把频率降到1MHz重新扫描器件稳定识别到了。这说明链路信号完整性确实有问题但后来又发现即使高频下也能识别——问题还是不稳定。第三步用示波器抓TMS和TCK波形发现TCK上升沿有严重的过冲和振铃。进一步检查JTAG排线长度超过30cm而且没有屏蔽。更换为短线屏蔽线后高频下也能稳定扫描了。第四步DONE不亮的问题。JTAG识别正常后直接下载bitstream仍然报DONE not high。检查M[2:0]发现设置成了Master SPI模式但SPI flash里烧录的是另一个版本的bitstream与当前板卡不匹配。把配置模式改成JTAG模式或者擦除SPI flash中的内容后DONE正常拉高问题彻底解决。这个案例完美对应了三个隐藏条件电源没问题链路信号完整性问题影响扫描配置模式问题导致启动失败。一块板子同时踩中两个坑这在真实项目中其实并不少见。6. 常见问题速查表按症状直接查解决方案整理了一张速查表把我在实际调试中遇到的高频问题和对应的解决办法汇总到一起方便你下次遇到类似问题时快速对照。症状可能原因排查方法解决方案完全识别不到下载器USB线损坏、驱动未装设备管理器查看USB设备换线、安装驱动识别到下载器但扫不到FPGA电源异常、JTAG链路断量电压、测TDI/TDO连通修复电源轨、补焊偶尔能连偶尔不能TCK频率过高、线缆过长、接触不良降频、换线、重插排线降低频率、使用屏蔽线识别到器件但下载失败模式引脚错误、bit文件不对查看DONE和INIT_B状态改M[2:0]、检查bitstreamDONE不亮但下载提示成功DONE上拉缺失、SPI flash异常测DONE电平、看flash状态补上拉、擦除flash配置过程中CRC报错电源纹波大、时钟不稳示波器看电源和时钟改善电源滤波链上部分器件扫不到菊花链断裂、某个器件TDO异常顺着链路测量信号修复链路连接低温/高温下不稳定上下拉阻值不当、焊接不良示波器看边沿调整上拉阻值这张表只是排查起点。实际项目里单个症状背后往往是多个原因叠加所以最重要的是掌握排查思路而不是死背解决方案。最后说说个人心得。我调试JTAG相关的故障多了以后最大的体会就是不要相信侥幸也不要依赖直觉。每次拿到一块新板子我都会强制自己按“电源→链路→配置模式→逻辑”的顺序排查而不是上来就怀疑代码。这个习惯看起来笨拙但实打实帮我节省了大量时间。另外调试过程中做好记录非常重要——哪一次改了配置模式、哪一次换了下载器线缆、哪一次调整了TCK频率这些细节记录下来不仅方便自己复盘也能在团队协作时快速同步信息。JTAG和FPGA启动这块的坑很多但翻来覆去就是电源、链路、配置这三座大山翻过去了剩下的都是坦途。
返回列表