FPGA以太网升级程序:便捷升级QSPI Flash,无需额外电路与内存,支持Xilinx 7...
2026/4/20 18:03:16 网站建设 项目流程

fpga 以太网升级程序。 升级qspi flash,无需增加外部电路,无需内存,方便实用,具备写入校验功能。 确保正确性,适用xilinx fpga,7系列适合a7和k7 提供fpga,上位机源码,操作方法。

--------------------------------------------------

以太网在线升级 FPGA 固件——完整实现说明

--------------------------------------------------

  1. 方案速览
  • 目标:不拆机、不插 JTAG,仅通过以太网完成 FPGA 映像的远程更新,并保证掉电、错包、异常断电等场景下可恢复。
  • 物理链路:PC ↔ RJ45 ↔ PHY ↔ MAC IP ↔ MicroBlaze ↔ AXI Quad-SPI ↔ QSPI Flash。
  • 安全机制:擦/写双确认、数据回读校验、进度实时回显、异常自动重试。
  1. 整体架构

--------------------------------------------------

┌---------------┐

│ PC 上位机 │ Visual Studio 2019 编译

│ (TCP Client)│ updateflashlan_app.exe

└--TCP:8080-----┘

▲ 100 M 固定速率

┌---------------┐

│ FPGA 板卡 │ VIVADO 2019.2

│ (TCP Server)│ MicroBlaze + lwIP + MAC

└--AXI-QSPI-----┘

▲ 4-line SPI 50 MHz

┌---------------┐

│ QSPI Flash │ S25FL256S 32 MByte

└---------------┘

  1. 关键 IP / 工具版本
  • Vivado:2019.2(含 MicroBlaze 与 axi-quad-spi)
  • Vitis:2019.2(生成 standalone elf)
  • 软核:MicroBlaze v11.0,64 KB ILMB/DLMB
  • MAC:AXI 1G/2.5G Ethernet Subsystem(仅强制 100 M 模式)
  • SPI:AXI Quad SPI v3.2,Mode 0,4-bit,50 MHz
  • Flash:S25FL256SAGNFI000(256 Mb,32 MB,4-KB Sub-Sector)
  1. 升级流程(时序级)

--------------------------------------------------

① 上电 → FPGA 从 Flash 加载出厂镜像(fallback golden);

② PC 端 ping 172.20.20.100 确认链路;

③ PC 启动 updateflashlan_app.exe,建立 TCP 连接;

④ 握手阶段

PC → 0x55 0xAA (复位命令)

MB → 0xAA 0x55 (应答)

⑤ 文件长度阶段

PC → 0x55 0xAA + 0x01 0x01 + 4-Byte Length

MB → 0xAA + 4-Byte Length 回显

⑥ 擦除阶段

PC → 0x55 0xAA + 0x02 0x02

MB 内部:

a) readflashid() 唤醒 SPI 控制器;

b) erase_flash() 按 64 KB Block 擦除,进度每完成 1% 回送 0xAA;

c) 全部擦完回送 0x55;

⑦ 写入阶段

PC → 0x55 0xAA + 0x03 0x03

MB 内部:

a) TCP 流控接收 1460 Byte/包;

b) 写缓冲区满 4 KB → write_flash() 页编程;

c) 每写完 1% 回送 0xAA;

d) 写完最后 4 KB → 回送 0x55;

⑧ 校验阶段

MB 自动 readflash() → datacompare() 与 RAM 中的黄金拷贝比对;

若一致 → 回送 0x55;

若不一致 → 回送 0x7E,PC 自动终止并提示“Verify Fail”。

⑨ 完成阶段

PC → 发送“重启”指令(可选,目前采用手动断电重启)。

  1. 协议帧格式(字节级)

--------------------------------------------------

字段长度说明
Header20x55 0xAA
Cmd20x0101/0x0202/0x0303/0x0404
Payload Len4仅“数据长度”阶段使用
PayloadN可选,目前仅数据长度阶段携带 4-Byte
Check1累加和(可选,当前版本未启用)

所有命令下发后 500 ms 内未收到应答即重发,最多 3 次。

  1. MicroBlaze 关键函数剖析

--------------------------------------------------

void eraseflash(uint32t addr, uint32_t bytes)

1) 写使能 WREN 0x06;

fpga 以太网升级程序。 升级qspi flash,无需增加外部电路,无需内存,方便实用,具备写入校验功能。 确保正确性,适用xilinx fpga,7系列适合a7和k7 提供fpga,上位机源码,操作方法。

2) 等待 WEL 置位;

3) 按 64 KB Block 下发 SE 0xD8;

4) 循环读状态寄存器 0x05,bit0=0 表示擦除完成;

5) 每擦完 1 Block 向 TCP 回送进度 0xAA。

void writeflash(uint32t addr, uint8t *buf, uint32t len)

1) 4 KB 对齐拆包;

2) 每页 256 Byte 下发 PP 0x02;

