原创 FPGA实例:Nios II Flash IDE Flash Programmer

2010-5-27 20:27 6008 7 7 分类: FPGA/CPLD

Nios II Flash  IDE Flash Programmer(Part 1)


(由于单篇字符超过限制分两部分发)


前面已经实现了在SRAMSDRAM中运行程序的功能,由于这些都是易失性存储器,重新上电后数据会丢失,因此我们有必要将程序代码存入到Flash中,重新上电后从Flash中读取数据并执行。


这里需要说明的是,将程序代码下载到Flash中是通过Nios II IDE中的Flash Programmer实现的。当然Altera公司的User Guide


ug_nios2_flash_programmer里面非常详细地介绍了其使用方法。


Flash Programmer通过2个过程将数据写入Flash


1、          Flash编程设计对FPGA进行配置(这个设计是Altera提供的特殊Flash编程设计,也可以是用户自己设计的,此处采用自己的设计)。


2、          Flash Programmer(PC上运行)将要编程到Flash中的数据传送到FPGA上,通过FPGA将数据写入到Flash中。


点击看大图


 


第一步中,对FPGA进行配置的设计要包含相应的组件。


点击看大图
 


    好了,为了简单起见,把我实现的Flash编程的过程贴出来,希望对大家有用。 


首先当然是要设计出第一步中对FPGA进行配置的系统(也可使用Altera公司提供的特殊Flash编程设计)。但此处我们的目的不仅仅是要将数据下载到Flash中,而是希望我们的Nios系统能够从Flash中读取数据并运行。故我们要实现的Nios系统要包含对Flash操作的组件:Flash MemoryAltera公司已经提供,直接使用即可),另外还需要Avalon-MM Tristate BridgeSRAMSDRAM操作时不需要该组件(有的书上说需要),若选择了该组件而没加入Flash MemoryEPCS Serial Flash Contronller则会报错): 


Tri sate bridge 0/tristate master requires a slave of type avalon tristate.Please add a avalon of type avalon tristate.


 


 


另外System ID peripheral是推荐加入的。


   还有一点非常重要,一定要指定目标板。不同的电路板往往使用不同的Flash器件,并且FlashFPGA的引脚连接也不相同。因此每个Flash编程设计都是与具体的目标板相联系的,不能用于其它目标板。


此处我使用的是DE2,在Target Board:中选择DE2_board


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer 


 


如果使用的是用户板(即不属于软件中指定的板子),则用户板的设计者必须创建该板的Flash编程设计提供给用户,关于用户板的Flash编程设计的创建有些复杂,此处不予介绍,请参考相关资料。


我使用的是DE2 + Quartus 6.1 Nios IDE 6.1


Flash 组件设置如下:


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer

定制好后的Nios系统如图所示:


点击看大图

数据存储在Flash中,程序在SDRAM中运行。这样设置后,将程序数据存储到Flash中时,软件会自动加入一段复制引导代码(后面软件工程设置中需将Program Memory(用于运行程序的存储器)指向FLASH以外的存储器,一般指向SDRAM),使得程序执行时总是将Flash中的程序数据复制到SDRAM中,跳动执行。Exception Address即异常向量表一般放在RAM或SDRAM中。


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer
其它设置为默认即可,不需要改动。最后生成硬件系统,分配管脚,编译。自此硬件部分的工作已经完成。


点击看大图


下面进行软件的开发。建立一个新的工程,可以选择空的模板。程序如下:(一个简单的LED灯闪烁程序)


#include "system.h"


#include "altera_avalon_pio_regs.h"


#include "alt_types.h"


int main (void) __attribute__ ((weak, alias ("alt_main")));


 


int alt_main(void)


{


    alt_u8 led="0";


    alt_u32 i;


    while(1)


    {


        led="18";


        IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);


        i="0";


        while(i<50000)


        {i++;}


       


        led="9";


        IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);


        i="0";


        while(i<50000)


        {i++;}


    }


    return 0;


}


选中工程,右键选中System Library PropertyProgram Memory.text:选择为SDRAMProgram Memory并不是表示存放程序数据的存储器,而是表示程序运行的存储器,若设为FLASH则表示在FLASH中运行程序,速度会很慢!应该改为SDRAM


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer
这样,软件编译时会自动生成.flash文件用于下载。


 


   在使用DE2光盘中的DE2_NIOS这个参考设计时,如果前面的Nios系统中Reset Address 指向的是FLASHException Address指向的是SDRAM。而此处的Program Memory 不是使用的FLASH则系统会报错


   我使用DE2光盘中的DE2_demonstrations\SOPC_Builder\Reference_Design\DE2_NIOS这个参考设计时,由于没有将的Program Memory 设为cfi_flash_0,编译一个简单的Hello World时都会出错。编译器居然报出了中文“严重”,匪夷所思啊。


 


