☰
Vivado手动添加W25Q128JVEIQ SPI Flash的完整配置与烧录指南
2026/9/28 5:48:16 网站建设 项目流程

1. W25Q128JVEIQ 和 Vivado 默认 Flash 列表对不上的根本原因

做 FPGA 板卡调起来最磨人的环节,不是 RTL 仿真,也不是时序收敛,而是到了收尾阶段准备把 bitstream 固化到 SPI Flash 的时候,在 Vivado 的 Hardware Manager 里翻半天找不到板子上那颗 Flash 的型号。最近我手里的板子用的就是华邦 W25Q128JVEIQ,Vivado 2020.2 的默认列表里愣是没有。搜了一圈,网上讲这个型号的帖子不少,但多数只给结论不给推导,真按着操作还是会踩坑。这篇就把我这次从查型号、手动添加、参数核对到最终烧录验证的完整过程整理出来。

先说结论:W25Q128JVEIQ 这个型号没出现在 Vivado 的 Flash 列表里,并不是 Vivado 不支持它,而是这个“JVEIQ”后缀把 Xilinx 的匹配规则卡住了。很多人在这一步就开始怀疑工具,其实问题出在 Flash 型号命名的理解上。

1.1 先读懂 W25Q128JVEIQ 这个名字到底在说什么

华邦的 SPI NOR Flash 型号有一套固定的命名规则,W25Q128JVEIQ 可以拆成几段看:

  • W25Q:华邦的 SPI NOR Flash 产品线
  • 128:容量 128 Mbit,换算过来是 16 MB
  • JV:核心工艺代次,对应 1.8V 或 3.3V 供电系列,W25Q128JV 是一个完整的产品族
  • E:封装代码,一般是 SOP-8 208mil 或 WSON-8 这类小封装
  • I:温度等级,工业级 -40℃ 到 +85℃
  • Q:符合 RoHS,无铅

Vivado 的列表里收录的通常是 W25Q128JVSIM、W25Q128JWFM 这类常见封装和温度档。JVEIQ 这个变体的封装和温标组合太具体了,Xilinx 没有必要把所有封装后缀都收进去。

关键点在于:Vivado 识别 Flash 时真正关心的是器件核心和命令集,不是封装样式。W25Q128JVEIQ 和列表里的 W25Q128JV 系列,在 JEDEC ID、指令集、扇区结构上是一致的,所以完全可以通过列表里已有的型号来覆盖。

1.2 为什么不能随便选一个“看起来容量一样”的 Flash

有些朋友看到列表里没有华邦,直接选了个 Micron 或 ISSI 的同容量 Flash,然后就发现编程时各种报错。原因是 SPI Flash 的编程算法和命令集并没有完全统一。

  • 页编程命令:多数厂商用 0x02,但也有兼容性差异
  • 扇区擦除命令:华邦是 0x20,Micron 的 N25Q 系列也是 0x20,但部分老型号不同
  • 状态寄存器读法:读状态寄存器 0x05 基本一致,但写状态寄存器 0x01 的行为有差别
  • 快速读命令和 Dummy Cycle:华邦 W25Q128JV 的 0xEB 四线快速读和部分其他厂商不兼容

Vivado 根据你选择的型号把整套编程时序下发到 FTDI/JTAG 设备上。如果你开的命令和 Flash 实际支持的指令不匹配,最常见的表现就是擦除能进行一部分,编程卡死,或者校验时读出来的全是 0xFF。

这也是为什么标题要强调“手动添加”而不是“随便替代”。手动添加的本质,是把一个列表里没有的精确型号映射到一个命令集完全兼容的已知型号上,而不是乱抓一个同容量 Flash 顶上去。

2. 动手添加之前,先把 Flash 控制器和启动链路对齐

很多人一上来就打开 Hardware Manager 找 Add Configuration Memory Device,结果添加完也烧不进去。我这次的经验是:添加 Flash 器件之前,得先在工程里把 SPI 配置链路摸清楚,否则后面每一步都可能踩雷。

2.1 先检查板级连接:WP#、HOLD#、CS 这三根线最容易出问题

