首页 > 技术文章 > 【友晶科技Terasic】 解读Nios II IP 的 Reset Vector 和 Exception Vector

DoreenLiu 2021-10-27 14:55 原文

 Reset Vector——复位向量
Exception Vector——执行向量

两个向量地址都存储着程序。

 Reset Vector就是当系统reset 时,CPU会跳到 Reset Vector所指定的位址执行,而Exception Vector则是当发生hardware interrupt或software exception时,CPU会跳到Exception Vector所指定的位址执行。

 

 这里的地址是相对于整个BUS,on-chip 地址是 0x00040000。

 

 

 

 因为两个向量地址不能一样,而Nios 处理器是32位的,0x20=32,所以如果选最小的偏移就只能是0x20了。

 

elf烧写的时候不是从零地址烧写的,是根据Nios II IP 里面的 这两个向量的设置来烧写的, 如下图: 

(也就是说,程序的起始位置是根据你Nios II IP 的设定)

 

以上方法是将.sof和.elf全部保存在FPGA内,程序加载和运行也是在FPGA内部。 把FPGA的配置文件.sof通过JTAG方式下载(其实是在线运行)进入FPGA本身,此时在NIOS II的界面中,点击“RUN”—“Run As Hardware”可实现在线运行。此时在SOPC配置时,需要有片内mem_rom和mem_ram,程序的复位向量为mem_rom,偏移0x00;异常向量为mem_ram,偏移0x20。断电后无法运行。 
 
 方法二:.pof保存在EPCS4,.elf保存在FPGA内部,加载从EPCS4,运行在FPGA内部。 和方法一差不多,只是把FPGA的配置文件.pof以AS的方式下载到EPCS4中,而软件文件也是通过JTAG方式下载入FPGA中,断电也无法运行。CPU内部的两个配置是mem_rom和mem_ram。 
 
方法三:将.sof文件和.elf保存在EPCS4,加载从EPCS4,运行在FPGA内部。 先将.sof文件通过JTAG下载进入FPGA,然后通过NIOS II的flash programmer以JTAG方式把.sof和.elf文件下载入EPCS4,此时CPU的Reset Vector为EPCS,偏移0x00,Exception Vector为mem_ram,偏移为0x20。断电重启后仍能正常运行。 
 

 

 
4. 方法四:将.sof文件和.elf保存在EPCS4,加载从EPCS4,运行在SDRAM中。 具体的下载方法同方法3相同,只是设置的过程有所不同。 需要在SOPC中添加SDRAM Controller,在CPU中设置异常向量为sdram。
 
使用quartus_program 来固化sof和elf到EPCS,对不支持 nios2_flash_program的 flash 器件也适用 ,使用的IP 是altera serial flash controller ,  altera serial flash controller 的 boot loader 存于 flash 。
 
(这里的 reset vector offset 必须大于 sof 的 SIZE,这里设为 0x01000000 (16Mbyte) )
 
 
也可以采用 nios2_flash_program 方式烧写elf和sof到EPCS,nios2_flash_program 方式对于不支持 nios2_flash_program 的flash 不适用,使用的IP 是 legacy EPCS/EPCQx1 flash controller ,legacy EPCS/EPCQx1 flash controller 的 boot loader 存放在 IP 内 rom :
  
以上案例的截图都来自友晶科技论坛的这个帖子的 案例: 【FAQ】DE0-CV 如何将sof和 elf 都固化到epcs? http://www.myfpga.org/discuz/forum.php?mod=viewthread&tid=197468 (可以免费下载哦)

推荐阅读