原创 【博客大赛】小梅哥FPGA学习笔记之将sof文件和NIOS II的elf固件合并为jic文件

2016-2-1 17:58 3745 20 24 分类: FPGA/CPLD 文集: FPGA深入学习

    我们在学习和调试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/support/support-resources/knowledge-base/solutions/rd10132010_126.html

 

    因为有经验不足的朋友反映在看了这个教程后还是不知道怎么操作,总是不成功,因此这里小梅哥使用我们芯航线FPGA的开发板,一步一步演示这个实现过程,将整个过程具体化。

 

   先说明下我这个设计工程的结构(温馨提示:点击图片可查看高清大图):

1.jpg
  • 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.3TFT用来显示文字/图片等内容。
  • XPT2046触摸控制器:使用SPI接口,用来得到触摸屏信息,实现人机交互
  • CH340 USB2TTL将UART协议与USB协议进行互相转换。以实现调试的功能。
  • 4bit LED指示程序运行状态。
  • 2X轻触按键:输入控制信息

 

   介绍完了这个系统,接下来就可以介绍整个转换过程了:

1   sof2flash:

   从一个.sof 文件生成一个flash文件:

sof2flash --input=.sof --output=hwimage.flash --epcs –verbose

    首先我们打开我们的NIOS II软件工程和对应板级支持包,这里名为tft_touch和tft_touch_bsp(温馨提示:点击图片可查看高清大图)

2.jpg

   然后选中tft_touch,单击右键选择Nios II  ->  Nios II Command Shell(温馨提示:点击图片可查看高清大图)

3.jpg
 
4.jpg

   我们的Quartus II生产的sof文件名为” TFT_SRAM.sof”,这个时候,如果我们直接输入

sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose

   会提示找不到input file也就是找不到TFT_SRAM.sof文件。(温馨提示:点击图片可查看高清大图)

5.jpg

   这是因为该命令是在当前目录下寻找TFT_SRAM.sof文件,而我们的TFT_SRAM.sof文件在E:\easy_sopc\TFT_SRAM\prj\output_files目录下,因此当然无法找到该文件了。解决这个问题的方法有两种。

第一种,推荐方案。

   因为很多不熟悉命令行的朋友在操作时速度慢而且容易出错,因此这里提供一种比较熟悉的方式。首先在windows中,将TFT_SRAM.sof文件从output_files文件夹中拷贝到tft_touch文件夹中(温馨提示:点击图片可查看高清大图)

6.jpg

   然后回到命令行窗口再次执行

sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose命令

   (提示:使用键盘上的向上方向键,可以快速切换到之前使用过的命令,这里在切换目录后,连按两次方向上键就应该能找到之前输入的sof2flash命令。)生成过程大约花费10秒钟。生成完成后的截图如下所示(温馨提示:点击图片可查看高清大图)

7.jpg

   然后我们输入ls命令就能看到,确实生成了这样一个名为hwimage.flash的文件(温馨提示:点击图片可查看高清大图)

8.jpg
 

   第二种方案:首先在shell中使用cd命令直接将目录切换到sof文件所在目录,也就是E:\easy_sopc\TFT_SRAM\prj\output_files。相应命令为(注意斜线方向):

cd e:/easy_sopc/TFT_SRAM/prj/output_files

(温馨提示:点击图片可查看高清大图)

9.jpg

 

   然后再次执行sof2flash命令即可实现。生成完成后的截图如下所示(温馨提示:点击图片可查看高清大图)

a.jpg

   然后我们输入ls命令就能看到,确实生成了这样一个名为hwimage.flash的文件(温馨提示:点击图片可查看高清大图)

b.jpg

 

   一般推荐大家使用第一种方式,当然命令行高手除外。

 

2   elf2flash:

   从一个,elf 生成一个flash文件:

elf2flash --input=.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在当前目录下。(第一步中使用推荐的方式,则能够自动保证这一点)。命令执行结果如下(温馨提示:点击图片可查看高清大图)

c.jpg

   然后我们输入ls命令,可以看到,在当前文件夹下确实生成了一个名为swimage.flash的文件(温馨提示:点击图片可查看高清大图)

d.jpg

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的文件(温馨提示:点击图片可查看高清大图)

e.jpg

4   Convert Programming Files

   在Quartus® II软件中,open File > Convert Programming Files > Set the programming file as JTAG Indirect Configuration File (.jic).(温馨提示:点击图片可查看高清大图)

 