SPI Flash 焊接没问题,但烧录总失败,先量这三根信号:

  • CS#(片选):连接 FPGA 的 CSO_B 或专用配置引脚,低有效
  • WP#(写保护):不能悬空,必须上拉到 VCC
  • HOLD#(保持):不能悬空,必须上拉到 VCC,否则在数据时序里偶发进入 hold 状态
  • VCC 去耦电容:Flash 电源引脚旁边最好有 100nF 电容,板上如果省略了,高频编程时容易供电抖动

我在调试中遇到过 HOLD# 引脚默认没接上拉的设计,烧录时偶发成功偶发失败。用手按一下 Flash 芯片附近,操作就成功,松手就失败,查了半天才定位到 HOLD# 悬浮的问题。

2.2 工程里要用对 SPI 时钟路径

如果你用的是 Artix-7 或者 Spartan-7 这类 FPGA,想让 FPGA 上电后主动从 SPI Flash 加载配置,必须把 SPI 时钟接到 FPGA 的 CCLK 或 STARTUPE2/STARTUPE3 原语上。

很多工程师在做设备内 SPI 读写时,把这根时钟线接到了普通 IO 上。用户逻辑访问 Flash 没问题,但上电配置阶段 FPGA 还没加载逻辑,根本没法驱动普通 IO,于是固化后板卡一直起不来。正确做法是顶层例化 STARTUPE2 原语,把用户 SPI 时钟通过原语的 CCLK 输出引脚送到 Flash。

比如 Artix-7 里通常写成:

STARTUPE2 #( .PROG_USR("FALSE"), .SIM_CCLK_FREQ(0.0) ) startupe2_inst ( .CFGCLK(), .CFGMCLK(), .EOS(), .PREQ(), .CLK(0), .GSR(0), .GTS(0), .KEYCLEARB(0), .PACK(1), .USRCCLKO(spi_clk), .USRCCLKTS(0), .USRDONEO(1), .USRDONETS(1) );

这个细节如果没处理好,就算 Flash 型号添加成功,烧录时也可能出现 “Configuration failed” 之类的问题,因为时钟根本没到 Flash。

2.3 准备好 .bit 和 .bin 两份文件

添加 Flash 之前先把要烧的固件准备好。Vivado 里生成 bitstream 后,还需要转换成 Flash 可以加载的格式。

最直接的方法是在 Vivado 的 Settings -> Bitstream -> Configure additional bitstream settings 里勾选 bin_file,这样每次生成比特流时自动输出 .bin。也可以用 Tcl 命令手动生成:

write_cfgmem -format bin -interface spix4 -size 128 -loadbit "0x0 ./top.bit" ./top.bin

这里要注意-size 128表示 128 Mbit,和 W25Q128JVEIQ 的容量对应。如果写错成 256,Vivado 会生成超过 Flash 容量范围的地址内容,烧录时可能直接报错。

3. 手动添加 W25Q128JVEIQ 到 Vivado 2020.2 的完整流程

这部分是文章的核心。以下流程在 Vivado 2020.2 上实测,其他版本逻辑类似,菜单名称可能略有差异。

3.1 打开 Hardware Manager 并识别 JTAG 链路

  1. 用 JTAG 线连接 PC 和板卡,给板卡上电
  2. 在 Vivado 左侧 Flow Navigator 底部找到 Hardware Manager,点击 Open Target -> Open New Target
  3. 选择 Local Server,选中 JTAG 设备,Vivado 会自动识别 FPGA 芯片型号

如果这一步识别不到 FPGA,先不要继续往下做。常见原因是 JTAG 线驱动问题、板卡电源没给到,或者 FPGA 的 JTAG 引脚被占用。

识别成功后,Vivado 的 Hardware 窗口里会列出 FPGA 器件。这里要稍微注意,Hardware Manager 显示的是 FPGA 型号,不是 Flash 型号。Flash 是挂在配置链路里的外围器件,需要你自己添加。

3.2 在 Add Configuration Memory Device 里手动选择

在 Hardware 窗口右键点击 FPGA 器件,选择 Add Configuration Memory Device。

弹出来的对话框里有一个搜索框和列表。默认情况下很多型号不会显示全,直接输入关键词最快。

  • 搜索w25q128j,如果看到w25q128jv,这就是可选项
  • 如果列表里没有精确的W25Q128JVEIQ,选择w25q128jv或w25q128jvfm都行
  • 关键是确认容量是 128Mb,接口类型是 SPI/QSPI

