提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Xilinx FPGA对国产flash的支持很差,查询了很多方法(例如:[让vivado支持(gd/winbond/mx)原本官方不支持的FLASH烧写](https://blog.csdn.net/xsxsa/article/details/129004698)),都不能解决问题。先发现openLoader能够绕过vivado进行bit流文件的烧录,故尝试使用此方法固化程序进入国产flash,但是仍然无法识别,后来又看到可以通过ISE IMPACT绕过ID识别实现烧录。本文意在记录这两种方法


使用的芯片:FPGA:xc7k325t,flash:PY25Q128HA
下载器:High speed CableUSB Model:JTAG SMT2

一、 windows下openLoader下载

MSYS2 和 UCRT介绍

名称 含义 你要知道的
MSYS2 Windows 下的类 Linux 环境 用来运行 Unix 命令、自动安装软件
pacman MSYS2 的包管理器(相当于 Linux 下的 apt/yum) 自动安装依赖和编译好的工具
UCRT 版本 使用 Microsoft 的 UCRT(通用 C 运行库)编译的程序 更兼容现代 Windows 程序

参考链接:
https://www.cnblogs.com/quantoublog/articles/17963572

🔧 步骤一:安装 MSYS2 UCRT

  1. 打开官网:https://www.msys2.org/
  2. 下载并安装最新的 MSYS2 UCRT 版本
    例如:msys2-ucrt-x86_64-xxxxxx.exe
  3. 安装完后,打开 MSYS2 UCRT64 终端

🔧 步骤二(可选):初始化 pacman
在终端中运行以下命令更新:

pacman -Syu   # 更新系统

如果提示需要重新启动,按提示关闭终端再重开一次。
🔧 步骤三:安装 openFPGALoader
在 MSYS2 UCRT64 终端中输入:

pacman -S mingw-w64-ucrt-x86_64-openFPGALoader

🔧 步骤四:验证安装是否成功
输入:
openFPGALoader -h
出现这些代码说明安装成功:

……………………
  -D, --read-dna                Read DNA (Xilinx FPGA only)
  -X, --read-xadc               Read XADC (Xilinx FPGA only)
      --read-register arg       Read Status Register(Xilinx FPGA only)
      --user-flash arg          User flash file (Gowin LittleBee FPGA only)
  -V, --Version                 Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to <gwenhael.goavec-merou@trabucayre.com>.

🔧 步骤五:更改驱动
将下载器的驱动从默认的FTDIBUS改为WinUSB(或者libusb)在这里插入图片描述

二、检测 JTAG 下载器是否识别成功

1.在 MSYS2 终端输入:

代码如下(示例):

openFPGALoader --detect --verbose

输出:

empty
No cable or board specified: using direct ft2232 interface
unable to open ftdi device: -3 (device not found)
JTAG init failed with: unable to open ftdi device

说明没有检测到设备,我推测是我的下载器不是ft2232 的驱动。然后检查电缆

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader --list-cables
empty
cable name               vid:pid
anlogicCable             0x0547:1002
arm-usb-ocd-h            0x15ba:002b
arm-usb-tiny-h           0x15ba:002a
bus_blaster              0x0403:6010
bus_blaster_b            0x0403:6010
ch347_jtag               0x1a86:55dd
ch552_jtag               0x0403:6010
cmsisdap                 0x0d28:0204
dfu                      0x0000:0000
digilent                 0x0403:6010
digilent_ad              0x0403:6014
digilent_b               0x0403:6010
digilent_hs2             0x0403:6014
digilent_hs3             0x0403:6014
dirtyJtag                0x1209:c0ca
ecpix5-debug             0x0403:6010
efinix_jtag_ft2232       0x0403:6010
efinix_jtag_ft4232       0x0403:6011
efinix_spi_ft2232        0x0403:6010
efinix_spi_ft4232        0x0403:6011
esp32s3                  0x303a:1001
ft2232                   0x0403:6010
ft2232_b                 0x0403:6010
ft231X                   0x0403:6015
ft232                    0x0403:6014
ft232RL                  0x0403:6001
ft4232                   0x0403:6011
ft4232_b                 0x0403:6011
ft4232hp                 0x0403:6043
ft4232hp_b               0x0403:6043
gatemate_evb_jtag        0x0403:6010
gatemate_evb_spi         0x0403:6010
gatemate_pgm             0x0403:6014
gwu2x                    0x33aa:0120
jlink                    0x1366:0105
jlink_base               0x1366:0101
jtag-smt2-nc             0x0403:6014
jtrace_pro               0x1366:1020
lpc-link2                0x1fc9:0090
numato                   0x2a19:1009
numato-neso              0x2a19:1005
orbtrace                 0x1209:3443
papilio                  0x0403:6010
steppenprobe             0x0403:6010
tigard                   0x0403:6010
usb-blaster              0x09fb:6001
usb-blasterII            0x09fb:6810
xvc-client               0x0000:0000

发现我的USB ID 0403 0614是存在对应驱动的
然后直接指定检测,选一种即可

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c jtag-smt2-nc --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
JTAG init failed with: TDO is stuck at 0

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c digilent_ad --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
JTAG init failed with: TDO is stuck at 0

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c digilent_hs2 --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
JTAG init failed with: TDO is stuck at 0

意思能检测到但是TDI异常,我发现是电源没有打开。开启电源后再次运行就正常了

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c jtag-smt2-nc --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
index 0:
        idcode 0x3651093
        manufacturer xilinx
        family kintex7
        model  xc7k325t
        irlength 6

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c digilent_ad --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
index 0:
        idcode 0x3651093
        manufacturer xilinx
        family kintex7
        model  xc7k325t
        irlength 6

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c digilent_hs2 --detect
empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
index 0:
        idcode 0x3651093
        manufacturer xilinx
        family kintex7
        model  xc7k325t
        irlength 6

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$

三、OpenLoader烧录文件

首先烧录bit流文件
代码如下:

Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c jtag-smt2-nc ~/openFPGALoader/xilinx_bitfiles/MWIR640.bit

empty
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
Open file DONE
Parse file DONE
load program
Load SRAM: [==================================================] 100.00%
Done
Shift IR 35
ir: 1 isc_done 1 isc_ena 0 init 1 done 1

小技巧:可以直接拖拽文件到控制台

bit流烧录成功,然后进行bin文件烧录,但是尝试很多种方法依旧烧录不进去


Admin@DESKTOP-GT49157 UCRT64 ~/openFPGALoader/build
$ ./openFPGALoader -c jtag-smt2-nc --fpga-part xc7k325tffg900 --write-flash --offset 0x0 /e/workspace/xilinx_project/BJUT_MWIR640/MWIR640/work/vivado/MWIR640.runs/impl_1/top.bin
empty
write to flash
Jtag frequency : requested 6.00MHz    -> real 6.00MHz
Open file DONE
Parse file DONE
use: E:/software/msvs2/home/Admin/openFPGALoader/share/openFPGALoader/spiOverJtag_xc7k325tffg900.bit.gz
load program
Load SRAM: [==================================================] 100.00%
Done
Shift IR 35
ir: 1 isc_done 1 isc_ena 0 init 1 done 1
jtag_chain_len: 1
SOJ version: 1.000000
Detail:
Jedec ID          : 85
memory type       : 20
memory capacity   : 18
flash chip unknown: use basic protection detection
start addr: 00000000, end_addr: 004e0000
Erasing: [==================================================] 100.00%
Done
Writing: [==================================================] 100.00%
Done


虽然显示烧录完成,但是实际上没有烧录成功,可能还是无法识别这种flash芯片,不过若是一般的进口芯片应该能够成功。接下来我就没有进一步尝试,转而选择使用ISE IMPACT的方法。
参考教程:https://blog.csdn.net/Unibug/article/details/127689798
在进行下一步之前需要回退原先的USB驱动,因为系统会记录之前绑定过的驱动,所以只需要在设备管理器中更新驱动程序哪里找到之前的驱动就行。
在这里插入图片描述

四、ISE IMPACT烧录

1. 下载及闪退问题

官网有两种版本,一种是在虚拟机VirtualBox内运行的(14.7 Windows 10 and Windows 11),还有一种是老一点版本的(名称就是14.7),直接在Windows上运行。在虚拟机中运行的不能配置环境变量(可能有方法,但我不会),老版本的缺点可能就是兼容性不太好,在Windows10上运行有BUG。总之,选择14.7(没有后缀的版本)。
下载时我一开始只想单独下载IMPACT,但是运行时出现闪退的问题,需要使用系统模块的文件进行替换,所以还是老老实实的下载全系统版本吧。
下载教程:https://blog.csdn.net/weixin_42837669/article/details/116245434
ISE IMPACT闪退解决方法:https://blog.csdn.net/qq_25144391/article/details/90339002

2. 固化

固化教程:https://blog.csdn.net/weixin_41445387/article/details/130241849
关键是添加系统环境变量,变量名输入:XIL_IMPACT_SKIPIDCODECHECK,变量值设置为1。
然后我的flash替代选择为W25Q128BV.
在这里插入图片描述

结尾

最后使用添加环境变量+IMPACT烧录的方式实现过程flash的固化,有没有大佬知道使用OpenLoader的方法能否实现自定义flash的固化呢?

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