f.jpg

 

5   选择EPCS

   在配置下拉菜单中选择合适大小的EPCS器件(见10步图)

6   命名jic

   命名你的输出.jic 文件(见10步图)

7   Add Device

   点击Flash Loader的下面,在右边选择Add Device (见10步图)

8   选择FPGA器件

   从列表中选择你的FPGA器件(见10步图)

9   Add SOF

   点击SOF Data,选择Add File,选择加.sof 文件(见10步图)

10 Add Hex data

   点击Add Hex data,选择Relative addressing,选择上面生成的.hex 文件(温馨提示:点击图片可查看高清大图)

g.jpg

 

h.jpg

11 Generate

   然后点击Generate生成。生成完成后检查生成的 .map 文件(使用记事本打开)有Page_0在起始地址0x0,.hex文件在Page_0结束地址后的起始地址1(温馨提示:点击图片可查看高清大图)

i.jpg
 
j.jpg

12 烧写

   现在在Quartus II Programmer中,选择Add File,选择加.jic 文件。检查Program框,下一步.jic 文件,接着按Start即可。

 

13 女神镇楼

   最后上一张测试图,女神镇楼(话说放这样一张图给客户,客户是不是会觉得特别开心呢)(温馨提示:点击图片可查看高清大图)

k.jpg

 

   如有更多问题,欢迎加入芯航线FPGA技术支持群:472607506

 

小梅哥

芯航线电子工作室

2016年1月30日星期六

 

 

 

文章评论4条评论)

登录后参与讨论

莫问奴家名 2016-2-18 10:46

你以为换了个地方我就找不到你了,小梅哥,别跑。。。

用户1465088 2016-2-2 21:33

支持小梅哥,大家顶起来,最后有亮点!

小梅哥 2016-2-1 21:33

谢谢鼓励。

用户1847764 2016-2-1 18:09

不错不错
相关推荐阅读
小梅哥 2019-09-04 22:10
小梅哥FPGA时序分析笔记(6.2)深入现象看本质——庖丁解牛之FPGA内数据传输模型
通过上一节,我们了解了FPGA内部数据的传输形式,接下来我们就可以根据上一节的内容来总结一下FPGA内部的数据传输模型了。 时钟和数据传输路径 通过上一节内容中,我绘制的那个FPGA内部数据在逻辑...
小梅哥 2019-09-01 21:28
小梅哥FPGA时序分析笔记(6.1)深入现象看本质——庖丁解牛之FPGA可编程原理
上一次发博客,已经是2个月前了,这中间两个月,干了件很有意义的事情,尤其是对于自己来说,感觉学到了非常多的知识和经验,每天都很忙,忙到没时间逛网站博客,终于忙完闲下来了,连载的事情可不能忘,终于可以书...
小梅哥 2019-07-02 08:57
小梅哥FPGA时序分析笔记(五)I/O约束显神威——深入龙潭
大家一定对我上一节的突然结尾表示一脸茫然:我是来学习时序约束的,然后你告诉我时序约束里面IO约束很重要,然我又跟着你的文章继续往下看,本以为你就要讲如何进行IO约束了,结果呢,你一个取反时钟就把我们打...
小梅哥 2019-06-30 11:07
小梅哥FPGA时序分析笔记(四)I/O时序定成败——化险为夷
小梅哥FPGA时序分析从遥望到领悟系列没有遇见过I/O时序问题,没有通过I/O约束方式实际解决过I/O时序问题,就很难明白I/O约束的重要性,也很难相信各种EDA软件真的有那么的傻白甜。 我遇到的最...
小梅哥 2019-06-22 10:32
小梅哥FPGA时序分析笔记(三)时钟约束真重要——事实说话
小梅哥FPGA时序分析从遥望到领悟系列以前,那是在以前,经常有网友(原谅我行文动不动就是网友说,网友问,毕竟我是卖开发板的,正面接触学FPGA的网友相对多一些,所以这些也都是事实存在的事情)问我:小梅...
小梅哥 2019-06-21 10:33
小梅哥FPGA时序分析笔记(二)时钟质量是生命——初遇时序
小梅哥FPGA时序分析从遥望到领悟系列第一次遇到时序问题并通过相应的手段解决问题,算是2年前做百兆以太网图像传输的时候了吧。当时遇到的问题为:同一个工程,每次编译结果的效果都不一样,有的时候编译了,下...
我要评论
4
20
关闭 站长推荐上一条 /2 下一条