**** Build of configuration Debug for project hello_world_0 **** 


make -s all


Compiling hello_world.c...


Linking hello_world_0.elf...


Info: (hello_world_0.elf) 204 Bytes program size (code + initialized data).


Info:                     8191 KBytes free for stack + heap.


make: d:/program: Command not found


Post-processing to create cfi_flash_0.flash


2010-2-7 13:00:27 - (严重) elf2flash: Read error: File not found: /boot_loader_cfi.srec


2010-2-7 13:00:27 - (严重) elf2flash: Error reading boot copier


2010-2-7 13:00:27 - (严重) elf2flash: Error generating Flash file, exiting


make: *** [cfi_flash_0.flash] Error 5


Build completed in 314.0 seconds


    从报错的信息来看,在生成cfi_flash_0.flash时,要加入引导复制程序:boot_loader_cfi.srec (Reset Addresses指向FLASH,而后面设置的Program Memory不是指向FLASH时,系统就会自动在生成的可执行文件前加引导复制程序)但没有找到该文件,导致报错。


    其实就是路径不对(这个参考设计是在其他PC机上生成的,软件的版本与安装路径与本机都不尽相同),比较保险的办法是,打开SOPC BuilderNios系统重新生成一遍,更新后将硬件系统重新编译。


 


   按照前面的设置编译完成后,像以前在Onchip-MemorySRAMSDRAM中使用Run As Hardware时,程序也能够运行,但是复位后程序将不能执行(即 Run As Hardware时程序并没有写入到Flash中),因为Reset Address指向Flash,CPU复位后要从Flash中读取数据并运行。所以我们先要用Flash Programmer将程序数据下载到Flash中。 


一定要注意先要用之前定制好的Nios系统对FPGA进行配置。Flash Programmer是通过FPGA将数据下载到Flash中的。


选中工程,点击Tools->Flash Programmer 可以先删掉原有的编程工程,先建一个。双击时,系统报错:


An error has occurred.See error log for more details.


点击看大图
我并不清楚出现这个错误的原因,没有理会它。右键Duplicate


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer
软件便开始检测与FPGA的连接情况,检测到后出现如图所示界面:


DE2 <wbr>Nios <wbr>II <wbr>Flash <wbr> <wbr>IDE <wbr>Flash <wbr>Programmer
点击Program Flash即可开始对Flash编程。


 


如果之前没有将定制好的Nios系统对FPGA进行配置,则Program Flash时会报错:


#!/bin/sh


#


# This file was automatically generated by the Nios II IDE Flash Programmer.


#


# It will be overwritten when the flash programmer options change.


#


cd F:/FPGA/My_DE2/my_nios/LCD1602/workspace/LCD1602_0/Debug


# Creating .flash file for the project


"$SOPC_KIT_NIOS2/bin/elf2flash" --base=0x00800000 --end=0xbfffff --reset=0x80000


0 --input="LCD1602_0.elf" --output="FLASH.flash" --boot="$SOPC_KIT_NIOS2/compone


nts/altera_nios2/boot_loader_cfi.srec" 


# Programming flash with the project


"$SOPC_KIT_NIOS2/bin/nios2-flash-programmer" --base=0x00800000 --sidp=0x 00C00850


 --id=3997632517 --timestamp=1265510262  "FLASH.flash"


There are no Nios II processors available which match the values specified.


Please check that your PLD is correctly configured, downloading a new SOF


file if necessary.


即没有找到匹配的Nios处理器进行Flash编程。


 


    将之前定制好的Nios系统对FPGA进行配置(可以将.sof下进去,或将.pof下进去),再按照上述方法Program Flash则正常。若前面是用.pofFPGA进行配置,则重新上电后,不需要对FPGA重新配置。其执行过程如下:


上电后,FPGA自动由EPCS进行配置(即之前定制的Nios硬件系统),然后再从Flash中读取程序数据,在SDRAM中运行程序。(下载完成后,若系统没有RUN起来,请将系统复位) 


    好了,写了这么多,希望对大家有帮助。由于水平有限,难免有错误之处,恳请大家指正!


 


转自:http://blog.sina.com.cn/s/blog_64c221b70100gy28.html

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条