将Altera FPGA的sof文件和NIOS II的elf固件合并为一个jic文件以使用Quartus Programmer烧写

 

我们在学习和调试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的开发板,一步一步演示这个实现过程,将整个过程具体化。

 

先说明下我这个设计工程的结构:

  • 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轻触按键:输入控制信息

 

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

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的文件:

 

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

 

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的文件:

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的文件:

4    Convert Programming Files

在Quartus® II软件中,open File > Convert Programming Files > Set the programming file as JTAG Indirect Configuration File (.jic).

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 文件

 

11    Generate

然后点击Generate生成。生成完成后检查生成的 .map 文件(使用记事本打开)有Page_0在起始地址0x0,.hex文件在Page_0结束地址后的起始地址1

12 烧写

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

 

13    女神镇楼

最后上一张测试图,女神镇楼(话说放这样一张图给客户,客户是不是会觉得特别开心呢):

 

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

 

小梅哥

芯航线电子工作室

2016年1月30日星期六

 

 

sof文件和NIOS II的软件(elf)合并为jic文件以使用Quartus Programmer烧写的更多相关文章

  1. 【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件

    sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...

  2. 在WIN7系统下用Quartus ii 11.1 NIOS II 11.1 有时候会出现Nios II 的Run as hardware 中报错:Downloading ELF Process failed

    nios工程在编译通过后RUN的过程中出现Error Running Nios II Project: ‘Downloading ELF Process failed’问题原因: 1.nios2 cp ...

  3. 每天进步一点点------Nios II 的Run as hardware 中报错:Downloading ELF Process failed

    今天继续调试,又出现了新问题.在执行NIOS程序代码时,不能下载了:Pausing target processor: not responding. Resetting and trying aga ...

  4. 给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  5. 给NIOS II CPU添加一颗澎湃的心——sysclk的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  6. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  7. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

  8. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  9. FPGA回忆记事(一):基于Nios II的LED实验

    实验一:基于Nios II的LED实验 一.    创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...

随机推荐

  1. android-ContentProvider

    一.理解ContentProvider 为了在应用程序之间交换数据,Android提供了ContentProvider,它是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露 ...

  2. ArcEngine:空间索引格网大小无效

    参考如下帖子:http://www.cnblogs.com/linhugh/archive/2012/07/24/2606439.html\ C# 代码如下 IFeatureClass pNewFtC ...

  3. SDWebImage笔记

    SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...

  4. Linux下一些有用的指令

    1.   安装源代码包用到的configure 这用来定位安装位置. 用法: ./configure -prefix=<安装目录>,  前提是文件中有configure执行文件.

  5. 获取 苹果UDID 序列号

    UDID是什么? UDID 是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches,这些编码看起来是随机的,实际上 ...

  6. C++STL -- vector 使用

    vector是一种顺序容器. vector常用API: 现在一个个分析: 1. assign 这是一种赋值方法,但是会覆盖原来容器内的值. void assign( size_type num, co ...

  7. ListView的深入学习

    ListView通常有两个职责: 将数据填充到布局 : 处理用户的点击选择操作 二.创建ListView需要3个元素 ListView的每一列的View View的数据或者图片 连接数据与ListVi ...

  8. 运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法

    出现问题:运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法 出现问题原因: ①:缺少Visu ...

  9. 网页FLASH幻灯片播放带链接源代码 pixviewer.swf使用(转)

        <script type="text/javascript"> <!-- var focus_width=360 var focus_height=270 ...

  10. 一道打印M的面试题

    public class Demo { /** * 平面图形题(二维数组) */ public static void main(String[] args) { int num = 25; int ...