FPGA远程固件在线升级

article/2025/8/29 22:27:26

FPGA远程固件在线升级

1.摘要

对最近做的FPGA远程更新/在线升级做一个总结。一般在代码开发阶段,我们使用JTAG烧写代码,但当产品投入到实际使用过程中,难以再用JTAG进行固件更新。所以需要开发远程/在线更新的功能,即使用产品自带的通讯接口(如串口,以太网接口等)传输待更新的固件包,实现固件更新升级的功能。本文所使用的平台是ALTERA公司的cyclone IV E系列产品EP4CE30F23I7,PC通过串口将待更新的固件包传发送到FPGA,FPGA将接收的固件包写入FPGA的配置 flash:EPCS16中,并以新收到的固件包覆盖原来通过JTAG烧写的代码,当芯片重新上电或者进行一次重配置,FPGA便会执行新的固件包。

2.FPGA上电加载过程

目前,大多数FPGA芯片是基于 SRAM 的结构的, 而 SRAM 单元中的数据掉电就会丢失,因此系统上电后,必须要由配置电路将正确的配置数据加载到 SRAM 中,FPGA才能正常运行。EP4CE30F23I7采用EPCS16作为配置芯片,所以我们要做的就是将要更新的固件包烧写到此EPCS16芯片中。每次芯片上电,配置电路就会加载EPCS16中的固件包,进行一次配置,FPGA还有一个重配置的ip核,也可以在FPGA运行过程中进行重配置。
  FPGA上电后会自动从0地址开始加载镜像文件(把一个FPGA工程综合生成的文件成为一个镜像文件),看别人说的rpd文件末尾至少留32个字节的FF,我认为可能是加载到32个连续的FF就会停止加载文件。
  我的思路是编写一个工程称为出厂配置工程,再编写一个工程称为应用工程,应用工程是我们正常的编写的工程,也就是我们需要更新的固件。将出厂配置工程转换成jic文件并通过JTAG烧进flash中,但是只将该文件烧写在flash的前几个扇区,具体几个扇区由你的出厂配置程序的大小来定,我自己生成的jic文件占用6个扇区,在生成Jic文件时可以选择代码在flash中的地址的,所以我的出厂配置所占的地址范围为0x0 ~ 0x5FFFF,占前6个扇区。而我编写的应用工程则放在从0x60000开始地址的地方,在线烧写镜像文件时,将需要更新的文件从0x60000地址开始写就可以了。我们在线烧写的是rpd文件,后面具体介绍这几种文件。
生成JIC文件指定地址

2.1FPGA配置方式

1.JTAG方式

通过JTAG接口,利用Quartus II软件可以直接对FPGA进行单独的硬件重新配置。Quartus II软件在编译时会自动生成用于JTAG配置的.sof文件。如果同时使用AS方式和JTAG方式来配置FPGA,JTAG配置方式拥有最高的优先级,此时AS方式将停止,而执行JTAG方式配置。

2.FPGA主动串行(AS)方式

主动串行配置方式(AS)是将配置数据事先存储在串行配置器件EPCS中,然后在系统上电时Cyclone IV FPGA通过串行接口读取配置数据(如果是压缩数据,还会进行解压缩处理)对内部的SRAM单元进行配置。因为上述配置过程中FPGA控制配置接口,因此通常称为主动配置方式。在配置期间,Cyclone IV用过串行接口来读配置数据,来对里面的SRAM编程。串行配置器件的四个接口包括,串行时钟输入DCLK,串行数据输出DATA,低有效的片选信号NCE,串行数据输入ASDI。本文就是采用这种方式。

3.FPGA被动(Passive)方式

此方法用的较少,不做介绍。

2.2配置芯片EPCS16

flash芯片列表
  如上图为EPCS系列容量表。EP4CE30F23I7采用EPCS16作为配置芯片,EPCS16共有16Mbit的存储空间被分成了32个扇区( sector),每个扇区又分成256页( page),每一页包含256字节。EPCS16各扇区的字节地址如下图所示:
对EPCS16的具体操作,在讲到ASMI IP核时再具体讲,我们利用ALTERA官方的IP核来对EPCS16进行擦除、读、写的操作。
EPCS16地址

2.3FPGA生成的几种文件

1.sof文件

sof文件是编译(分析、综合、布线、生成、时序)过程中生成的一个文件,生成的sof文件是可以直接通过JTAG口下载到FPGA的SRAM中去并直接执行。

