Intel FPGA 基于NIOS的串口远程升级(中)

【时间:2024 年 06 月 20 日, 来源:本站原创, 作者:】

六、实际应用

6.1 修改例程

实际应用中,我们可能用不到3个镜像的情况,更多的是2个镜像,可以随时通过串口升级软硬件程序即可,并且不用到NIOS的话,NIOS程序一般不需要升级,可以关闭NIOS升级入口。后期升级维护更多的是现场人员,为了防止误操作和缩短升级的时间,我们将程序稍加改动,让串口界面清晰明了,让程序升级人员更容易操作。

1、语言汉化

  • 将串口打印信息汉化一下,例如:将之前的Factory打印信息修改

修改为:

  • 具体的代码请见工程。

2、NIOS程序去冗余

  • 在Factory程序中,只起到跳转的作用,所以可以将APP1&2的Hardware、Software升级功能去掉。
  • 在APP1中,不必使用跳转功能,可以将跳转功能去掉,将APP2的有关升级代码去掉。
  • 具体的代码请见工程。

3、上电即跳转

上电之后,FPGA默认从0地址启动,即程序会默认从Factory程序启动,然后从原厂程序跳转到APP1启动。在上面的教程中,我们是通过发送“5”来进行跳转,现在我们在Factory程序中,直接将input置为5,这样就可以上电之后,先从Factory启动,然后跳转到APP1启动。

4、缩小升级文件

  • 对于生成的RPD文件,不全是有意义的数据,空余的地方使用0XFF填充。

图 16 FF无意义字段以及有意义字段
图 16 FF无意义字段以及有意义字段
  • 举例来说,存放APP1 Hardware地址段0X00400000-0X007BFFFF中,并不全是有效字段,我们截取出来的RPD文件,包含许多无效字段,所以我们剔除无效字段,留下有效的就可以。

  • 注意在有效数据结束的时候,地址位选择是0X00859D5F而不是0X00859D50,所以文件长度即为59D5F。选择块,复制,另存为相应的RPD文件即可。

图 17 APP2 Hardware 地址以及大小
图 17 APP2 Hardware 地址以及大小
  • 在NIOS程序里面,地址也要做相应的修改。修改地址之后,擦除的区域也会相应改变。

修改为:

6.2 实际应用操作

1、板子上电,打开串口,配置。

2、Generate JIC文件配置如下:

图 18 生成JIC文件
图 18 生成JIC文件

3、下载JIC文件,重上电。打印信息如下:

图 19 跳转程序实际应用
图 19 跳转程序实际应用

4、串口发送1,则会显示擦除相关区域,然后选择相应的文件,并且发送。

图 20 程序擦除成功
图 20 程序擦除成功

5、等待几分钟后,显示程序升级完成。重上电之后,显示程序已经从APP2启动,升级成功。

图 21 程序升级完成
图 21 程序升级完成

6.3 实际应用容易出现的问题以及避免

在上述实际应用中,要求务必一次升级成功。一旦升级失败,就是出现错误导致无法再次升级。因为在Trigger IP Remote Update中设定,一旦升级失败,会跳转到Factory程序执行,但是我们在Factory程序中已经设定直接跳转到APP1,而APP1因为升级失败而无法正常启动,又会跳转回到Factory程序,所以如果升级失败,将是一个死循环。

为了避免出现此类情况,建议在外部放置一个拨码开关,上电之后检测拨码开关的设置来决定从哪个程序启动。例如开始设置:3‘b001:从Factory启动’,如果升级完APP1(可以多次升级,直至升级成功),则设置3‘b002,从APP1启动。

图 22 跳转失败,陷入死循环
图 22 跳转失败,陷入死循环

七、常见错误/问题

7.1 新建NIOS II 软件程序

当想把RSU程序移植到其他器件上的时候(尤其是不同系列的器件),尽量不要只通过修改Device来实现,容易出现一些莫名其妙的编译错误。要按照例子工程,重新添加IP,重新新建NIOS II软件程序。

新建NIOS II软件程序遵循以下步骤:

1、“File”-“New”-“Nios II Application and BSP from Template”

2、在弹出的窗口“SOPC Information File Name” 中,选择对应的SOPCINFO文件。Nios II IDE使用.sopcinfo文件来信息来为目标硬件编译软件程序。

3、在“Project Name”输入工程的名字,注意不要有空格

4、在“Templates”中选择“Hello World Small”。

5、点击“Next”创建BSP工程。

6、点击Finish完成工程的创建。

图 23 新建NIOS程序
图 23 新建NIOS程序

7.2 Scanf函数

在7.1的“Templates”中,可以选择“Hello World”或者“Hello World Small”。后者是前者的简化版,支持的功能少,占用的体积更小。如果片子片上资源够大,考虑前者,如果资源较少,考虑后者。例如“EP4CE10”,前者占用资源太多放不下,只能考虑后者。

在“Hello World Small”中,不支持函数“Scanf”,编译会出现以下错误:

此种情况下,我们用“Alt_getchar()”函数代替。

在程序中,相应的做出修改。

scanf("%2x%2x%2x%2x", &receivedHex[0], &receivedHex[1], &receivedHex[2], &receivedHex[3]);
修改为
for(int i=0;i<4;i++)
 receivedHex[i]=alt_getchar();

7.3 UART指向

1、在NIOS工程里面,串口有两个,JTAG UART和UART。

  • JTAG UART是要自己添加的Quartus内置IP核,通常用来是实现PC和Nios II系统间的串行通信接口,它用于字符的输入输出。
  • 在Qsys中添加了JTAG UART核 ,而在系统生成,例化中并没有关于JTAG UART的端口, 这部分接口软件内部自动添加,就像你不需要在顶层分配EPCS接口,只要你在你的调试代码中调用了打印信息的调试函数就可以。
  • UART就是我们普通的串口,通过RS232与PC相连。

2、在调试过程中,我们根据调试需要来切换不同的串口。

  • 在BSP Project 右键,选择“NIOS”-“BSP Editor”。

  • 在打开的窗口中选择“Common”-“hal”-“stdin”,可以选择UART或者JTAG UART。

图 24 选择外部UART接口
图 24 选择外部UART接口
  • 选择了“Jtag_uart”,串口信息打印在NIOS的Console窗口,选择“uart”,串口信息打印在PC的串口调试助手上。

7.4 写保护开关

在NIOS程序中,下面语句是EPCQ Controller(Intel FPGA Serial Flash Controller Core) 对Flash的开关写保护操作。

IOWR(EPCQ_CONTROLLER_AVL_CSR_BASE, 0x3, 0x00001703);

图 25 寄存器配置
图 25 寄存器配置

通过上图可以看到,FLASH_MEM_OP[31:24],FLASH_MEM_OP[7:2]是保留字,不能够操作,我们能操作的是FLASH_MEM_OP[23:8]和FLASH_MEM_OP[1:0]。

对于FLASH_MEM_OP[1:0],选择2‘b11。

对于FLASH_MEM_OP[23:8],我们要操作的也只是低五位,即FLASH_MEM_OP[12:8]。位13到位23是保留的,应该设置为零。低五位提供Flash扇区的组合值,对不同扇区进行操作。

图 26 FLASH_MEM_OP 配置以及Flash扇区段
图 26 FLASH_MEM_OP 配置以及Flash扇区段

从上图可以看出,我们选择的是1001-所有扇区全部保护和0111,保护低位扇区(因原厂程序存在0地址低扇区,所以升级过程中,原厂程序不能被删除)。对应的寄存器0X00001903和0X00001703。

7.5 Remote Update IP

Remote Update IP 从Flash中将升级的镜像下载到FPGA,然后更新配置电路,来启动重配置。
在配置过程中和配置之后,Remote Update 执行错误检测,当检测到错误时,直接恢复到出厂程序运行,并且提供错误状态信息。
在NIOS程序中,需要操作的寄存器有 0X0C、0X10、0X1D(仅限于Cyclone IV和Cyclone 10 LP,其他系列的根据datasheet来定)。

图 27 Remote Update IP的寄存器配置
图 27 Remote Update IP的寄存器配置

7.6 数据截取文件从RPD而非JIC

注意数据截取的时候是从RPD文件,而非JIC文件,从JIC文件截取是会出错的。RPD文件在生成JIC的文件一起生成的。

图 28 勾选生产RPD文件
图 28 勾选生产RPD文件

7.7 SOF、JIC、ELF、HEX

1、文件类型

  • SOF:SRAM Object File
  • JIC:JTAG Indirect Configuration File
  • HEX:Hexadecimal (Intel-Format) Output File

2、本文用到的是SOF+HEX=JIC,然载JIC的方式

  • SOF文件是由FPGA编译产生。
  • HEX文件是由NIOS编译产生,编译方法请见上文。
  • HEX文件也可以通过ELF文件转换而来。转换指令

elf="sw.elf"
 echo "elf>flash ..."; elf2flash --epcs --input=$elf --output=sw.flash
 echo "flash>hex ..."; nios2-elf-objcopy --input-target srec --output-target ihex sw.flash sw.hex
 echo "del flash ..."; rm -f *.flash

上述指令存为elf2hex.sh文件,通过Nios II command shell 执行。在NIOS project右键,选择“Nios”-“Nios II Command Shell”

执行命令如下图所示,另外注意这种生成的HEX文件方法仅供参考。

图 29 一种生成HEX的方式
图 29 一种生成HEX的方式

7.8 NIOS调试以及下载

在实际项目开发中,不必每次都合成JIC文件下载,可以先由NIOS里面直接下载,方便调试。

  • Nios Project-右键,然后选择“Run as”-“Run Configurations”,打开配置窗口。

图 30 NIOS 运行调试
图 30 NIOS 运行调试
  • 在配置窗口“Project”-“Project ELF file name”中选择正确的ELF文件。

图 31 选择正确ELF文件