sof与NIOS II的elf固件合并jic得到文件
7.1 为什么需要将Sof与elf合并得到jic文件
我们在学习和调试NIOS II工程的时候,一般都是先使用Quartus II软件中提供的Quartus Programmer来烧写FPGA配置文件(SOF),然后NIOS II EDS中提供的Flash Programmer工具来进行烧写NIOS II的。这对于开发者来说,并没有什么不便,反而因为这种方式的灵活,为开发带了了很大的便利。然而,当我们的产品已经设计完成并量产的时候,就需要将固件烧写到产品中。生产线上进行烧录时,总希望能够用最简单的方式实现。试想,如果生产线上在进行烧写时,还需要几个工具换来换去,等待很久,效率自然就下去了。因此这种Quartus Programmer+Flash Programmer的方式并不适合生产。
小梅哥在最近的工作中也遇到了这样的问题。我们新设计的一批开发板,在工厂生产完毕后,都要进行出厂测试。然而SMT厂家却并不熟悉我们的这种Quartus Programmer+Flash Programmer烧写方式。再说了,要使用这种方式还得安装Quartus Programmer和NIOS II EDS软件。厂家表示使用这种方式对他们来说有一定难度,而且效率也不高。所以我就根据Altera 官方网站上的一个帖子,进行了转换,将SOF文件和NIOS II的elf固件合并并生成了一个jic文件,这样,厂家就只需要使用Quartus Programmer来烧写这个jic文件就能实现同时烧写FPGA配置文件和NIOS II固件的功能了,简化步骤,节省时间。
从SOF文件和ELF文件得到JIC文件的原帖地址如下:
https://www.altera.com.cn/suppor ... rd10132010_126.html
7.2 本章示例介绍
因为有经验不足的朋友反映在看了这个教程后还是不知道怎么操作,总是不成功,因此这里小梅哥使用我们芯航线FPGA的开发板,一步一步演示这个实现过程,将整个过程具体化。
先说明下我这个设计工程的结构:
EPCS16:用来存储FPGA配置文件和NIOS的固件,本例中最终转换得到的JIC文件也是烧写到该器件中。
512K字节SRAM:作为NIOS II运存或者4.3寸TFT显存,这里作为TFT显存。(PS:使用SRAM作为运存,相较于使用SDRAM作为运存,NIOS II的性能会有较大的提升。)
128Mbit SDRAM:作为NIOS II运存或者4.3寸TFT显存,这里作为NIOS II运存。以运行较为复杂的程序或者GUI。
4.3寸TFT:用来显示文字/图片等内容。
XPT2046触摸控制器:使用SPI接口,用来得到触摸屏信息,实现人机交互
CH340 USB2TTL:将UART协议与USB协议进行互相转换。以实现调试的功能。
4bit LED:指示程序运行状态。
2X轻触按键:输入控制信息
介绍完了这个系统,接下来就可以介绍整个转换过程了:
7.3 详细转换步骤7.3.1 sof2flash:
从一个.sof 文件生成一个flash文件:
sof2flash --input=<hwimage>.sof --output=hwimage.flash --epcs –verbose
首先我们打开我们的NIOS II软件工程和对应板级支持包,这里名为tft_touch和tft_touch_bsp
然后选中tft_touch,单击右键选择Nios II -> Nios II Command Shell
我们的Quartus II生产的sof文件名为” TFT_SRAM.sof”,这个时候,如果我们直接输入
sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose
会提示找不到input file也就是找不到TFT_SRAM.sof文件。
这是因为该命令是在当前目录下寻找TFT_SRAM.sof文件,而我们的TFT_SRAM.sof文件在E:\easy_sopc\TFT_SRAM\prj\output_files目录下,因此当然无法找到该文件了。解决这个问题的方法有两种。
第一种,推荐方案。
因为很多不熟悉命令行的朋友在操作时速度慢而且容易出错,因此这里提供一种比较熟悉的方式。首先在windows中,将TFT_SRAM.sof文件从output_files文件夹中拷贝到tft_touch文件夹中:
然后回到命令行窗口再次执行
sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose命令
(提示:使用键盘上的向上方向键,可以快速切换到之前使用过的命令,这里在切换目录后,连按两次方向上键就应该能找到之前输入的sof2flash命令。)生成过程大约花费10秒钟。生成完成后的截图如下所示:
然后我们输入ls命令就能看到,确实生成了这样一个名为hwimage.flash的文件:
第二种方案:首先在shell中使用cd命令直接将目录切换到sof文件所在目录,也就是E:\easy_sopc\TFT_SRAM\prj\output_files。相应命令为(注意斜线方向):
cd e:/easy_sopc/TFT_SRAM/prj/output_files
然后再次执行sof2flash命令即可实现。生成完成后的截图如下所示:
然后我们输入ls命令就能看到,确实生成了这样一个名为hwimage.flash的文件:
一般推荐大家使用第一种方式,当然命令行高手除外。
7.3.2 elf2flash:
从一个,elf 生成一个flash文件:
elf2flash --input=<elf file>.elf --output=swimage.flash --epcs --after=hwimage.flash --verbose
因为推荐大家使用第一种方式操作,因此这里就按照第一种方式接着讲,相信有能力用命令行方式切换目录的朋友,也不会对其他操作存在问题。
这里我们就只需要直接输入elf2flash命令即可了,命令详细如下:
elf2flash --input=tft_touch.elf --output=swimage.flash --epcs --after=hwimage.flash –verbose
从命令中可以看到,第一步生成的hwimage.flash文件是作为了参数的一部分的,所以这里必须保证hwimage.flash在当前目录下。(第一步中使用推荐的方式,则能够自动保证这一点)。命令执行结果如下:
然后我们输入ls命令,可以看到,在当前文件夹下确实生成了一个名为swimage.flash的文件:
7.3.3 flash2hex:
转换.flash文件到.hex文件:直接输入以下命令(注意:altera官网中原帖这个地方命令有误,前后对应不上,原帖为nios2-e…… mysw.flash mysw.hex,应该讲mysw改为swimage):
nios2-elf-objcopy --input-target srec --output-target ihex swimage.flash swimage.hex
这个命令瞬间执行完成,我们ls下,就能看到当前文件夹下已经生成了一个swimage.hex的文件:
7.3.4 Convert Programming Files
在Quartus® II软件中,open File > Convert Programming Files > Set the programming file as JTAG Indirect Configuration File (.jic).
7.3.5 选择EPCS
在配置下拉菜单中选择合适大小的EPCS器件(见10步图)
7.3.6 命名jic
命名你的输出.jic 文件(见10步图)
7.3.7 Add Device
点击Flash Loader的下面,在右边选择Add Device (见10步图)
7.3.8 选择FPGA器件
从列表中选择你的FPGA器件(见10步图)
7.3.9 Add SOF
点击SOF Data,选择Add File,选择加.sof 文件(见10步图)
7.3.10 Add Hex data
点击Add Hex data,选择Relative addressing,选择上面生成的.hex 文件
7.3.11 Generate
然后点击Generate生成。生成完成后检查生成的 .map 文件(使用记事本打开)有Page_0在起始地址0x0,.hex文件在Page_0结束地址后的起始地址1
7.3.12 烧写
现在在Quartus II Programmer中,选择Add File,选择加.jic 文件。检查Program框,下一步.jic 文件,接着按Start即可。
7.3.13 测试效果
最后上一张测试图,女神镇楼(话说放这样一张图给客户,客户是不是会觉得特别开心呢):
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:一群 472607506(已满) 二群 615381411
小梅哥
芯航线电子工作室
此内容由EEWORLD论坛网友芯航线跑堂原创,如需转载或用于商业用途需征得作者同意并注明出处
本文来自论坛,点击查看完整帖子内容。