选中后点击 OK,Vivado 会在 Hardware 窗口自动创建一个 Configuration Memory Device 节点,并在 Tcl Console 打印类似下面的内容:

create_hw_cfgmem -hw_device [current_hw_device] -c [current_hw_cfgmem] -size 128Mb -interface spix1

如果此时 Tcl Console 报错,说找不到器件,最可能是因为你搜索的型号超出了 Vivado 内置数据库覆盖范围。这种情况可以试试在搜索框里输入w25q,然后再手动检查是否有同系列型号。华邦的 W25Q 系列在 Vivado 的覆盖度挺高,w25q128jv大概率能搜到。

确认添加成功后,右键新出现的 cfgmem 节点,选择 Program Configuration Memory Device 之前,先把后续选项看清楚。

3.3 如果列表里真的没有怎么办

有一种极端情况:你用的 Vivado 版本较老,或者 Flash 型号确实非常冷门,列表里怎么都找不到。这时有两条路。

第一条路是选用同厂商、同容量、同系列的相近型号。只要 JEDEC ID 一致、命令集一致,就可以正常烧录。以 W25Q128JVEIQ 为例,选择 W25Q128JV 系列里任意一个 128Mb 型号基本都能工作。

第二条路是手动修改 Vivado 安装目录下的器件数据库文件。这个操作不推荐新手做,因为容易破坏工具环境。如果你必须做,建议先备份。在 Vivado 安装目录的data/xicom/子目录下,可以找到关于配置存储器件的描述文件,用 VSCode 或任意文本编辑器打开,参照现有 W25Q128JV 条目的格式,新增一个 W25Q128JVEIQ 的映射项。注意保留 XML 格式完整,改完后重启 Vivado 再试。

我个人的建议是优先走第一条路。用相近型号代替在工程实践中非常常见,Xilinx 本身的 Flash 列表也不可能覆盖所有市面封装后缀。

4. W25Q128JVEIQ 参数逐项拆解:这些数字到底代表什么

既然标题写了 SPI Flash 参数详解,那这块必须展开讲清楚。很多人添加完 Flash 型号后,看着 Hardware Manager 里的一堆选项发懵,不知道哪些参数需要关心。

4.1 容量单位换算和页、扇区、块的关系

W25Q128JVEIQ 的容量是 128 Mbit,换算成字节:

128 Mbit / 8 = 16 MB = 16384 KB

SPI NOR Flash 的组织结构从上到下是:

  • Page(页):256 字节,写入的最小单位
  • Sector(扇区):4 KB,通常由 16 个页组成,擦除的最小单位之一
  • Block(块):64 KB,由 16 个扇区组成,是另一种擦除粒度

这个多层结构在实际烧录时非常重要,因为 SPI NOR Flash 的物理特性决定了你不能像写 RAM 一样覆盖写。写之前必须先擦除,而擦除的最小粒度是扇区。

如果你在代码里要更新一个 1 KB 的配置区域,必须把这个区域所在的整个 4 KB 扇区读出来,在内存里修改,然后整片擦除,再写回去。FPGA 配置烧录工具也是同理,Vivado 会根据 bin 文件大小决定用扇区擦除还是块擦除。

4.2 关键命令集和 JEDEC ID

W25Q128JV 系列常用的命令:

命令操作码说明
Read Data0x03标准单线读,速度较慢
Fast Read0x0B单线读,带一个 Dummy Cycle
Quad Output Fast Read0x6B单线地址,四线数据输出
Quad I/O Fast Read0xEB四线地址,四线数据输出,速度最快
Page Program0x02页编程,最大 256 字节
Sector Erase0x204 KB 扇区擦除
Block Erase0x52 / 0xD832 KB / 64 KB 块擦除
Chip Erase0xC7全片擦除
Write Enable0x06写使能,编程擦除前必发
Read Status Register0x05读取状态寄存器
Read JEDEC ID0x9F返回 3 字节厂商和设备 ID