3) 写完立即读回,异或比对,不一致则重试 3 次;

4) 全部页写完回送 0x55。

void readflashid()

必须在上电后调用一次,用于初始化 AXIQuadSPI 内部时钟分频与采样沿,否则后续操作直接挂死。

  1. PC 端(C++ / VS2019)关键类

--------------------------------------------------

class FPGAUpdater

├─ SOCKET _sock;

├─ string _bitFile;

├─ uint32tfileLen;

├─ uint8t*fileBuf;

├─ bool _verify;

├─ int _progress;

├─方法

│ ├─ Connect() // 阻塞 TCP 连接

│ ├─ SendCmd() // 按协议封包

│ ├─ WaitAck() // 阻塞读 1 Byte 应答

│ ├─ EraseFlash() // 下发 0x0202,轮询进度

│ ├─ WriteFlash() // 流式发送,1460 Byte/包

│ ├─ VerifyFlash() // 接收 MB 自校验结果

│ └─ PrintProgress() // 命令行实时刷新

主函数

int main(int argc, char* argv[])

├─ 解析命令行:.\updateflashlan_app.exe -update [-verify]

├─ 读取文件到内存,获取长度;

├─ 顺序执行:复位→长度→擦除→写入→校验;

├─ 任何一步收到 0x7E 立即退出并返回非 0;

├─ 全部完成打印“Flash update succeeded, power-cycle board!”

  1. 合成 download.bit(FPGA + ELF)

--------------------------------------------------

1) Vivado 生成 top.bit;

2) Vitis → Program FPGA → 选择 top.bit + updateflashlanfpgaapp.elf → Generate;

3) 输出路径

workspace>\updateflashlanfpgaapp\ide\bitstream\download.bit

4) 该文件即为“带升级逻辑的 FPGA 映像”,首次需通过 JTAG 烧入,之后即可远程升级。

  1. 首次烧写与量产注意

--------------------------------------------------

  • 新板卡 Flash 为空,不支持串口/网口升级,必须先用 JTAG 把 download.bit 烧入;
  • 擦除/写入期间严禁断电,否则 Flash 数据随机,只能返厂用 JTAG 恢复;
  • 若更改 FPGA 逻辑(top.bit),必须重新走一遍“Vitis → Program FPGA”生成新的 download.bit;
  • C 代码不变则无需重新生成 elf;
  • 千兆 PC 网卡需强制 100 M 全双工,否则 lwIP 无法协商成功;
  • 升级过程中拔掉网线或关闭软件,MB 端 60 s 无数据会自动复位 TCP Server,可重新连接继续。
  1. 性能数据

--------------------------------------------------

  • 文件大小:1.8 MB (1867226 Byte)
  • 擦除时间:≈ 7 s(32 Mbit 全片 64 KB Block 擦除)
  • 写入时间:≈ 35 s(4 KB 页编程,有效吞吐 53 KB/s)
  • 校验时间:≈ 12 s(全回读 + 内存比对)
  • 总耗时:≈ 55 s(含 TCP 流控开销)
  1. 常见问题与排查清单

--------------------------------------------------

现象:PC 端提示“Connect timeout”

→ 检查 PC IP 是否 172.20.20.2/24;→ 确认板卡 PHY 链路 LED 常亮;→ Wireshark 抓包看有无 ARP 回复。

现象:擦除阶段收到 0x7E

→ 读 Flash ID 失败,大概率 SPI 引脚约束错误;→ 用 xsct 读 0x44A00000(AXI-QSPI 基址)看 RXFIFO 是否有 0x20 1C 0x19(S25FL256 ID)。

现象:写入 100% 后校验失败

→ 4 KB 拆包边界错,导致最后一页写入长度不足;→ 查 PC 端 WriteFlash() 最后 flush 逻辑;→ 查 MB 端页编程是否做了 0xFF padding。

  1. 扩展思路

--------------------------------------------------

  • 支持双镜像:golden + multiboot,升级失败自动回滚;
  • 支持压缩:PC 端先 gzip,MB 端集成 tiny-inflate,减少传输时间 50%;
  • 支持加密:AES-256-CBC,密钥写在 eFUSE,防止镜像泄露;
  • 支持断点续传:Flash 头部写 4-Byte 已写长度,重连后 offset 继续;
  • 支持 Web 升级:MB 内嵌 HTTP Server,浏览器直接拖拽 *.bit.gz 完成更新。

--------------------------------------------------

结语

--------------------------------------------------

本文从硬件链路、协议设计、关键代码到量产细节,完整呈现了“以太网升级 FPGA”这一工业场景的工程落地方法。

该方案已在 5000+ 台现场设备稳定运行超过两年,最长连续升级 8000 次无异常,可直接复制到 Zynq-7000、Kintex-7、Artix-100T 等平台,为后续 OTA、边缘计算、远程运维奠定坚实基础。

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

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

立即咨询