2.jic文件

jic文件不是在编译过程中生成的,而是需要使用Quartus II软件的“Convert Programing File”功能将sof文件转换得到的。得到的jic文件,通过JTAG口可以将jic文件通过FPGA作为桥接芯片下载到配置芯片中去。

3.pof文件

pof文件和sof文件一样也是在Assemble过程中生成的,但是pof文件是不能直接下载到FPGA的SRAM中去的,而是通过ASP端口直接下载到FPGA的配置芯片中去的。配置芯片一般是串行FLASH芯片,在上电的时候FPGA会主动的从配置芯片中读取数据并烧写内部的SRAM数据然后执行程序。(在assignments – device – device and pin option, 在configuration 选项卡当中,要勾上Use Configuration device,并选择好配置芯片。 选择configuration scheme为Active Serial,编译就能生成pof文件)

4.rpd文件

rpd文件为包含cyclone系列芯片二进制位流数据和配置数据的二进制文件的合成文件。我们生成rpd文件前,先要生成Pof文件再用Quartus II软件的“Convert Programing File”功能将pof文件转换成rpd文件。

我们一般是通过JTAG将Jic文件烧进EPCS16,在线升级是将rpd文件通过串口/网口等方式烧进EPCS16,当然烧写的过程是依靠FPGA来完成,我们要写一段代码用来接收串口/网口数据,将其写入EPCS16中。jic、rpd文件生成时,都是占2M字节,但文件内实际有效的并没有那么大,其中无效的数据都由FF填满,可以手动删除,但至少保留32个字节的FF。

3.需要使用到的IP核

主要是“ASMI IP核”和“ Remote Update IP核”,还有PLL IP核。PLL不必多说。另外两个IP核配置如下图。
在这里插入图片描述
  如下面左边图所示,选择要添加的端口。注意“Single byte write”和“Page write”分别表示以“单字节”写入或“多字节”写入。EPCS16是支持多字节写入的,最多可连续写入256个字节,我这里选择的是单字节写入。“Use ‘bulk_erase’ port”和“Use ‘sector_erase’ port”分别表示是以一次性擦除所以扇区和每次只擦除一个扇区。具体内容可参照“Serial Configuration Devices(EPCS1, EPCS4, EPCS16, EPCS64,and EPCS128) Data Sheet”和“ASMI Parallel Intel® FPGA IP Core User Guide”这两个文档,在ALTERA官网可以找到,里面有具体的读,写,擦除的时序图。
ASMI IP核端口选择ASMI IP核
  REMOTE IP核配置如下图,最好将 “Enable reconfig POF checking”选上,这是该IP核的一个功能,当触发重配置,该功能会校验指定重配置地址的镜像文件是否是有效地,这一点至关重要,后面讲实现思路时再具体讲为什么一定要这个功能。
REMOTE IP核端口选择REMOTE IP核
  前面提到过ASMI IP核主要实现读写配置存储器EPCS16,这个IP核就是用来擦除,写,读EPCS16,我们通过这个ip核,不用再管对EPCS16擦除,写,读的时序,EPCS16的擦除,写,读时序也并不复杂,完全可以直接写,在EPCS16手册里有详细的时序图,但推荐使用asmi ip核,因为要使用remote update ip核的“pof_error”功能,必须要使用asmi Ip核。在“Remote Update Intel® FPGA IP User Guide”手册里有详细介绍。
  这里再简单交代一下配置remote ip 核代码的流程。
  remote ip核发起重配置需要一段代码来实现,主要内容就是指定重配置地址,然后发起重配置。

4.功能实现思路