W25Q128JVEIQ 的 JEDEC ID 是 0xEF 0x40 0x18。其中 0xEF 是华邦的厂商 ID,0x40 表示 SPI NOR,0x18 表示容量和设备代次。

调试时可以先在用户逻辑里发 0x9F 命令读这 3 个字节。如果读回来不是 EF 40 18,说明 Flash 焊接有问题,或者你手里那颗芯片不是 W25Q128JVEIQ,而是翻新料、假料,这种情况在市场上并不少见。

4.3 Dummy Cycle 和四线模式的匹配问题

SPI Flash 快速读命令后面通常会跟 Dummy Cycle,也就是“空时钟周期”,用来给 Flash 内部准备数据的时间。不同厂商、不同频率下需要的 Dummy Cycle 不一样。

W25Q128JV 系列的 Quad I/O Fast Read(0xEB)在标准配置下通常使用 6 个或 8 个 Dummy Cycle,具体由状态寄存器里的参数决定。Vivado 烧录时,如果选择的 Flash 型号命令集和你板上实际芯片不一致,最容易出现的问题就是校验时读出来的数据错位。

这个错位不是完全读不出数据,而是每个字节都偏移了几个时钟周期,看起来像整片内容都乱了。很多人遇到这种情况会以为是 .bin 文件生成错了,白折腾半天。

所以选 Flash 型号时一定要确保命令集兼容,这也是我前文强调不要跨厂商选型号的原因。同系列同容量型号之间的区别只在封装和温度等级,命令集反而最可靠。

4.4 四线 QSPI 模式和电源电压

W25Q128JVEIQ 支持标准 SPI、双线 DIO、四线 QIO 多种模式。Vivado 里选择接口类型时,常见的有 spix1、spix2、spix4 几种。

spix1 最兼容,任何 JTAG 线都能驱动,但烧录速度慢。spix4 要求板级连接完整,四根数据线都引到 FPGA 配置引脚,如果 PCB 设计时只连了单线,强行用 spix4 会导致校验失败。

供电方面,W25Q128JVEIQ 是 3.3V 器件,正常工作电压范围在 2.7V 到 3.6V。FPGA 侧配置引脚的 IO 电压必须和 Flash 供电电压匹配,不能一边 3.3V 一边 1.8V 还指望通信稳定。

5. 烧录、校验和上电自举的完整过程

Flash 型号添加好,bin 文件准备好,下面就是实际烧录环节。这一步也会遇到不少问题。

5.1 Program Configuration Memory Device 的关键选项

在 Hardware 窗口右键点击 FPGA 器件,选择 Program Configuration Memory Device。弹窗里会让你选择 Configuration Memory Device,此时应显示你刚添加的 W25Q128JVEIQ 或对应的兼容型号。

接着设置:

  • Address Range:从 0x0 开始即可
  • Configuration File:选择之前生成的 .bin 文件
  • Erase Before Programming:勾选
  • Verify After Programming:勾选
  • Checksum:可以勾选,用来和文件做完整性比对

勾选 Erase Before Programming 之后,Vivado 会先把整片 Flash 擦除,然后写入数据,最后读回校验。速度会慢一些,但值得等。我见过有人为了赶时间取消擦除,结果 Flash 里残留的旧数据导致配置异常,排查起来更浪费时间。

5.2 烧录过程中的常见报错和处理

烧录是个“擦除 + 写入 + 校验”三步走的过程。如果中途报错,先判断是在哪一步。

  • 擦除阶段报错:多半是 Flash 命令集不匹配,或者 HOLD#/WP# 引脚电平异常
  • 写入阶段卡住:检查 JTAG 链路稳定性,降低 JTAG 频率试试
  • 校验阶段报错:优先怀疑 Flash 实际型号和选择型号不一致,或者 Dummy Cycle 设置不匹配

如果用的是 USB-JTAG 线,在 Hardware Manager 的设置里可以把 JTAG 频率调低到 5 MHz 或更低。很多高速下载器在 30 MHz 下能连上 FPGA,但连 Flash 编程时序就会出错。

另外,板卡上电顺序也有影响。Flash 编程时 FPGA 不能同时在主动加载配置,两者会争抢 SPI 总线。有些板卡的配置模式由拨码开关控制,烧录前要把启动模式切到 JTAG 模式,避免 FPGA 上电后试图从 Flash 启动。

