尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用CH347替代官方下载器:Vivado 2023.1 FPGA下载与ILA在线调试实战指南

用CH347替代官方下载器:Vivado 2023.1 FPGA下载与ILA在线调试实战指南 先说结论我这边的FPGA调试环境现在基本已经从官方下载器换成了CH347。最近在Vivado 2023.1上做Zynq-7000的配置和在线调试正赶上官方下载器还没到货手头只有一块带CH347的小工具板就顺手把它当USB转JTAG用结果一次调通。整个过程并不复杂但中间有几个容易踩的坑比如驱动识别、JTAG线序、硬件管理器认不出设备都在下面列出来了。这篇教程适合手里已经有CH347模块、想省掉几百块下载器费用的FPGA玩家也适合刚接触FPGA开发、被各种下载器选型看花眼的入门朋友。我会把从接硬件到跑ILA在线调试的全流程都串一遍尽量把每个“为什么”也讲清楚。1. 为什么我放弃官方下载器选了CH3471.1 几类USB转JTAG方案的横向对比FPGA调试最绕不开的就是下载器。Xilinx官方有Platform Cable USB IIDigilent有JTAG-HS3市面还有各种FT232H、FT2232H做的山寨下载器以及我们今天要说的CH347。我把这几类方案拉了一张表价格和适合场景都标了方便你们对号入座方案接口速率驱动生态价格参考适合场景Xilinx Platform Cable USB II最高30Mbps左右官方支持即插即用千元以上生产、多设备批量配置、官方技术支持要求的场景Digilent JTAG-HS3最高30MbpsVivado原生支持500元以上常规开发调试预算充足的个人/公司FT232H/FT2232H小板上做的JTAG几Mbps到十几Mbps需装驱动Vivado靠libusb识别几十到两百个人DIY兼容性好但价格浮动大CH347模块几Mbps到十几Mbps需装驱动配置成JTAG模式三四十到一百日常下载bit、ILA调试性价比极高单看价格CH347模块可以说是吊打其他方案。一个模块加几根杜邦线一杯奶茶钱都不到。更关键的是它在国内很好买发货快不用等海外代购出了问题还能直接找卖家。官方Platform Cable USB II性能确实好但对个人开发者来说价格贵而且不少渠道还容易买到翻新货。FT232H方案跟CH347在功能上近似但CH347集成度更高除了JTAG还能同时跑UART、SPI、I2C一个芯片把调试串口也一起解决了。1.2 认识CH347芯片本身能干什么CH347是沁恒推出的一款USB高速转接芯片最大的特点是集成了多种接口。它内部有USB 2.0 Hi-Speed PHY通过USB连到电脑之后对外可以输出UART、SPI、I2C、JTAG。对于FPGA开发者来说最常用的场景就是把它配置成“USB转1路UART 1路JTAG”的组合模式这样既能下载FPGA程序又能保留一个串口给嵌入式CPU或者逻辑调试打LOG。CH347的工作模式不是靠拨码开关切的而是通过官方配置工具写入芯片内部的配置区。模式0是“USB转2路UART SPI I2C”模式1是“USB转1路UART 1路JTAG”模式2是“USB转SPI I2C 1路JTAG”。我们做FPGA调试时选模式1就好一个UART留给调试另一路JTAG专门接FPGA。不过需要注意的是出厂默认模式一般是模式0到手之后要先确认工作模式否则插上Vivado肯定认不到JTAG。1.3 什么时候不建议用CH347CH347在做日常FPGA开发和调试时够用但也不是万能的。如果你的项目涉及大规模多板卡JTAG菊花链级联或者需要跑非常高的TCK时钟去压榨配置时间再或者你所在公司严格要求使用原厂下载器那还是老老实实上官方方案。CH347的JTAG驱动能力、信号质量和官方下载器相比在极端条件下确实存在差距。另外如果你的FPGA bank电平不是3.3V而是1.8V或2.5VCH347的JTAG引脚电平需要额外做转换不能直接硬接。这一点后面接线部分我会再展开。2. 环境准备从驱动到Vivado的坑2.1 需要的软硬件清单准备东西之前先说一句CH347模块在市场上有多种形态有的是做成USB转JTAG调试器外壳有的只是裸芯片加转接小板。无论哪种只要把JTAG引脚引出来了基本都能用。我这里用的是一块常见的CH347迷你模块上面有TCK、TMS、TDI、TDO、GND、VCC引脚。硬件清单CH347模块一块台式机或笔记本最好有原生USB3.0/USB2.0接口FPGA开发板一块我这边是Zynq-7045你的是Artix-7、Kintex-7甚至纯逻辑FPGA都同理USB转Micro/B型数据线一根注意是数据线不是只有充电功能的线杜邦线若干母对母最合适线长尽量控制在10~15厘米以内可选万用表或示波器用来排查JTAG链路问题软件清单CH347官方驱动WCH官网搜CH347即可页面里有Windows驱动CH347EVT配置工具用于切换工作模式Vivado 2023.1必须能正常启动并打开Hardware Manager你的FPGA工程以及综合实现后生成的bit文件2.2 CH347工作模式切换JTAG模式怎么选这一步很多新手会漏掉。CH347第一次插上电脑之后在设备管理器里大概率显示为“COM口”或者“USB-串行桥”这是因为它默认工作在模式0。我们要做的第一步是把它切成模式1也就是“UART JTAG”。操作流程是这样的到WCH官网找到CH347EVT工具包下载后解压里面会有驱动安装程序和“CH347DUART_Utility”之类的配置工具。先把CH347模块通过USB线插到电脑安装驱动。安装完成后设备管理器能看到“USB串行设备”或者“CH347”相关条目。打开配置工具工具会自动识别到当前连接的CH347设备。在“工作模式”里选择“模式1UART JTAG”点击配置。配置完成后拔掉USB线重新插一次让新配置生效。配置工具界面一般比较直观不会出现看不懂的设置项。唯一要注意的是不同版本CH347的配置工具界面会略有差别但核心选项都是“Mode Select”或者“工作模式”选有JTAG的那一项就对了。配置成功后在设备管理器里会出现两个设备条目一个是COM口用于串口功能另一个会被系统识别为“CH347 JTAG”或者“USB Serial Converter B”后者就是我们喂给Vivado的设备。2.3 Vivado 2023.1安装和驱动兼容性提醒Vivado 2023.1安装时如果只是为了做下载和调试不必把所有器件支持包全勾上。安装器里“Vivado ML Standard”已经覆盖了主流FPGA器件没必要为了省心把SDK、DocNav、所有板级文件都装一遍装多了只占磁盘空间还拖慢启动速度。装好之后第一次打开软件会提示在线获取License用个人免费标准版就行不需要额外破解这一点官方给得很大方。在2023.1这个版本上CH347识别可能遇到一个特殊问题Vivado自带的hw_server默认依赖libusb驱动来扫描JTAG设备而CH347默认装的驱动是WCH自己的不是libusb兼容驱动。所以插上之后Vivado的Hardware Manager里很可能“无设备”。解决办法我放在第4章的实操环节里第4章我会把“识别不到”和“驱动切换”这两件事一起讲因为在Vivado 2023.1上这两步是连着的。3. 硬件接线JTAG四根线搞明白就不用慌3.1 引脚对应表JTAG说白了就是四条线加一条地线。搞清楚这四根线的含义后面排查问题就有方向了。它们的名字分别是TCK时钟、TMS模式选择、TDI数据进、TDO数据出再加上GND共地就组成了最基础的JTAG链路。CH347模块和FPGA开发板之间的接线对应如下CH347模块引脚方向FPGA JTAG引脚说明TCK输出到FPGATMS/TCK复用引脚中的TCKJTAG时钟由CH347芯片产生TMS输出到FPGATMS状态机控制信号TDI输出到FPGATDI数据从PC写入FPGATDO输入到CH347TDO数据从FPGA回读给PCGND大地GND必须和FPGA开发板共地VCC可选不接或接3.3V参考视模块是否需要外部供电接好之后建议用万用表蜂鸣档挨个量一下确认没有接反。因为很多CH347小板子的丝印方向跟引脚顺序是不一致的有些板子明明标着TCK实际上走的却是TMS这种设计失误我见过不止一次。接线时别相信丝印要翻出模块的原理图或者卖家给的引脚定义确认一下。3.2 电平匹配与电源隔离CH347的JTAG引脚电平是3.3V如果你的FPGA板卡的JTAG引脚也分布在3.3V的bank上那基本上可以直接连接。但有些FPGA系统里JTAG引脚连接到了1.8V的bank或者通过板上的电平转换电路接到了2.5V专用接口这时候直接把CH347插上去轻则通信失败重则损伤引脚。最简单的办法是确认FPGA开发板原理图中JTAG连接器的电平。如果是1.8V就需要在CH347和FPGA之间串一个电平转换模块比如TXS0108E或者用74LVC4245。我自己的习惯是不盲目接线先看板子原理图确认JTAG接口附近有没有电平转换芯片。很多开发板在JTAG接口到FPGA引脚之间已经做了电平适配那就不需要再处理。另外提醒一句给CH347供电不要太随意。USB供电是5VCH347内部有稳压但模块上的VCC引脚如果同时外接了其他设备要留意电流。一般下载FPGA程序时模块功耗很低不会出现问题但如果你同时用CH347的UART口给外部单片机供电就可能把板子的3.3V拉垮导致JTAG链路不稳定。我建议UART部分单独供电别从CH347模块上取电。3.3 JTAG链路怎么检查如果下载时报错或识别不到设备先别急着怀疑芯片坏了大概率是物理链路出问题。排查顺序推荐这种目测检查四根线是否接紧杜邦线母座接触不良是很常见的。用万用表通断档量一下CH347模块引脚到FPGA板JTAG插座之间是否是通的杜邦线内部偶尔会开路。上电后用示波器或逻辑分析仪看一下TCK引脚是否有时钟输出。如果TCK有波形说明CH347已经被电脑正常驱动问题多半出在链路另一头。断开FPGA板电源量一下TDO到GND之间的静态电阻排除FPGA侧JTAG引脚损坏。这套检查流程我每次都做基本能在五分钟内把问题定位到“驱动问题”还是“硬件问题”省下不少瞎折腾的时间。4. 在Vivado 2023.1里下载bit程序4.1 让硬件管理器识别CH347这是整套流程里最容易翻车的一步。插上CH347后打开Vivado 2023.1进入Hardware Manager正常情况下右侧窗口会列出USB JTAG设备。但如果看不到基本就是驱动对不上。接续第2.2节如果设备管理器里CH347设备显示正常但Vivado的hw_server就是扫不出来常见解决办法是把USB设备驱动切换成libusb-win32兼容驱动。具体操作是用一个叫Zadig的小工具也可以在WCH配置工具里看看有没有直接切换驱动的按钮。用Zadig的话打开后在设备列表里找到CH347相关设备选择目标驱动为“libusb-win32 (v1.2.x.x)”或者“WinUSB”然后点击“Replace Driver”。切换完成后拔插USB线再打开Vivado的Hardware Manager设备就能出现了。驱动切换这件事看着简单实际上影响的范围不小。Vivado 2023.1的hw_server重新整理了USB设备的枚举逻辑对未知VID/PID的兼容性没有以前好。所以在这版本上CH347的驱动切换几乎是必经之路。如果你用的旧版本Vivado有时候装上原厂驱动就能识别但2023.1建议直接按上面的流程操作。4.2 新建Target并下载bit的完整步骤设备识别出来后下载bit文件的操作路径是固定的在Vivado的“Flow Navigator”里点“Open Hardware Manager”如果当前没有打开工程也可以直接菜单栏点“Open Hardware Manager”。点“Open Target”选择“Open New Target”。向导里会让你选择硬件服务器默认就是“localhost:3121”直接Next。如果CH347已经被驱动正常识别下一步设备列表里就会显示出来选中它继续。到这里Hardware Manager界面上会看到FPGA器件节点比如“xc7z045_0”右键点“Program Device”。在弹出的对话框里加载你综合实现后生成的.bit文件例如“top_20231001.bit”。点“Program”然后观察输出窗口的下载日志出现“Program/Verify Operation successful”就代表下载成功。这里有个细节下载bit时Vivado默认会顺带检查JTAG链路上的设备和bit文件里的器件型号是否匹配。如果打开bit时提示“device mismatch”多半是FPGA器件型号选择不对或者JTAG链路上还有其他设备需要先确认当前选中节点是不是目标FPGA。多片FPGA板卡或者Zynq方案里JTAG链路上可能既有PS侧的调试接口又有PL侧的FPGA务必确认节点对应关系。4.3 下载后FPGA不跑的处理思路bit下载成功不代表程序一定能跑起来。有时候下载log显示成功但FPGA内部逻辑完全没有反应这时候先别急着怀疑CH347大概率问题出在板子本身。我总结了一个排查顺序看FPGA的DONE引脚是否拉高DONE点亮或测到高电平才是配置成功。查启动模式引脚比如Zynq的BOOT_MODE、7系列的MODE引脚必须设置成JTAG模式否则FPGA上电后会从QSPI或SD卡启动。检查有没有下拉电阻、跳线帽把JTAG相关引脚强制拉到了非JTAG模式。检查时钟是否正常工作很多板子没有板载晶振或者晶振没有焊接代码里又用到了MMCM/PLL自然跑不起来。如果程序里用了外部复位确认复位芯片或者按键引脚的默认电平是不是你代码里期待的那一档。这套排查思路百试百灵。特别要注意“下载成功但DONE不亮”的情况基本等于FPGA没有进入配置状态跟CH347关系不大。这里插一句下载过程中如果出现类似“could not stop cortex-m device! please check the jtag cable.”这样的调试器报错很多新手会被吓到觉得是不是FPGA坏了。其实这是调试器在对目标设备的JTAG TAP状态机进行初始化时TDO回读数不符合预期。最常见的原因就是线序接错、杜邦线松动、或者TCK频率太高。把这个报错当作“JTAG链路握手失败”来理解就行按第3.3节的硬件检查流程走一遍大概率能找到问题。5. 在线调试在Hardware Manager里抓波形5.1 给RTL工程埋调试探针下载bit程序只是基本功CH347真实的价值在于配合Vivado的ILA跑在线调试。ILA可以理解为FPGA内部的一组逻辑分析仪综合时把指定信号接到ILA的探针上下载后就能在Hardware Manager窗口里实时查看波形。给工程加ILA有两种常用方式第一种是在Vivado的IP Catalog里例化ILA IP核GUI界面里配置探针数量和位宽然后在RTL代码里实例化模块。适合不太想改代码想让探针列表清晰的场景。第二种是直接在RTL代码里给信号加mark_debug属性这需要用的Tcl命令或者XDC约束。我更喜欢这种方式因为不用在代码里额外例化ILA模块只加属性就够了。举例来说如果我想看一个计数器信号“cnt”的波形可以在约束文件里写set_property MARK_DEBUG TRUE [get_nets {cnt[0]}] set_property MARK_DEBUG TRUE [get_nets {cnt[1]}] set_property MARK_DEBUG TRUE [get_nets {cnt[2]}] set_property MARK_DEBUG TRUE [get_nets {cnt[3]}]如果信号是总线配合通配符可以一次性搞定set_property MARK_DEBUG TRUE [get_nets cnt_reg*]综合、实现之后打开Hardware ManagerVivado会自动把带有MARK_DEBUG属性的信号整理成调试探针下载时提示“insert debug core”一路确定即可。5.2 触发设置、采样深度和窗口操作用ILA抓波形时最关键的是设置触发条件。你要想清楚“我想抓哪个时刻的波形”然后告诉ILA在这之前在样本里保留多少数据。触发条件设置入口在Hardware Manager的ILA调试窗口里每个探针都可以设触发值。比如抓“cnt 100”就在对应探针的触发条件里填上100匹配条件选“Equal”。触发位置一般设成“Window”或“Basic”采样深度我习惯设成1024或2048太浅的话数据不够看太深又不必要。一个非常实用的技巧在设置触发条件前先把这个探针的值改成十六进制显示。Vivado的调试窗口默认是二进制总线位宽一大就看得头晕。右键信号在弹出菜单里改“Radix”设成十六进制波形一下就清爽了。下载好带ILA的比特流之后点击“Run Trigger”按钮ILA开始等待触发条件。等到电路运行到符合条件的那一刻硬件管理器会自动把ILA里的采样数据回传到电脑端然后在窗口里画出波形。注意为了让ILA能观察内部信号综合时必须保证这些信号没有被优化掉这也是为什么有这个mark_debug属性会让综合器保留信号比裸综合后瞎猜信号名称要可靠得多。5.3 从仿真到实测我自己踩过的几个调试坑在线调试和仿真是两种完全不同的体验。仿真时你掌控所有输入实测时处理器、外设、时钟全都真实运转问题也奇奇怪怪。我在CH347这套环境里踩过几个典型的坑写出来供你们参考第一个坑是信号没有加mark_debug下载后想找某个信号却找不到。原因是综合优化时把它吃掉了。解决办法是在综合设置里把“-keep_equivalent_registers”之类的选项打开并在约束文件里把相关信号全部标记成MARK_DEBUG再重新综合。第二个坑是ILA里看到的波形全是一个固定值怎么触发都不变化。通常是被观察信号的时钟域和ILA的采样时钟不一致。ILA的采样时钟必须选一个合适的时钟比如调试时钟和被测逻辑在同一时钟域下不然采集到的数据会混乱或者一直保持同一值。第三个坑是下载带ILA的bit后下载时间明显比普通bit长部分情况下还会超时。这个正常因为ILA会占用不少片上资源生成的bit也更大。如果特别慢可以先不把ILA嵌到bit里用“合成探针”的方式重新实现或者降低采样深度。6. 常见问题与排查技巧实录6.1 问题速查表把这一路操作中我遇到过的高频问题整理成了一张表方便你直接对照现象可能原因排查/解决方式Vivado Hardware Manager里看不到CH347设备驱动不兼容hw_server没识别到用Zadig切换为libusb-win32或WinUSB驱动后重插USB设备能看到但Open Target时报错JTAG链路接触不良或芯片型号没选对检查线序重新拔插在向导里确认FPGA器件节点下载bit时报“Device mismatch”bit文件和FPGA型号不匹配或者链路上串了其他器件核对器件型号确认JTAG菊花链上每个节点的位置提示“could not stop cortex-m device!”JTAG链路初始化失败TDO回读异常降低TCK频率检查杜邦线确认电平匹配bit下载成功但程序不运行启动模式不对或DONE没拉高检查MODE引脚/BOOT_MODE确认时钟和复位ILA触发不理想或波形全为0采样时钟选错、触发条件设错或信号被优化确认采样时钟域修触发值重新综合保留信号滚动日志里出现大量CRC错误JTAG链路噪声大线材过长或供电不足缩短杜邦线降低TCK频率给FPGA板独立供电这表基本上覆盖了90%的日常问题。如果还解决不了建议先从最简单的物理连接查起因为CH347模块本身出问题的概率通常很低。6.2 JTAG链路不是“一插就好”的频率和线材都要控制JTAG链路看着简单其实对连接质量很敏感。TCK频率高的时候沿的建立保持时间会很紧这时候只要链路里有一点点接触电阻或者线间电容回读的TDO就会出现位错。我遇到过一种情况TCK默认频率下完全正常但上了比较高的JTAG时钟后就报CRC error。后来把TCK频率调低问题就消失了。怎么调频率在Vivado Hardware Manager里右键当前JTAG设备节点打开Device Properties能直接看到TCK clock频率设置。调试阶段我一般设成3MHz到6MHz之间稳定且方便排查问题。下载大容量bit文件的时候再考虑临时调高到十几MHz省时间。如果你手头线材比较长比如超过20厘米高频下更容易出问题这个时候别犹豫果断把线缩短或者换质量好的屏蔽线。另外一个容易忽略的点是共地。CH347模块和FPGA板如果不共地JTAG信号会乱飞。很多USB转JTAG板子没有单独引出GND而是靠USB线和电脑共地如果你用的是台式机前置USB口的供电地电位可能不稳容易引发TDO回读错误。这时候换成机箱后面板USB口或者从FPGA板上拉一根线到CH347的GND问题就会缓解。6.3 环境进入调试状态后的几个小习惯调通一次不算本事每次都能快速进入状态才叫熟练。我养成了一些小习惯可以让调试过程不断链每次下载前先看一眼设备和板卡的供电灯亮着才动手。下载bit文件时确保没有其他软件占用JTAG设备比如别的Vivado工程、第三方调试器驱动都关了免得hw_server和驱动打架。用Tcl脚本固定一套下载操作比如几百行代码或者几条命令直接打开硬件管理器、连接目标、加载bit省得每次手动点好几层菜单。给ILA设置好默认触发条件专门保存一个调试用constraint文件这样每次综合实现都能自动带上调试核不需要反复设置。这套习惯一开始培养有点费事但后面节省的时间非常可观。调试本身是个需要状态连贯的事工具链顺畅了思路才不会被零碎操作打断。我个人的习惯是整套环境正常之后会把CH347模块和常用杜邦线单独收到一个自封袋里和FPGA板放在一起。换电脑或者换开发板的时候直接照着上面这套流程走一遍十分钟就能搭好。CH347作为USB转JTAG工具来用代替官方下载器处理日常FPGA配置和ILA调试完全够用关键是这个成本太友好折腾坏了也不心疼。如果你想低成本入门FPGA调试我真心建议试一把CH347。
返回列表