NIOS中各程序存储器的关系

来源:互联网 发布:用java输出正方形 编辑:程序博客网 时间:2024/06/06 17:16

NIOS中各程序存储器的关系

在FPGA开发板上都有几种不同的存储器,比如SDRAM,FLASH,EPCS,还有内部onchipmemory,这几种存储器间是如何通信或者构建一个系统。该如何搭配他们呢,不少人都问到这个问题。在这里我做个总结以方便初学者的学习。
   首先看看在sopc builder中resetaddress和nios IDE中System Library中的program memory(.text)、read-onlydata memory(.rodata)等'm+ x/ t+ e2 b9 u* z3 e
www.fpga-design.net4 c6 x6 N1 p7 S% L0 `1 L
这几个地址的关系和作用
根据altera 的文档解释如下:
.text :代码执行区,U! f: }: ?% Z! J& ~
.rodata:只读数据区,存放静态全局变量
.rwdata:可读写数据区,存放可读写变量和指针变量FPGA设计网论坛专业FPGA设计论坛3 o* ^( l4 Z, V0 _* o! s
.bss:未初始化变量区
! r8 u1 V- b) ?3 Y: F1 X0 A
.text-the actual executable codewww.fpga-design.net2M" W$ h8 w' A2 \8 }8 o4 @/ Z
.rodata-where read only data used in the execution of thecode
.rwdata-where read/write variables and pointers arestored9Y5 E% i0 ^3 `
heap-where dynamically allocated memory is located"\5 Z2 P: ~4 `2 }- e1 B- D8 ?$ h
stack-where function call parameters and other temporarydatawww.fpga-design.net!o$ e9 s; I4 T4 [& s+ o
www.fpga-design.net9 o0 ^: a'K  z8 C4 y- |, E1s  a
    SOPC builder 在Nios II more"cpu_0" setting 标签中的reset address决定了flash programmer的下载存储器(一般是选EPCS controller 或者CFI flash),并且决定了程序从此处开始启动。exceptionaddress指定的是异常处理地址。当然,程序在运行前所有的数据都是存放在flash(EPCS或者CFIFLASH)中如果你设计的系统reset address与其它地址的设置不相同,比如reset address 和exceptionaddress ,reset address 和IDE中的programmemory(.text)设成不同的存储器,那么系统从resetaddress启动时都会从flash中把相关数据自动下载到相应的地址或者初始化相应地址。5E1 u$ ~( c* v
   通过上面的认识,我们就比较清楚了各存储器间可进行哪些搭配了,reset address的选择可选EPCS controller或者CFI flash ;program memory(.text)可选择onchip memory ,SDRAM,CFIflash等。如果reset address为EPCS则在使用flashprogrammer时程序是下载到EPCS芯片中。如果reset address选择CFI flash,则flashprogrammer时程序是下载到CFI flash芯片中。5?$ T9 w+ h; l0 v. r" q! X
   需要注意的是这里有个特殊情况。例如在开发板上经常有这么一个简单的系统,CPU+onchip memory +LED_PIO,resetaddress选择onchip memory;感觉整个系统都没有用到flash。而且onchipmemory在系统断电后数据就会消失,那么程序代码是存在哪,系统是如何从onchip memory启动听呢?先来看看onchipmemory模块的描述信息:在onchip_memory.v中有这么一段the_altsyncram.init_file ="onchip_memory.hex",很明显onchipmemory的初始数据来自"onchip_memory.hex",而"onchip_memory.hex"是在NiosIDE的SystemLibrary中存储器有选择onchip_memory(至少有一项是选择onchip_memory,如果都不选,就不会生成)时,在build结束的时候生成的。于是当我们把System Library中存储器的选择都选择onchip_memory时,在IDE中build结束后所有的程序代码都生成在"onchip_memory.hex"中,再在QII中全编译一次时,系统通过onchip_memory.v调用"onchip_memory.hex"从而把所有的程序代码以及配制信息都生成在POF和SOF文件中,使用QII的programmer直接下载到EPCS芯片或者FPGA芯片内程序都会立即执行。因为这里的特殊性就有很多网友询问了,resetaddress 选择onchipmemory,而IDE中把代码区都选择SDRAM调试的时候程序正常运行,再在QII全编译后下载POF文件就运行不了呢?问题就是出在这了,在这里可以总结出一点,要让程序在onchipmemory之外的存储器中运行,那么reset address就必然选EPCS 或者CFI flash,并且要通过flashprogrammer把程序下载到flash中。
0 0
原创粉丝点击