5.3 断电重启验证:不是烧进去就结束了

烧录成功只是第一步,真正的考验是断电重启。

操作方式是:先关闭 Hardware Manager 的连接,让 JTAG 线从板卡上断开,然后给板卡断电,把启动模式拨码切到 SPI/QSPI 启动,重新上电。

如果配置成功,FPGA 的 DONE 信号会被拉高。板子上如果有 DONE 指示灯,可以直接看到。没有指示灯的话,可以在用户逻辑里放一个简单的计数翻转信号接到 LED 上,或者用串口打印一个固定字符,只要能证明用户逻辑跑起来了就算配置成功。

我这次烧完第一次上电,LED 没亮,以为是 Flash 型号选错了。排查后发现问题并不在 Flash,而是启动模式拨码开关处于 JTAG 模式,FPGA 根本没去读 Flash。把拨码切过去,重新上电,一切正常。这个低级错误值得提前提醒。

6. 一次调板记录:仿真正常、Implement Design 却变红的连锁排查

最后再分享一个实际调板过程中非常典型的排查经历,里面包含一些热搜里常出现的问题关键词,比如“Implement Design 变红”“生成比特流失败”。这些现象看起来和 Flash 无关,但在固化项目里往往是一连串问题的开头。

6.1 Implement Design 变红不一定是时序问题

我遇到过工程之前跑得好好的,某次改了 Flash 相关的约束之后,重新跑综合实现,结果 Implement Design 直接变红。当时第一反应是时序违例,打开 report_timing_summary 看了看,WNS 明明还是正的。

真正的原因是在工程目录里动了一些文件后,Vivado 的运行缓存出现了问题。具体表现是日志停在某一步,然后报无法写入运行目录的错。处理办法比较粗暴但有效:关掉 Vivado,把工程下的top.runs目录重命名备份,重新打开工程,再跑一次实现。

如果重新跑还是红,建议检查工程路径。Vivado 工程路径不要放在网盘同步目录、云盘目录,或者权限受限的系统目录下。2019.1 之后的版本对运行目录的写权限要求比较高,路径里有中文或空格也可能引起奇怪的问题。

6.2 仿真能过、烧录失败:检查是不是把配置专用引脚当普通逻辑用了

这次问题更隐蔽。在仿真环境里,SPI 接口连接外部 Flash 模型,读写一切正常。但烧录到实际板卡后,逻辑能跑,板卡配置始终不稳定。

排查后确认,问题是 SPI 时钟没有接到 STARTUPE2 的专用 CCLK 路径,而是接了普通 IO。仿真器不关心这个区别,用户的 Flash 读写模型也没法体现物理引脚差异,所以仿真永远正常,实际硬件就是不行。

这也提醒我一个原则:涉及配置功能的外设,不能只看功能仿真,必须去核对底层物理实现。

6.3 固化后完全没反应:优先查启动模式、DONE 和 Flash 电源域

如果你的工程里用了 W25Q128JVEIQ 做配置存储,烧录成功但上电后 FPGA 没有任何反应,按以下顺序排查:

  1. 启动模式引脚是否切到了 SPI/QSPI 模式
  2. DONE 引脚是否有信号,有没有被外部强拉低或者接了下拉电阻
  3. Flash VCC 电压是否正常,不要用万用表量一次就完事,要用示波器看启动瞬间的电源跌落
  4. CS# 在启动瞬间是否被 FPGA 拉低,如果一直为高,说明 FPGA 没有发起配置访问
  5. SPI 数据线是否有上下拉冲突,MISO 上加了不合适的下拉电阻也可能把数据电平拉坏

把这些都过一遍,90% 的不启动问题都能定位。

最后说一个我自己的习惯:拿到一块新板子,先别急着写业务逻辑,先做一个最小配置工程,点亮 LED,再固化到 Flash,确认整条配置链路是通的。如果后面出了问题,你至少知道板上配置链路本身没问题,可以缩小排查范围。这次 W25Q128JVEIQ 的添加过程看起来繁琐,实际上只要型号映射对了,参数理解了,整条链路跑通后,后面再换其他 SPI Flash 也只是几分钟的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询