一个完整的远程系统升级应该包括两个工程文件。一个出厂配置工程,一个应用工程。两个工程分别在EPCS16中所占的储存空间是 0x0 ~ 0x5FFFF,0x60000 ~ 0x1FFFFF。FPGA一上电,就会加载0地址处的配置文件,配置电路。这个时候FPGA跑的就是出厂配置工程。
  出厂配置工程的代码逻辑:
  1.第一步执行发起重配置,将0x60000地址后的代码配置到FPGA中。这个时候就需要用到pof_error校验的功能,在发起重配置的congfig信号发出之前,检验一下指定地址的配置文件是否完整可用。若证实可用,才发起重配置。若不可用就不发起重配置。因为如果重配置失败,这时候FPGA内部机制决定会继续发起重配置,但是配置文件是不完整的,就会一直发起在重配置,就死掉了。实测证明,只要勾选了pof_error校验的功能,不管自己是否手动判断pof_error,重配置时都会进行校验,如果重配置失败,就不会再发起重配置,当前FPGA依然是当前配置的电路,还可以正常工作,这时候就可以继续烧写新的配置文件。那么为什么第一步就要发起重配置,因为我们采用的是出厂配置工程+应用工程的结构。这样做的原因是为了应对在升级过程中发生断电,若断电,那么配置文件就会不完整,就死掉了。但采用这种方法,升级过程中,出厂配置工程始终没有被修改,因为我们升级的配置文件是从0x60000开始的,至少可以保证还可以再次升级。那么既然应用工程在0x60000地址处,而一上电配置的电路又是出厂配置文件,那么出厂配置文件里第一步就应该进行重配置。这一步重配置若成功,则FPGA里配置的电路就是我们的应用工程了。若失败,则到出厂配置工程第二步。

2.第二步接受串口/网口之类的数据,并将数据写到EPCS16里。数据烧写完成,再发起重配置,配置应用工程到FPGA里。如果这个时候配置又失败了,那么继续烧写数据到EPCS16里,直到数据烧写无误,烧写数据可以采用一些校验手段,一帧一帧的收收据,写到EPCS16里。

上面是情况是指应用工程所在地址配置文件是无效的。当应用工程本就是正常使用的,只是当前需要升级新的程序了。那么一上电,还是会先配置出厂配置工程,配置完成又配置成应用工程。最后在FPGA里跑的电路是应用工程,那么就要求在应用工程也需要有接受串口/网口数据,烧写EPCS16的功能,几乎需要将出厂配置工程里的功能都要加到应用工程里。但应用工程里不再需要重配置功能了,应用工程在没有收到更新的请求时,正常跑应用电路,在收到应用更新请求时,更新应用工程。

5.小结

本文主要描述了在线升级里用到的两个IP核和我书写该代码时的方法逻辑。至于串口/网口接收数据,接收数据过程中防止收错数据、漏收数据的校验方法,烧写擦除EPCS16,没有过多介绍。

注意

1.本文提到的两个IP 核工作频率限制在20M以内。
2.EPCS16在写之前要先擦除,否则可能写入失败。


http://chatgpt.dhexx.cn/article/aCSJaMPV.shtml

相关文章

固件在线升级流程

从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。 需要注意的是,需要额外的上位机配合。 下位机在线…

php 在线升级

php 在线升级 功能 目前已修改为通用解决方案 点击下方链接下载 此为最新优化过的版本 之后的贴图 说明 仅用来做思路参考 我就不再修改了 下面是思路解析思路一思路二升级程序服务器检测版本至此整个升级程序已经结束 感谢大家参考有任何问题都可以直接联系我咨询 一定不吝赐教…

软件在线升级系统设计

需求描述 一直用Qt开发PC版本的程序,常用的方法都是打包发布。目前开发的程序比较复杂,涉及到上百个独立的进程以及4000多个相关文件,采用原来的打包发布就变得很麻烦,第一改动比较频繁,打包次数过多;第二…

Nginx在线升级

1、查看当前nginx版本,nginx -v(小写v) 2、下载最新版本nginx包,nginx-1.23.1.tar.gz 3、解压tar -zxvf nginx-1.23.1.tar.gz 4、进入解压目录cd nginx-1.23.1.tar.gz 5、查看nginx当前配置,nginx -V注意这里是大写…

在线升级:OTA升级的原理和实现方式

目录 1、OTA 在线升级 2、实现方式 3、操作方式 3.1、后台式升级 3.2、非后台式式更新 4、STM32 的在线升级 4.1、划分 Flash 区域 4.2、实操1 - Flash空间地址的划分 4.3、实操2 - 设置工程 4.4、实操3 - 接收固件更新包 4.5、实操4 - 拷贝程序至Flash 4.6、实操5 - 跳转至 Ap…

halcon 彩色图转灰度图

read_image (Image, jiao1.bmp) //读取图像 get_image_size (Image, Width, Height) //获取宽高 dev_close_window () //关闭图形窗口 rgb1_to_gray (Image, GrayImage) //彩色图转灰度图 dev_open_window (0, 0, Width, Height, black, WindowHandle) //打开图形窗口 d…

Python中使用PIL快速实现灰度图

