最近研究了一下 FPGA 远程升级固件的功能,查阅官方相关文档和例程,实现起来还比较简单,这里就简单总结一下。
一、FPGA 远程升级固件的结构设计
先看一下官方给出的 FPGA 远程升级固件的流程(参考资料 1):

该流程还是比较清晰的,FPGA 获取到升级数据后,通过 RSU Control Module 控制 RSU 和 FLASH Controller 来完成 EPCS 的升级和重新配置。根据这个流程可以确定 FPGA 远程升级固件的结构,如下图所示。

注:FPGA 可以直接获取升级数据,也可以通过 MCU。只不过尚为网这里采用的平台是后者的架构。
根据上图可以看出,当需要对用户程序升级时,PC 通过串口或网络将数据传输给 MCU,MCU 再将数据通过串口传给 FPGA,FPGA 接收到数据后存入异步 FIFO 中,ASMI 控制器则读取异步 FIFO 中的数据,并通过 ASMI IP 写入 EPCS FLASH 中。当需要读取 EPCS FLASH 中的数据时,过程是相反的。
FPGA 远程升级固件,主要采用了 EPCS 相关的两个 IP 核 ASMI 和 RMU。ASMI 实现 EPCS FLASH 芯片的读写和擦除,以及一些状态的输出;RMU 主要完成 bootloader 工作。这两个 IP 的介绍可以查看官方手册。
二、FPGA 远程升级固件的实现
按照上述结构配合状态机读写 IP 核,实现对 EPCS 的读写和 bootloader 功能,下面就记录一些调试要点。
2.1 读取 EPCS 中的数据
先通过 Quartus II 烧写工具,先将任意一个.jic 文件烧写进 EPCS 中,重新上下电后,把远程升级固件工程下生成的.sof 文件下载到 FPGA 中,通过串口读取到的数据和.jic 文件中的数据作以对比,如下图所示。

根据上图可以看出,烧写文件.jic 的头部有一段数据,应该是 Quartus II 工具的识别码,之后就是烧写进 EPCS 的数据,最后是大量的 FF 填充数据。
通过对比发现,读 EPCS 功能正常,接下来看写 EPCS 功能。
2.2 烧写升级数据至 EPCS
先通过串口助手发送数据更新 EPCS,之后再读取 EPCS,对比写入和读取的数据,如下图所示:

说明 EPCS 读写功能正常。
2.3 Bootloader 的实现
Bootloader 可以指定应用程序的启动地址,这跟上面的写 EPCS 相呼应。通过修改 bootloader 的启动地址,应用程序也能正常启动。需要注意的是,如果使能了看门狗功能,则需要在应用程序中按时喂狗操作。
通过上述的描述,FPGA 远程升级固件功能正常,这里尚为网采用硬件描述语言的形式实现的,当然可以通过其他方法实现。
三、实现 FPGA 远程升级固件的其他方法
3.1 采用 NIOS II 实现 FPGA 远程升级固件
这个方案跟上面的方案基本一致,只是控制逻辑改成了 NIOS II 软核实现。
3.2 MCU 直接配置 EPCS 更新程序
网上也有这样的实现方法,参考:
3.3 MCU 通过 PS 方式配置 FPGA
PS 配置方式是 FPGA 配置方式的一种,即是通过 MCU 在上电时将配置数据写入 FPGA,再启动 FPGA,这种方式就不需要 EPCS 了。相较 EPCS 配置 FPGA 而言,PS 配置速度上会慢一些。
四、参考资料
Remote Update Intel® FPGA IP User Guide
Altera 平台远程更新中 FPGA 读写 Flash 设计的讨论
cyclone iii 器件远程升级(Remote Update)小结
扫码关注尚为网微信公众号

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/683.html