Intel FPGA 基于NIOS的串口远程升级(上)
【时间:2024 年 06 月 20 日, 来源:Cytech Engineer, 作者:Ted Gao】
本文介绍一种基于串口远程升级Intel FPGA的方法,在Intel FPGA运行NIOS,上位机通过串口连接NIOS对FLASH进行操作,上传用户的新FPGA设计,通过擦除重写FLASH,来达到更新Intel FPGA程序的目的。
此应用主要面向有二次升级需求的用户。例如产品出厂之后,客户需要进行刷机更新,就可以采用这个方案,将最新的程序放在官网给客户下载之后,通过串口自行升级。再例如整机装配之后,不方便留调试AS/JTAG口,就可以留串口,利用本文提供的方法进行整机调试过程中的程序更新升级。本文篇幅较长,全文目录如下:
一、实验要求以及方案信息
实现本文实验的要求:
- Cyclone IV EP4CE10E22C8 开发板
- Intel Quartus Prime 17.1
- USB转RS232 串口线
- 二进制/十六进制文本编辑器
方案信息:
- 占用资源:LE≤3610、PLL 1个、Memory 87056bits
- Flash型号:MT25QL128ABA1ESE-0SIT 128MB SOP-8
二、参考例程文件
参考例程包含一个原厂镜像(Factory Image),两个应用镜像(Application Image),以及各自对应的NIOS软件程序(NIOS II Software)。包含下载所需的JIC文件,以及合成JIC需要的SOF和HEX文件,升级需要的RPD文件。
升级文件列表如下所示:
文件名称 | 描述 |
Factory.zip | 三个工程的压缩包 |
\Factory\output_files\output_file.jic | 合成的JIC文件 |
\Factory\software\factory\mem_init\epcq_controller.hex \Application_1\software\app1\mem_init\ epcq_controller.hex \Application_2\software\app2\mem_init\ epcq_controller.hex | Factory和APP1、APP2的hex文件 |
\RPD_Data\App2_hw.rpd | APP2的FPGA升级文件 |
\Factory\output_files\Factory.sof \Application_1\output_files\application_1.sof \Application_2\output_files\application_2.sof | Factory和APP1、APP2的sof文件 |
三、框图
四、例程设置
4.1 下载文件生成
1、SOF文件生成
FPGA文件编译完成之后就可以生成。
2、HEX文件生成
- 在Quartus 菜单栏上打开“Tools”下的“Nios II Software Build Tools for Eclipse”。
- 在弹出的Workspace Launcher中选择Factory文件夹中的“Software”文件夹,单击OK。
- 右击factory_bsp,选择build project。
- BSP build complete之后,右击factory,单击build factory。
- factory build complete之后,右击factory,单击make targets,选择build。
- 在Make Targets 中选择mem_init_genertate,单击Build。
- 生成的HEX文件在\Factory\software\factory\mem_init 文件夹下,epcq_controller.hex(可修改为factory.hex)。
4.2 下载文件合成
1、在Quartus的Files里面打开 “Convert Programming Files…”
2、在 “Output programming file” 选项卡, 设置一下项目:
- Programming file type: JTAG Indirect Configuration File (.jic)
- Configuration device: EPCQ128 (select according to your EPCQ type)
- Mode: Active Serial
- File name: You may select your preferred path for the output file (.jic).
3、勾选 “Create config data RPD (Generate output_file_auto.rpd)”。
4、在“Input files to convert” 选项卡, 按照以下步骤进行设置:
- 选择 “Flash Loader”,单击 “Add Device”, 选择Cyclone IV里面的“EP4CE10” 。
- 对于原厂镜像的FPGA SOF文件,需要设置如下:
i. 选择“Page_0” 然后单击“Properties”。
ii. 选择“Address mode for selected pages” 里面的“Block”。。
iii. 设置“start address”为“0X00000000”,设置“end address”为“0X003BFFFF。
iv. 单击“Add File”,然后将原厂镜像的SOF文件“Factory.sof”添加进来。
- 对于Application_1,设置如下:
i. 单击“Add Sof Page”。
ii. 选择“Page_0” 然后单击“Properties”。
iii. 选择“Address mode for selected pages” 里面的“Block”。
iv. 设置“start address”为“0X00400000”,设置“end address”为“0X007BFFFF。
v. 单击“Add File”,然后将SOF文件“Application_1.sof”添加进来。
- 同理,将Application_2的“start address”为“0X00800000”,设置“end address”为“0X00BBFFFF”。
- 对于原厂的nios 程序文件,需要设置如下:
i. 单击“Add Hex Data”,打开对话框。
ii. 单击“Hex file”框后面的省略号,选择生成的factory.hex文件。
5、最后单击Generate,生成JIC文件。
4.3 下载FPGA镜像和nios ii 软件镜像
- 连接USB Blaster,板子上电。
- 从“Tools”打开“Programmer”,点击“Hardware setup……”,选择“USB-Blater II”。
- 点击“Auto Detect” 选择“EP4CE10”。
- 点击“File”,选择生成的JIC文件。同时在“Program Configure”打钩。
- 打开“Tools”里面的“Options……”,在“Unprotect EPCS/EPCQ devices selected for the erase/program operation”选项打钩。
- 点击“Start”,开始下载,下载完成后,板子重新上电。
4.4 生成升级RPD文件
我们在生成JIC文件的时候,同时生成了RPD(Raw Programming Data)文件,我们的升级文件需要从RPD文件中截取出来。
- 利用文本编辑器将生成的“output_file_auto.rpd”文件打开,在“‘编辑“菜单下,选择“选择块”,打开对话窗口。
- 对于Application_1,FPGA程序对应地址范围:0x00400000 – 0x007BFFFF,在“选择块”的窗口的起始偏移中,填入“400000”,在结束偏移中填入“7BFFFF”,单击确定,选择数据。
- 在选择的数据上右键选择“复制”。
- 单击“新建”,右键选择“插入式粘贴”,在弹出的改变文件大小提示对话框中选择“确定”。
- 选择“文件”菜单下的“另存为”,选择合适位置,存为“app1_hw.rpd”。
重复上述步骤,根据下面的表格中所列出的起始偏移地址和结束偏移地址,截取出Application_1的NIOS程序,Application_2的FPGA程序和NIOS程序。
程序占用空间列表如下所示:
名称 | 大小(KB) | 地址范围 |
Application 2 software | 256 | 0X00BC0000-0X00BFFFFF |
Application 2 hardware | 3840 | 0X00800000-0X00BBFFFF |
Application 1 software | 256 | 0X007C0000-0X007FFFFF |
Application 1 hardware | 3840 | 0X00400000-0X007BFFFF |
Factory software | 256 | 0X003C0000-0X003FFFFF |
Factory hardware | 3840 | 0X00000000-0X003BFFFF |
- 请确认生成的RPD文件有着正确的文件大小。
五、运行
1、连接USB转RS232串口线,连接USB Blaster II,板子上电。
2、打开串口调试助手(理论上任一串口调试皆可,但实际操作中发现有些软件是不行的,如果有发不出数据的情况,可以考虑换一个串口调试助手)。打开串口的设置,设置波特率“115200”,校验位“None”,数据位“8”,停止位“1”。
3、程序跳转
- 重新上电,会在接收区看到打印信息,可以看到程序从Factory启动。
- 从串口发送字符“5”,从打印信息中看到程序从Factory镜像转到Application_1镜像启动。
- 重新上电,同样操作,串口发送6,程序会从Factory镜像转到Application_2启动。
4、串口远程更新,本次更新将Application1的hardware擦除,然后将Application2的hardware更新到被擦除的区域。
- 重新上电,发送1,可以看到Flash相关区域(Application1的hardware)已经被擦除。
- 在串口调试助手上面的“选择发送文件”,选择之前生成的Application2的hardware文件,点击串口调试助手的“发送文件”选择发送。可以看到下面的发送窗口已经开始发送了。需要等待十分钟左右,等待发送完成。
- 待发送完成之后,会提示“Application 1 Hardware upgrade completed!”,但此时程序还是会打印程序从Factory启动,待重新上电后,发送“5,”,会提示程序从Application2启动(正常情况下会提示从Application1启动),升级成功。