效果 原图 效果图 实现 新建文件夹grayImage,在此文件夹下新建gray.py from PIL import Image imgImage.open(1111.jpg) imgimg.convert(L) img.save(灰度图.jpg) 其中1111.jpg是原图,将其放在同目录下。 运行即可。 源码以及资源下载 https://do…

计算机灰度分析,计算机中的256级灰度图像

【建议1】使用GltraEdit软件观察字符“((Z20享有声望的学校联盟)”的内部代码. 以下说法正确 A. 字符“(”的内部代码占用两个字节 B. 字符“ Lian”的代码值的二进制表示形式是11010001 10101010 C. 图片中有5个ASCⅡ字符,其中字符“ 2”的代码值的十六进制表示为32 D. 字符“…

C++-灰度图上色GrayToColor

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 最近有客户提出,想要将解包裹图像转化为有颜色的图像,具备更佳的视觉效果。解包裹图是一个floa…

灰度图与二值化

图像处理的灰度化和二值化 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的…

opencv学习5:cvtColor RGB图像转灰度图像原理

简介 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、…

Matplotlib显示灰度图

引言 matplotlib中的imshow()函数不能自动显示灰度图像,这一点应该是众所周知的,需要调用cmap“gray"以进行设置,但是cmap"gray"实际上并不是如opencv中的imshow函数一样将单通道图显示为灰度图,私以为是引入了灰度…

python显示灰度图像,Python读取图像并显示灰度图的实现

python读取图像 原图: import cv2 # 利用opencv读取图像 import numpy as np # 利用matplotlib显示图像 import matplotlib.pyplot as plt img cv2.imread("./lena.png") #读取图像 # 显示图像 plt.imshow(img) plt.axis(off) plt.show() 效果: 问&#…

OpenCV灰度图

什么是灰度图&#xff1a; 百度百科 什么是灰度图 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc, char** argv) {Mat src Mat(4,4,CV_8UC3,Scalar(28,128,228));cout << src << en…

RGB图像转化为灰度图原理

RGB图像转化为灰度图原理 1 原理 利用MATLAB对RGB图像进行读取&#xff1a; imgimread(蒙娜丽莎.jpg);可以知道存储RGB图像数据为 256 256 3 u i n t 8 256\times256 \times3\quad uint8 2562563uint8&#xff0c;其中 256 256 256\times256 256256表示长和宽的像素个数&…

彩色图像转换灰度图像

数字图像 现在我们所接触到的图像绝大多数都是数字图像&#xff0c;图像数字化后&#xff0c;每个像素点就可以看作是一个小方格&#xff0c;每个小方格里面存储的就是图像的像素信息。如果把一副数字图像抽象出来&#xff0c;就是一个二维矩阵&#xff08;灰度图&#xff09;或…

Python灰度图像彩色化

1️⃣作业要求 给定一幅灰度图像&#xff0c;使用任意方法将其变成一幅彩色图像&#xff0c;并尽量使得添加的色彩显得较为真实。 2️⃣核心代码 这里我们是直接调用了eccv16和siggraph17的模型&#xff0c;运行程序时会自动下载这两个model文件&#xff0c;然后经过对图像的…

matlab 绘制灰度图

matlab 将矩阵中不同数值所对应的区域用 不同深度的灰度图画出来&#xff0c;不显示坐标轴标签&#xff0c;并设置在画布上全屏显示。 if 1close allrng (7)mask_allrand(256,256)*10;mask_allround(mod(mask_all,2));mask_allsort(mask_all);mask_all(1:100,1:50)0;mask_all(…

matlab读取一幅灰度图,Matlab处理灰度图

作业2&#xff1a;通过图像分析的方法对如下图像进行分析&#xff0c;获取颗粒特性参数。具体参数包括图像中的颗粒个数&#xff0c;颗粒面积&#xff0c;颗粒等效直径&#xff0c;非球形颗粒的长/短轴&#xff0c;非球形颗粒的方位。 图1 待处理颗粒图像 步骤&#xff1a; (1)…

python灰度图

任务描述 背景   真彩色图像和灰度图像是数字图像的两种常见类型&#xff0c;如下图所示&#xff0c;左图是真彩色图像&#xff0c;右图是灰度图像。    在真彩色图像中&#xff0c;像素颜色是 RGB 颜色&#xff0c;每个颜色包含 R、G、B 三个颜色分量。而在灰度图像中&…