Nios II Flash IDE Flash Programmer(Part 1)
(由于单篇字符超过限制分两部分发)
前面已经实现了在SRAM及SDRAM中运行程序的功能,由于这些都是易失性存储器,重新上电后数据会丢失,因此我们有必要将程序代码存入到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 Memory(Altera公司已经提供,直接使用即可),另外还需要Avalon-MM Tristate Bridge(SRAM,SDRAM操作时不需要该组件(有的书上说需要),若选择了该组件而没加入Flash Memory或EPCS 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器件,并且Flash与FPGA的引脚连接也不相同。因此每个Flash编程设计都是与具体的目标板相联系的,不能用于其它目标板。
此处我使用的是DE2,在Target Board:中选择DE2_board
如果使用的是用户板(即不属于软件中指定的板子),则用户板的设计者必须创建该板的Flash编程设计提供给用户,关于用户板的Flash编程设计的创建有些复杂,此处不予介绍,请参考相关资料。
我使用的是DE2 + Quartus 6.1 Nios IDE 6.1
Flash 组件设置如下:
数据存储在Flash中,程序在SDRAM中运行。这样设置后,将程序数据存储到Flash中时,软件会自动加入一段复制引导代码(后面软件工程设置中需将Program Memory(用于运行程序的存储器)指向FLASH以外的存储器,一般指向SDRAM),使得程序执行时总是将Flash中的程序数据复制到SDRAM中,跳动执行。Exception Address即异常向量表一般放在RAM或SDRAM中。
其它设置为默认即可,不需要改动。最后生成硬件系统,分配管脚,编译。自此硬件部分的工作已经完成。
下面进行软件的开发。建立一个新的工程,可以选择空的模板。程序如下:(一个简单的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 Property 将Program Memory(.text):选择为SDRAM。Program Memory并不是表示存放程序数据的存储器,而是表示程序运行的存储器,若设为FLASH则表示在FLASH中运行程序,速度会很慢!应该改为SDRAM)
在使用DE2光盘中的DE2_NIOS这个参考设计时,如果前面的Nios系统中Reset Address 指向的是FLASH,Exception 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 Builder将Nios系统重新生成一遍,更新后将硬件系统重新编译。
按照前面的设置编译完成后,像以前在Onchip-Memory、SRAM、SDRAM中使用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
软件便开始检测与FPGA的连接情况,检测到后出现如图所示界面:
如果之前没有将定制好的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则正常。若前面是用.pof对FPGA进行配置,则重新上电后,不需要对FPGA重新配置。其执行过程如下:
上电后,FPGA自动由EPCS进行配置(即之前定制的Nios硬件系统),然后再从Flash中读取程序数据,在SDRAM中运行程序。(下载完成后,若系统没有RUN起来,请将系统复位)
好了,写了这么多,希望对大家有帮助。由于水平有限,难免有错误之处,恳请大家指正!
文章评论(0条评论)
登录后参与讨论