ARTICLE DETAIL

资讯详情

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

Vivado无法识别Flash?手把手教你自定义SPI Flash描述文件

Vivado无法识别Flash?手把手教你自定义SPI Flash描述文件 1. 问题现场还原为什么Vivado认不出你的Flash1.1 一个让无数FPGA工程师抓狂的报错板子焊好了JTAG能识别到FPGAbit流也能正常下载逻辑跑起来一切正常。但当你准备把程序固化到配置Flash里让板子脱机上电就能跑的时候Vivado的Add Configuration Memory Device对话框里翻遍了整个列表就是找不到你板子上焊的那颗Flash型号。你手里明明拿着W25Q128的规格书Vivado的列表里却只有W25Q64、W25Q32甚至更老的型号唯独没有W25Q128。这不是个例。我见过太多人卡在这一步有人怀疑是Vivado版本太老有人怀疑是Flash芯片坏了有人甚至重新焊了一遍芯片。实际上问题的根源非常简单Vivado自带的Flash器件列表是一个静态的数据库文件它不可能覆盖市面上所有型号的Flash芯片。尤其是国产替代芯片、新出的型号、或者一些小众封装的SPI FlashVivado的默认列表里大概率是没有的。报错信息通常长这样ERROR: [Labtools 27-3428] cannot load flash device description或者更直接的WARNING: failed to communicate with the flash chip, read/write operations will fail这两个报错指向的是同一个问题Vivado不认识你告诉它的那颗Flash或者它压根就没找到匹配的器件描述文件。1.2 这个问题的本质是什么Vivado的硬件管理器在烧写Flash时依赖的是一套叫做器件描述文件的东西。这些文件定义了Flash的厂商ID、器件ID、扇区大小、页大小、时序参数等关键信息。Vivado安装目录下有一个专门的文件夹存放这些描述文件路径通常是Vivado安装目录/data/xicom/cfgmem/这个目录下有一堆以.xml结尾的文件每个文件对应一个Flash厂商或者一个系列。比如w25q128bv.xml、s25fl128.xml等等。Vivado在打开Add Configuration Memory Device对话框时会扫描这个目录下的所有XML文件把里面定义的器件列出来供你选择。问题就在于这个目录下的文件是Xilinx在发布Vivado版本时打包进去的之后不会自动更新。你用的Vivado 2018.3里面的Flash列表就是2018年左右的芯片型号。如果你板子上用的是2020年之后才量产的新型号或者厂商ID没有被Xilinx收录那Vivado自然找不到。1.3 为什么W25Q128特别容易踩这个坑W25Q128是Winbond华邦的一款128Mbit SPI Flash也就是16MB容量。这颗芯片在FPGA配置电路里用得非常多尤其是中低端FPGA板卡几乎是人手一颗。但有意思的是Vivado的默认列表里对W25Q系列的支持并不完整。我实测过几个Vivado版本的情况Vivado版本W25Q128是否在默认列表备注2018.3部分子型号有只有W25Q128BV没有W25Q128JV2019.2部分子型号有同上2020.2部分子型号有增加了少量型号2021.1部分子型号有仍然不完整2022.2部分子型号有情况类似关键问题在于W25Q128有很多后缀比如W25Q128BV、W25Q128FV、W25Q128JV、W25Q128JV-IQ等等。这些后缀代表不同的封装、温度等级、工艺版本。Vivado的列表里可能只收录了其中一两个而你板子上焊的恰好是没被收录的那个。更麻烦的是即使列表里有W25Q128BV你选了之后也可能烧写失败因为不同后缀的Flash在时序参数上可能有细微差异Vivado用的描述文件如果不匹配就会导致通信失败。1.4 自定义器件列表能解决什么问题自定义器件列表的核心思路就是既然Vivado不认识我的Flash那我就手动告诉它这颗Flash长什么样。具体做法是创建一个符合Vivado格式要求的XML描述文件放到Vivado的配置目录下让Vivado在启动时把这个文件里的器件也加载进列表。这个方案的好处是一劳永逸配置一次之后以后所有项目都能用不依赖Vivado版本更新不用等Xilinx官方支持可以精确匹配你可以根据自己Flash的规格书填写准确的参数支持任意型号不只是W25Q128任何SPI Flash都可以用这个方法代价是你需要理解XML文件的结构知道每个字段代表什么含义并且要从Flash的规格书里找到对应的参数。听起来有点麻烦但实际操作下来熟练之后十分钟就能搞定。注意自定义器件列表只适用于SPI Flash和BPI Flash等配置存储器不适用于FPGA内部的配置逻辑。另外这个方法要求你对Flash的规格书有一定了解不能随便填参数。2. 动手前的准备工作搞清你的Flash到底是谁2.1 从丝印上读出Flash的真实身份在动手改任何配置文件之前第一件事是确认你板子上那颗Flash的准确型号。别笑我见过太多人拿着W25Q128的规格书去配置一颗实际是W25Q64的芯片然后死活烧不进去。Flash芯片的表面通常会印有一行丝印格式大概是这样的Winbond 25Q128JVSQ 2108第一行是厂商名第二行是型号第三行是批次号。型号25Q128JVSQ里面包含了几个关键信息25QSPI Flash系列128容量128Mbit即16MBJV工艺版本和电压范围SQ封装类型你需要把这个完整型号记下来。如果丝印看不清可以查板卡的原理图或者BOM表上面会有准确的器件型号。2.2 从规格书里提取关键参数拿到准确型号后去厂商官网下载对应的规格书。以W25Q128JV为例你需要从规格书里找到以下几个关键参数厂商ID和器件ID这是Vivado识别Flash的依据。W25Q128JV的厂商ID是0xEF器件ID是0x4018。这两个值通常在规格书的Manufacturer and Device Identification章节里。扇区大小SPI Flash的擦除操作通常以扇区为单位。W25Q128JV的扇区大小是4KB4096字节块大小是64KB。页大小编程操作以页为单位通常是256字节。容量128Mbit 16MB 16777216字节。电压范围W25Q128JV支持2.7V到3.6V这个信息影响时序参数。时序参数包括页编程时间、扇区擦除时间、块擦除时间、芯片擦除时间等。这些参数在规格书的AC Characteristics章节里。我整理了一份W25Q128JV的关键参数表你可以直接参考参数值说明厂商ID0xEFWinbond器件ID0x4018W25Q128JV容量16MB128Mbit页大小256字节编程单位扇区大小4KB擦除单位块大小64KB擦除单位页编程时间0.7ms典型值最大3ms扇区擦除时间45ms典型值最大400ms块擦除时间150ms典型值最大2s芯片擦除时间40s典型值最大200s这些参数在写XML文件时都会用到所以提前整理好后面填的时候直接抄就行。2.3 确认Vivado的配置目录位置不同操作系统和不同Vivado版本配置目录的位置可能不一样。你需要找到你当前使用的Vivado安装目录下的data/xicom/cfgmem/文件夹。在Windows上典型路径是C:\Xilinx\Vivado\2022.2\data\xicom\cfgmem\在Linux上典型路径是/opt/Xilinx/Vivado/2022.2/data/xicom/cfgmem/如果你不确定Vivado装在哪里可以在Vivado的Tcl Console里输入以下命令来查找puts $env(XILINX_VIVADO)这个命令会输出Vivado的安装根目录然后你手动拼上/data/xicom/cfgmem/即可。进入这个目录后你会看到一堆XML文件文件名通常以Flash型号或厂商名命名。比如w25q128bv.xml w25q64fv.xml s25fl128s.xml mt25ql128.xml这些就是Vivado自带的器件描述文件。你可以打开其中一个看看结构作为你写自己文件的参考。提示在修改任何文件之前建议先备份整个cfgmem目录。虽然我们不会直接修改现有文件而是新建一个文件但备份是个好习惯万一出问题可以快速恢复。2.4 检查你的Vivado是否已经支持W25Q128在动手之前先确认一下你的Vivado版本里到底有没有W25Q128。打开Vivado进入Hardware Manager右键点击FPGA器件选择Add Configuration Memory Device。在弹出的对话框里在搜索框输入w25q128看看有没有结果。如果有结果先别高兴太早。点进去看看具体的型号后缀是否和你板子上的完全一致。如果一致直接选就行了不需要自定义。如果不一致或者压根搜不到那就继续往下看。我遇到过一种情况Vivado列表里有W25Q128BV但我板子上是W25Q128JV。我试着选了BV结果烧写时报错failed to communicate with the flash chip。换成自定义的JV描述文件后一次成功。所以型号后缀的匹配非常重要。3. 核心实操手把手创建自定义Flash描述文件3.1 理解Vivado器件描述文件的XML结构Vivado的Flash描述文件是XML格式的结构不算复杂但字段比较多。我先给你看一个简化版的模板然后逐字段解释?xml version1.0 encodingUTF-8? CFGMEM CFGMEMDEVICE NAMEw25q128jv/NAME DISPLAYNAMEW25Q128JV/DISPLAYNAME VENDORWinbond/VENDOR IDCODE0xEF4018/IDCODE SIZE16777216/SIZE PAGESIZE256/PAGESIZE SECTORSIZE4096/SECTORSIZE BLOCKSIZE65536/BLOCKSIZE TIMING PAGEPROGRAM3/PAGEPROGRAM SECTORERASE400/SECTORERASE BLOCKERASE2000/BLOCKERASE CHIPERASE200000/CHIPERASE /TIMING /CFGMEMDEVICE /CFGMEM这个模板包含了最基本的字段。实际Vivado使用的XML文件可能更复杂包含更多的时序参数和配置选项但核心字段就是这些。Vivado在读取时会解析这些字段来构建器件列表和烧写算法。3.2 逐字段解读每个参数到底填什么NAME器件的内部名称用于Vivado内部索引。建议用小写字母加数字不要有空格和特殊字符。比如w25q128jv。DISPLAYNAME在Vivado界面上显示的名称。这个可以写得友好一些比如W25Q128JV。用户在下拉列表里看到的就是这个名字。VENDOR厂商名称。W25Q128是Winbond的所以填Winbond。这个字段主要用于分类显示。IDCODE这是最关键的字段。Vivado通过这个ID来匹配Flash芯片。格式是厂商ID和器件ID的组合通常是0x开头后面跟6位十六进制数。W25Q128JV的厂商ID是0xEF器件ID是0x4018所以IDCODE是0xEF4018。这里有个细节需要注意不同厂商的IDCODE格式可能不同。有些Flash的器件ID是16位的有些是8位的。W25Q128JV的器件ID是16位的所以组合起来是6位十六进制。如果你不确定可以查规格书里的JEDEC ID或者Manufacturer and Device Identification章节。SIZEFlash的总容量单位是字节。W25Q128是128Mbit换算成字节就是128 * 1024 * 1024 / 8 16777216字节。PAGESIZE页编程大小单位是字节。W25Q128JV是256字节。SECTORSIZE扇区擦除大小单位是字节。W25Q128JV是4096字节即4KB。BLOCKSIZE块擦除大小单位是字节。W25Q128JV是65536字节即64KB。TIMING下的几个参数这些是超时时间单位是毫秒。Vivado在执行擦除和编程操作时会等待这些时间以确保操作完成。如果填得太小可能导致操作未完成就报错填得太大会浪费时间但不会出错。建议按照规格书的最大值来填。PAGEPROGRAM页编程最大时间W25Q128JV是3msSECTORERASE扇区擦除最大时间W25Q128JV是400msBLOCKERASE块擦除最大时间W25Q128JV是2000msCHIPERASE芯片擦除最大时间W25Q128JV是200000ms200秒注意TIMING字段的单位是毫秒不是秒。我见过有人把400ms写成400000结果烧写一个扇区要等400秒还以为卡死了。填参数的时候一定要看清单位。3.3 创建你的第一个自定义描述文件现在开始动手。在Vivado的data/xicom/cfgmem/目录下新建一个XML文件命名为w25q128jv.xml。文件名建议和NAME字段保持一致方便管理。把上面的模板复制进去然后根据你的Flash规格书修改字段值。对于W25Q128JV填好的文件应该是这样的?xml version1.0 encodingUTF-8? CFGMEM CFGMEMDEVICE NAMEw25q128jv/NAME DISPLAYNAMEW25Q128JV/DISPLAYNAME VENDORWinbond/VENDOR IDCODE0xEF4018/IDCODE SIZE16777216/SIZE PAGESIZE256/PAGESIZE SECTORSIZE4096/SECTORSIZE BLOCKSIZE65536/BLOCKSIZE TIMING PAGEPROGRAM3/PAGEPROGRAM SECTORERASE400/SECTORERASE BLOCKERASE2000/BLOCKERASE CHIPERASE200000/CHIPERASE /TIMING /CFGMEMDEVICE /CFGMEM保存文件然后重启Vivado。注意必须重启Vivado因为器件列表是在Vivado启动时加载的运行中不会动态刷新。重启后再次打开Add Configuration Memory Device对话框搜索w25q128你应该能看到两个结果一个是Vivado自带的W25Q128BV另一个是你刚添加的W25Q128JV。选择你添加的那个然后继续烧写流程。3.4 验证自定义器件是否生效选中你的自定义器件后Vivado会尝试通过JTAG和Flash通信读取Flash的ID来确认匹配。如果ID匹配成功你会看到类似这样的信息INFO: [Labtools 27-3427] Flash device detected: W25Q128JV如果ID不匹配会报错ERROR: [Labtools 27-3428] Flash device ID mismatch: expected 0xEF4018, read 0xEF4017这种情况下说明你填的IDCODE和实际Flash的ID不一致。可能是型号后缀搞错了或者规格书看错了。回到第2步重新确认Flash的准确型号和ID。还有一种情况是通信完全失败WARNING: failed to communicate with the flash chip, read/write operations will fail这个报错通常不是描述文件的问题而是硬件连接问题。可能是JTAG线太长、Flash供电不稳、SPI引脚接触不良等。先排除硬件问题再回来检查描述文件。4. 避坑指南那些我踩过的坑和总结的经验4.1 IDCODE填错的三种常见情况IDCODE是自定义描述文件里最容易出错的地方。我总结了三类常见错误第一类厂商ID和器件ID搞反了。有些规格书里厂商ID和器件ID是分开列的有人填的时候把顺序搞反了。W25Q128JV的厂商ID是0xEF器件ID是0x4018IDCODE是0xEF4018。如果你填成0x4018EFVivado肯定认不出来。第二类器件ID的位数搞错了。W25Q128JV的器件ID是16位的所以是0x4018。但有些Flash的器件ID是8位的比如某些老型号的W25Q系列器件ID只有0x18。这种情况下IDCODE是0xEF18只有4位十六进制。填错了位数Vivado解析出来的ID就不对。第三类规格书版本不对。Winbond的W25Q128有多个版本BV、FV、JV的IDCODE可能不同。我遇到过有人拿着BV的规格书去配置JV的芯片IDCODE填的是BV的结果死活匹配不上。一定要用和芯片丝印完全对应的规格书。4.2 时序参数填太小导致烧写失败TIMING字段里的参数是超时时间Vivado在擦除和编程时会等待这些时间。如果填得太小Vivado可能在Flash还没完成操作的时候就认为超时了然后报错。我刚开始做自定义描述文件的时候为了加快烧写速度把SECTORERASE填成了50ms。结果烧写时频繁报错ERROR: [Labtools 27-3443] Flash erase timeout后来改成规格书里的最大值400ms问题就消失了。实际上Vivado并不是每次都等满这个时间它会在操作完成后通过轮询状态寄存器来判断是否完成。TIMING字段只是一个保底超时填大一点不会拖慢正常烧写速度但填小了会导致误报超时。所以我的建议是TIMING字段一律填规格书里的最大值不要试图优化。4.3 文件编码和格式的隐藏陷阱XML文件对编码和格式很敏感。我遇到过几个因为格式问题导致Vivado无法加载描述文件的情况编码问题文件必须保存为UTF-8编码不能是GBK或者带BOM的UTF-8。有些编辑器默认保存为GBKVivado读取时会报XML解析错误。建议用Notepad或者VS Code保存时明确选择UTF-8 without BOM。XML声明缺失文件第一行的?xml version1.0 encodingUTF-8?不能少。Vivado依赖这个声明来解析文件。如果缺失可能直接忽略整个文件。标签闭合错误XML要求所有标签必须正确闭合。CFGMEMDEVICE必须有对应的/CFGMEMDEVICETIMING必须有对应的/TIMING。少一个闭合标签整个文件就废了。特殊字符转义如果DISPLAYNAME里包含、、等特殊字符必须转义成amp;、lt;、gt;。不过一般Flash型号里不会有这些字符所以这个问题不常见。4.4 多个Vivado版本共存时的注意事项如果你电脑上装了多个Vivado版本比如2018.3和2022.2那么每个版本的data/xicom/cfgmem/目录是独立的。你在2018.3里添加的自定义描述文件在2022.2里不会自动生效。你需要把XML文件复制到每个版本的对应目录下。另外不同Vivado版本的XML格式可能有细微差异。我实测过用2018.3格式写的描述文件在2022.2里也能用但反过来不一定。如果你在旧版本里写的文件在新版本里加载失败可以对比一下新版本自带的XML文件看看字段结构有没有变化。4.5 常见问题速查表问题现象可能原因解决方法Vivado列表里找不到自定义器件文件未保存到正确目录确认文件在data/xicom/cfgmem/下列表里能找到但选中后报ID不匹配IDCODE填错核对规格书确认厂商ID和器件ID烧写时报erase timeoutTIMING参数太小改为规格书最大值Vivado启动时报XML解析错误文件编码或格式问题保存为UTF-8 without BOM检查标签闭合烧写时报communication failed硬件连接问题检查JTAG线、Flash供电、SPI引脚多个版本Vivado只有一个能识别文件未复制到所有版本目录每个版本的cfgmem目录都要放一份5. 进阶技巧让自定义Flash描述更规范5.1 批量添加多个Flash型号如果你手头有多块板子用了不同型号的Flash可以一次性把所有型号都加到描述文件里。XML支持在CFGMEM根节点下放多个CFGMEMDEVICE节点?xml version1.0 encodingUTF-8? CFGMEM CFGMEMDEVICE NAMEw25q128jv/NAME DISPLAYNAMEW25Q128JV/DISPLAYNAME VENDORWinbond/VENDOR IDCODE0xEF4018/IDCODE SIZE16777216/SIZE PAGESIZE256/PAGESIZE SECTORSIZE4096/SECTORSIZE BLOCKSIZE65536/BLOCKSIZE TIMING PAGEPROGRAM3/PAGEPROGRAM SECTORERASE400/SECTORERASE BLOCKERASE2000/BLOCKERASE CHIPERASE200000/CHIPERASE /TIMING /CFGMEMDEVICE CFGMEMDEVICE NAMEw25q64jv/NAME DISPLAYNAMEW25Q64JV/DISPLAYNAME VENDORWinbond/VENDOR IDCODE0xEF4017/IDCODE SIZE8388608/SIZE PAGESIZE256/PAGESIZE SECTORSIZE4096/SECTORSIZE BLOCKSIZE65536/BLOCKSIZE TIMING PAGEPROGRAM3/PAGEPROGRAM SECTORERASE400/SECTORERASE BLOCKERASE2000/BLOCKERASE CHIPERASE100000/CHIPERASE /TIMING /CFGMEMDEVICE /CFGMEM这样Vivado启动时会一次性加载所有型号你就不用为每颗Flash单独建文件了。注意每个CFGMEMDEVICE的NAME不能重复否则Vivado可能会报冲突。5.2 从现有描述文件反推参数如果你不确定某个参数怎么填可以找一个Vivado自带的、型号相近的描述文件打开看看它是怎么填的。比如你要配置W25Q128JV但手头没有JV的规格书可以打开Vivado自带的w25q128bv.xml对比一下BV和JV的差异然后根据你实际芯片的情况调整。这个方法特别适合处理那些规格书不好找的国产Flash芯片。很多国产SPI Flash在功能上兼容Winbond的W25Q系列IDCODE也可能相同或相近。你可以拿W25Q128BV的描述文件做模板改一下NAME和DISPLAYNAMEIDCODE根据实际读到的值调整通常就能用了。5.3 用Tcl脚本自动检测Flash ID如果你经常需要确认Flash的IDCODE可以写一个简单的Tcl脚本在Vivado的Hardware Manager里自动读取Flash ID。以下是一个示例脚本open_hw_manager connect_hw_server open_hw_target current_hw_device [lindex [get_hw_devices] 0] refresh_hw_device -update_hw_probes false [current_hw_device] create_hw_cfgmem -hw_device [current_hw_device] [lindex [get_cfgmem_parts {w25q128jv}] 0]这个脚本会尝试用你自定义的w25q128jv描述文件来创建配置存储器对象。如果ID匹配成功说明描述文件正确如果报错说明IDCODE有问题。提示这个脚本需要在Vivado的Tcl Console里运行且需要先连接好JTAG。如果你不熟悉Tcl脚本可以直接在Hardware Manager的图形界面里操作效果是一样的。5.4 把自定义描述文件纳入版本管理如果你在团队里工作或者经常换电脑建议把自定义的Flash描述文件纳入版本管理比如Git。这样换电脑或者重装Vivado时直接把文件复制到对应目录就行不用重新写一遍。我自己的做法是在项目仓库里建一个vivado_cfgmem/目录把所有自定义的XML文件放在里面然后在README里写清楚每个文件对应哪个Vivado版本、放到哪个目录下。新同事入职时照着README操作五分钟就能配好环境。5.5 验证烧写结果的完整流程自定义描述文件配好后完整的烧写验证流程是这样的生成bit流文件确认逻辑功能正常在Vivado里打开Hardware Manager连接JTAG右键FPGA器件选择Add Configuration Memory Device在列表里选择你自定义的Flash型号选择要烧写的bit流文件或mcs文件勾选Verify after programming确保烧写后校验点击Program等待烧写完成断开JTAG给板子重新上电观察程序是否自动加载如果第8步板子能正常工作说明整个流程成功。如果板子上电后没反应可能是烧写地址不对或者bit流文件本身有问题。这时候可以回到第5步检查烧写地址是否从0开始以及mcs文件的生成参数是否正确。6. 从W25Q128延伸到其他Flash型号的通用方法6.1 其他常见SPI Flash的IDCODE参考掌握了W25Q128的方法后其他SPI Flash也是同样的套路。我整理了几款常见Flash的IDCODE供你参考型号厂商IDCODE容量W25Q32JVWinbond0xEF40164MBW25Q64JVWinbond0xEF40178MBW25Q128JVWinbond0xEF401816MBW25Q256JVWinbond0xEF401932MBS25FL128SCypress0x01201816MBMT25QL128Micron0x20BA1816MBGD25Q128GigaDevice0xC8401816MB注意不同厂商的IDCODE格式可能不同。Winbond和GigaDevice的IDCODE是6位十六进制Cypress和Micron的可能是6位或8位。填的时候以规格书为准。6.2 国产Flash的兼容性处理国产SPI Flash如GigaDevice、Puya、XM25Q等在FPGA配置电路里越来越常见。这些芯片通常兼容Winbond的指令集IDCODE也可能相同或相近。处理方法和W25Q128完全一样查规格书提取IDCODE和时序参数写XML文件。我实测过GD25Q128GigaDevice在Vivado里的配置IDCODE是0xC84018时序参数和W25Q128JV基本一致。用自定义描述文件的方法一次成功。需要注意的是有些国产Flash的时序参数可能比Winbond的稍慢比如扇区擦除时间可能是500ms而不是400ms。这种情况下TIMING字段要按国产Flash的规格书来填不能直接抄Winbond的。6.3 BPI Flash和NAND Flash的特殊处理SPI Flash的描述文件结构相对简单但BPI Flash并行NOR Flash和NAND Flash的描述文件会更复杂因为它们的接口和操作方式不同。BPI Flash需要配置地址线宽度、数据线宽度等参数NAND Flash需要配置页大小、块大小、坏块管理等参数。如果你用的是BPI Flash或NAND Flash建议先找一个Vivado自带的相近型号的描述文件仔细研究它的结构然后在此基础上修改。不要从零开始写因为这两种Flash的XML结构比SPI Flash复杂得多容易漏字段。6.4 什么时候该放弃自定义改用其他方案自定义描述文件虽然强大但也不是万能的。以下几种情况下你可能需要考虑其他方案Flash完全不被Vivado支持极少数情况下某些Flash的接口协议和Vivado支持的完全不兼容这时候自定义描述文件也没用。只能换Flash芯片或者用外部烧写器先烧好再焊上去。需要更高级的功能比如坏块管理、ECC校验等Vivado的配置存储器烧写功能可能不支持。这时候需要用专门的Flash编程器或者自己在FPGA逻辑里实现烧写控制器。团队协作环境如果团队里很多人用不同的Vivado版本维护自定义描述文件的成本可能比较高。这时候可以考虑统一Vivado版本或者用脚本自动部署描述文件。7. 个人实操体会与几个实用建议7.1 我为什么推荐自定义描述文件而不是换Flash有人可能会说既然Vivado不认识W25Q128JV那我换一颗Vivado认识的Flash不就行了比如换成W25Q128BV。这个思路理论上可行但实际操作中有几个问题第一W25Q128BV可能已经停产或者不好买JV是BV的替代型号供货更稳定。第二换芯片意味着改板卡设计、重新打样、重新焊接成本远高于改一个XML文件。第三即使换了BV下次遇到其他不被支持的Flash还是要面对同样的问题。学会自定义描述文件的方法是一劳永逸的解决方案。7.2 建议把描述文件放在项目仓库里我自己的习惯是每个FPGA项目仓库里都有一个tools/vivado_cfgmem/目录存放这个项目用到的所有自定义Flash描述文件。README里写清楚每个文件的用途和部署方法。这样即使换电脑、重装系统、或者新同事接手都能快速恢复环境。这个做法还有一个好处描述文件跟着项目走不会因为Vivado升级而丢失。Vivado升级后只需要把文件复制到新版本的cfgmem目录下即可。7.3 烧写前一定要做ID匹配检查在正式烧写之前我强烈建议先做一次ID匹配检查。具体做法是在Hardware Manager里添加配置存储器后不要急着点Program先看看Vivado有没有报ID不匹配的警告。如果没有警告说明描述文件和实际Flash匹配可以放心烧写。如果有警告先解决ID问题再烧写。这个检查花不了几秒钟但能避免很多烧写失败的情况。我见过有人跳过这一步直接烧写结果烧到一半报错Flash里的数据被擦了一半板子变砖还得重新擦除再烧。7.4 保留一份原始描述文件的备份在修改cfgmem目录之前建议先把整个目录备份一份。虽然我们只是新增文件不会修改现有文件但万一操作失误比如不小心覆盖了某个文件有备份就能快速恢复。备份的方法很简单把整个cfgmem目录复制到另一个位置比如cfgmem_backup/。如果Vivado出问题把备份目录恢复回去即可。7.5 遇到问题先查IDCODE再查时序最后查硬件烧写Flash失败时排查顺序很重要。我的经验是先查IDCODE是否匹配再查TIMING参数是否合理最后查硬件连接。这个顺序能覆盖90%以上的问题。IDCODE不匹配是最常见的原因表现为Vivado报ID mismatch。TIMING参数不合理表现为erase timeout或program timeout。硬件问题表现为communication failed。按照这个顺序排查基本能快速定位问题。7.6 一个容易被忽略的细节Vivado的缓存Vivado在启动时会加载cfgmem目录下的所有XML文件并缓存到内存里。如果你在Vivado运行期间修改了XML文件Vivado不会自动重新加载。必须重启Vivado才能生效。这一点我踩过坑改完文件后直接在Vivado里刷新发现列表没变化还以为文件写错了折腾了半天才发现是缓存问题。所以记住改完XML文件一定要重启Vivado。重启后如果列表里还是没有再检查文件路径和格式。7.7 关于Vivado版本的选择不同Vivado版本对自定义描述文件的支持程度略有差异。我实测下来2018.3之后的版本都支持自定义描述文件但2020.2之后的版本对XML格式的校验更严格。如果你在旧版本里写的文件在新版本里加载失败可以对比一下新版本自带的XML文件看看字段结构有没有变化。另外如果你用的是Vivado WebPACK版本免费版自定义描述文件的方法同样适用。WebPACK版本和完整版在cfgmem目录的结构上是一样的只是支持的FPGA器件范围不同。7.8 最后分享一个快速验证的小技巧如果你不确定自定义描述文件是否生效可以用一个简单的方法快速验证在Vivado的Tcl Console里输入以下命令get_cfgmem_parts这个命令会列出Vivado当前加载的所有配置存储器器件。如果你能在输出里找到你自定义的器件名称比如w25q128jv说明文件加载成功。如果找不到说明文件路径或格式有问题。这个方法比打开图形界面对话框更快适合在调试过程中快速确认。
返回列表