fpga 以太网升级程序。 升级qspi flash,无需增加外部电路,无需内存,方便实用,具备写入校验功能。 确保正确性,适用xilinx fpga,7系列适合a7和k7 提供fpga,上位机源码,操作方法。
一、概述
以太网升级FPGA程序方案,实现了通过PC机经串口将更新文件传输至FPGA,由FPGA内部Microblaze软核接收数据后写入QSPI Flash的核心功能,同时具备数据回读比较机制,大幅提升了烧写过程的安全性与可靠性。该方案涵盖FPGA底层逻辑设计、Microblaze软核编程、上位机控制程序开发等多个技术模块,形成了一套完整的FPGA程序远程升级解决方案,适用于需要频繁更新FPGA程序且对升级安全性有要求的工业控制、嵌入式系统等应用场景。
二、开发环境说明
本方案的开发工具版本经过严格适配,确保各模块间的兼容性,具体版本如下:
- FPGA开发工具:VIVADO 2019.2,用于FPGA底层逻辑搭建、IP核配置及top.bit文件生成;
- 上位机开发工具:Visual Studio 2019,用于编写PC机控制程序,实现文件读取、命令下发及升级流程管控;
- Microblaze开发工具:Vitis IDE 2019.2,用于Microblaze软核应用程序开发,生成elf文件,实现与QSPI Flash、以太网IP核的交互。
三、核心代码模块功能解析
(一)FPGA代码模块
FPGA代码的核心是搭建基于Microblaze的软核ARM系统,并通过axiquadspi核实现与QSPI Flash的读写控制。axiquadspi核作为FPGA与QSPI Flash之间的通信桥梁,提供了标准的SPI接口时序,支持对QSPI Flash的高速读写操作。通过VIVADO工具进行IP核配置,将axiquadspi核与Microblaze软核通过AXI总线互联,使Microblaze能够通过总线指令控制QSPI Flash的擦除、写入、读取等操作,为后续程序升级奠定硬件基础。
(二)Microblaze代码模块
Microblaze代码是整个升级方案的核心控制单元,主要负责axiquadspi核操作、以太网MAC通讯及与PC机的指令交互,具体功能函数如下:
1. axi_quad_spi IP核操作函数
- erase_flash()函数:实现QSPI Flash的格式化功能,在写入新程序前清除指定存储区域的数据,避免旧数据干扰;
- write_flash()函数:接收PC机传输的程序数据,按照QSPI Flash的写入时序,将数据逐字节或按块写入Flash存储单元;
- read_flash()函数:从QSPI Flash指定地址读取数据,用于数据回读比较及程序验证;
- readflashid()函数:读取QSPI Flash的设备ID,用于识别Flash芯片型号,确保与预设的芯片配置匹配,同时该函数必须调用1次,以启动axiquadspi IP核;
- data_compare()函数:将写入Flash的数据与PC机下发的原始数据进行逐字节比对,验证数据写入的准确性,若比对不一致则反馈校验错误信息,提升烧写安全性。
2. 以太网IP核操作函数
- eer_common()函数:当接收到PC机的错误命令或执行过程中出现异常时,向PC机反馈错误信息,便于上位机定位问题;
- complete_common()函数:在完成Flash擦除、写入等关键操作后,向PC机发送操作完成指令,告知上位机进入下一流程;
- true_common()函数:当数据接收正确、指令执行无误时,向PC机发送数据正确确认信号,确保通信链路的可靠性。
(三)PC机代码模块
PC机代码主要实现程序文件的读取、升级流程控制及与Microblaze的指令交互,是升级操作的发起端和控制中心,核心函数如下:
- hardwareresetcommand()函数:向Microblaze发送复位命令,触发FPGA内部寄存器初始化,为升级操作做准备;
- erase_command()函数:向Microblaze下发Flash擦除命令,启动Flash格式化流程;
- readbinto_buffer()函数:读取待升级的bin格式程序文件到PC机内存,并获取文件长度信息,为后续数据传输和长度校验提供依据;
- write_command()函数:向Microblaze发送Flash写命令,控制程序数据的传输与写入过程;
- lan_loop()函数:负责以太网通信的循环处理,包括指令发送、响应接收、数据传输等,确保PC机与FPGA之间的通信稳定。
四、PC机与Microblaze通讯协议详解
PC机与Microblaze之间通过约定的串口指令协议进行通信,协议涵盖复位、数据长度确认、Flash擦除、数据写入等全流程指令,确保升级操作的有序执行,具体指令规范如下:
(一)通讯流程
- PC机运行updateflashlan_app.exe程序,首先发送复位命令;
- Microblaze接收复位命令后初始化内部寄存器,反馈复位完成或错误信号;
- PC机读取待升级文件到内存并获取文件长度,发送数据长度命令;
- Microblaze接收数据长度后反馈确认信息,若长度异常则反馈错误;
- PC机发送Flash擦除命令,Microblaze执行擦除操作并实时反馈进度,擦除完成后发送完成信号;
- PC机收到擦除完成信号后,发送Flash写命令,开始传输程序数据;
- Microblaze接收数据并写入Flash,反馈写入进度,写入完成后进行数据校验;
- 校验完成后,Microblaze向PC机反馈校验结果,整个升级流程结束。
(二)指令格式说明
| 序号 | PC机命令 | PC机命令代码(字节) | Microblaze命令 | Microblaze命令代码(字节) | 备注 |
|---|---|---|---|---|---|
| 1 | 复位 | 0x55,0xaa,0xaa,0x55,0x55,0xaa,0xaa,0x55,0x55,0xaa,0xaa,0x55 | - | - | 共12字节,用于触发FPGA复位 |
| 2 | - | - | 复位完成 | 0xaa | 1字节,确认复位成功 |
| 3 | - | - | 复位错误 | 0x7e | 1字节,提示复位失败 |
| 4 | 数据长度 | 0x55,0xaa,0xaa,0x55,0x01,0x01,Xx,xx,xx | - | - | 共9字节,后3字节为文件长度数据 |
| 5 | - | - | 数据长度反馈 | 0xaa,Xx,xx,xx | 4字节,0xaa为确认位,后3字节为接收的长度数据 |
| 6 | - | - | 数据长度错误 | 0x7e | 1字节,提示长度接收异常 |
| 7 | 擦除 | 0x55,0xaa,0xaa,0x55,0x02,0x02 | - | - | 共6字节,触发Flash擦除 |
| 8 | - | - | 擦除反馈进度 | 0xaa | 1字节,实时反馈擦除进度(多次发送) |
| 9 | - | - | 擦除反馈完成 | 0x55 | 1字节,确认擦除完成 |
| 10 | - | - | 擦除反馈错误 | 0x7e | 1字节,提示擦除失败 |
| 11 | 写数据 | 0x55,0xaa,0xaa,0x55,0x03,0x03 | - | - | 共6字节,启动数据写入 |
| 12 | 写完成 | 0x55,0xaa,0xaa,0x55,0x04,0x04 | - | - | 共6字节,告知数据传输完毕 |
| 13 | - | - | 写反馈进度 | 0xaa | 1字节,实时反馈写入进度(多次发送) |
| 14 | - | - | 校验错误反馈 | 0x7e | 1字节,提示数据写入与原始数据不一致 |
五、关键文件生成与烧写流程
(一)download.bit文件生成
download.bit文件是FPGA可直接执行的程序文件,由FPGA生成的top.bit文件与Microblaze生成的updateflashlanfpgaapp.elf文件合成,生成步骤如下:
- 打开Vitis IDE软件,在菜单栏中选择“Xilinx”->“Program FPGA”;
- 在弹出的配置窗口中,项目选择updateflashlanfpgaapp,连接方式设为Local;
- 自动载入Bitstream文件(路径:ide/bitstream/top.bit)和BMM/MMI文件(ide/bitstream/top.mmi);
- 在Software Configuration中,手动选择Microblaze0处理器对应的ELF文件(debug/updateflashlanfpgaapp.elf);
- 取消“Skip Revision Check”选项,点击“Generate”生成download.bit文件,生成后的文件路径为:\sdk\updateflashlanfpgaapp\_ide\bitstream。
(二)以太网烧写download.bit文件
- 准备工作:将生成的download.bit文件拷贝至updateflashlanapp\x64\Release目录下,该目录需包含updateflashlanapp.exe(上位机执行程序)和updateflashlan_app.pdb(调试文件);
- 网络配置:确保PC机IP地址设置为172.20.20.2,板卡IP地址为172.20.20.100,且PC机网络速率调整为100M(仅支持100M以太网);
- 连接测试:在PC机命令行中执行“ping 172.20.20.100 -t”,确认PC机与板卡网络连通,连通后停止ping命令;
- 启动烧写:进入updateflashlanapp\x64\Release目录,执行命令“.\updateflashlanapp.exe”,启动烧写流程;
- 烧写过程:程序会自动执行硬件复位、Flash擦除、数据写入、数据校验等操作,过程中会打印各步骤状态(如“hardware_reset completed”“Flash erase completed”等);
- 完成重启:烧写完成后,断电重启板卡,新程序即可生效。
(三)板卡第一次烧写方法
新生产的板卡内部未固化任何程序,不支持以太网升级,需通过仿真器烧写初始程序,步骤如下:
- 按照“download.bit文件生成”步骤获取合成后的download.bit文件;
- 打开Vitis IDE,选择“Xilinx”->“Program Flash”;
- 配置项目、连接方式和设备(自动检测),在Image File中选择download.bit文件;
- Flash Type选择板卡对应的硬件Flash芯片型号(如mt25ql128-spi-x1x2x4);
- 勾选“Verify after flash”(烧写后验证)和“Blank check after erase”(擦除后空白检查),点击“Program”开始烧写;
- 烧写过程中板卡不可断电,若意外断电,需重新通过仿真器烧写。
六、Vitis环境搭建及ELF文件生成
(一)环境搭建步骤
- 在FPGA工程目录下新建SDK文件夹,将VIVADO生成的top.bit(FPGA逻辑文件)和top.xsa(硬件描述文件)拷贝至该文件夹;
- 启动Vitis IDE,工作空间选择SDK文件夹路径;
- 点击“Create Platform Project”创建平台工程,导入硬件参数文件(top.xsa);
- 平台工程创建完成后,点击“Create Application Project”创建应用工程,选择“Empty Application”(空工程);
- 将Microblaze相关C代码(main.c、platform.c、qspi.h等)拷贝至\updateflashlanfpga\sdk\updateflashlanfpga_app\src目录下。
(二)ELF文件生成
在Vitis IDE中,右键点击应用工程updateflashlanfpgaapp,选择“Build Project”,工具会自动编译源码并生成ELF文件,生成的ELF文件位于debug或release目录下,用于后续download.bit文件的合成。
七、注意事项与异常处理
- 环境兼容性:所有开发工具必须使用指定版本(VIVADO 2019.2、Visual Studio 2019、Vitis IDE 2019.2),避免版本不兼容导致的编译或烧写失败;
- 烧写安全:烧写过程中(尤其是第一次仿真器烧写),板卡严禁断电,否则可能导致Flash芯片损坏或程序固化失败,若断电需重新通过仿真器烧写;
- 代码更新:每次修改FPGA代码逻辑后,需重新搭建Vitis环境并生成ELF文件(C代码无需修改),再按照download.bit文件生成步骤重新合成,建议FPGA调试稳定后再进行合成操作,节省开发时间;
- 网络要求:仅支持100M以太网,PC机需手动将网络速率调整为100M,否则会导致网络通信失败;
- 异常处理:烧写过程中若出现网线脱落、上位机软件关闭等异常,需等待1分钟后再重新执行烧写操作,避免Flash芯片处于异常状态;
- 指令调用:readflashid()函数必须调用1次,否则axiquadspi IP核无法启动,导致Flash读写操作失败。
八、参考资料
- axiquadspi IP核使用手册:pg153-axi-quad-spi.pdf;
- QSPI Flash芯片手册:S25FL256SAGNFI000.pdf;
- Vitis IDE开发指南:Xilinx官方Vitis IDE用户手册;
- Vivado FPGA开发手册:Xilinx官方Vivado工具使用指南。
通过以上模块的协同工作,该以太网升级FPGA程序方案实现了高效、安全、可靠的远程升级功能,适用于各类需要灵活更新FPGA程序的嵌入式系统场景,降低了现场升级的难度和成本,提升了产品的可维护性。
fpga 以太网升级程序。 升级qspi flash,无需增加外部电路,无需内存,方便实用,具备写入校验功能。 确保正确性,适用xilinx fpga,7系列适合a7和k7 提供fpga,上位机源码,操作方法。