关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化


做了几天关于Altera FPGA的软核构建及程序固化问题,最初基于《2010版FPGA黑金开发板配套教程》。关于教程问题,网上的资源着实丰富,但也正因如此,也使得资料变得多,变得杂。由于不同的QuartusⅡ版本,又有着不同的内嵌软件,例如SOPC Builder、Qsys、nios2-ide、eclipse等,对应着手中不同的硬件板卡,想要调通nios软核工程是需要花费一番功夫的。因此,我应用QuartusⅡ10.1、SOPC Builder及nios2-ide,将走通的几种方法做了一篇总结,原因也是老版本较为稳定,且SOPC Builder新建软核时无需自己连线。

一、硬件开发

使用NIOS2软核,搭建硬件平台是前提,需先在QuartusⅡ10.1及SOPC Builder中完成工程的建立。我在此采用最基础的NIOS2软核,包括CPU,SDRAM模块,EPCS控制器,SYSTEM ID模块,JTAG UART模块,其中SDRAM模块可由其他类型的RAM代替,具体的将会在下面章节叙述。

1、构建CPU模块

在QuartusⅡ10.1中新建完工程之后,进入SOPC Builder,按需更改界面上部的CPU工作时钟频率。

在该软件开发界面左侧的Library软核库中,找到Processors->NIOSⅡ Processor,双击该软核添加,在后续需要进行一些参数设置,如下图所示,不同的类型占用不同的资源,也有不同的计算速度,根据需要进行选择,在此采用了计算速度最快的NiosⅡ/f。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

在上图中下面的红框内,需选好在后续过程中设置的两类存储器,Reset Vector是程序开始运行或复位后的存储器类型及起始地址偏移量,使用EPCS存储器;Exception Vector是运行异常时的存储器类型和地址偏移量,使用后续设置的RAM类型存储器。地址偏移量按照默认的即可。之后点击Next,进入下图所示界面。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

选择红框中的None,关闭Data Cache,之后直到进入下面设置界面,设置JTAG Debug Module,功能越多,需要的资源也越多,在此选择Level1,其余不用设置,Finish完成CPU的设置即可。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

2、构建EPCS控制器,SYSTEM ID模块,JTAG UART模块

这三类模块的构建较为简单,找到在左侧库中的位置之后,加入NIOS2软核而无需其他的设置,直接Finish生成即可。但是为了方便查看到这篇文章的小伙伴和自己应用,在此将模块位置标识出如下面几张图片所示。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

3、构建RAM模块

不同的硬件板卡,其上往往有不同的RAM类型,在构建NIOS2软核时需要根据不同RAM存储器类型进行选择。我的硬件板卡上使用的是DDR2 DRAM,型号是MT47H64M16HR-3IT ,容量:1Gbit(64M*16bit),16bit 总线,因此,需要在库中寻找相对应的软核。除此之外,还可用On-Chip RAM,SRAM等类型的存储器。下面将分开叙述这几类存储器软核的构建方法。

(1)DDR2 SDRAM模块的构建

现有板卡使用的是型号为MT47H64M16HR-3IT的DDR,经查找资料,发现该类型存储器上使用ALTMEMPHY,至于PHY(例如ALTMEMPHY,UniPHY)在存储器和存储器的控制器之间具体起到了什么功能还有待深入研究。在SOPC Builder的库中寻找DDR类型且带有ALTMEMPHY的存储器,如下图所示。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

进入该软核的设置界面后,并无同我所用型号完全一致的存储器,但可以找到如下图所示的类似型号。选择红框1中存储器,型号为MT47H64M8CB-3,之后则需要自定义参数设置。查资料根据这类存储器的命名规则,现有软核的处理数据位宽为8为,而我所用为16为数据位宽,因此,点击红框2中的Modify parameter,进入DDR存储器的参数设置界面。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

如上图所示,在设置界面改数据位宽为16位,并设置其他参数后,点击Save As,将修改后的DDR存储器类型默认保存至工程所在目录,并改名为Custom (Micron MT47H64M16HR-3IT)的.xml文件。如此便可在红框2中显示自定义软核名称,之后Finish完成该模块的构建。

(2)On-Chip RAM模块的构建

该类型的RAM构建较为简单,找到在软件库中位置,点击On-Chip ->On-Chip Memory(RAM or ROM),进入如下的设置界面,在上面红框中选择RAM类型,在下面红框中根据需要选择RAM存储器位宽和大小,够用即可,之后Finish完成该模块的构建。

若使用On-Chip RAM,在最终QuartusⅡ10.1中生成的软核中是无需引脚分配的,这点比较方便,但一般On-Chip RAM的空间较小,只能满足数据量少或其他少数要求。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

(3)SRAM模块的构建

若根据硬件板卡需要使用SRAM,在SOPC Builder的软核库中找到Memories and Memory Controllers-> SDRAM,下面有两种类型的SRAM,若无所要的类型,则需要自己根据所用存储器的时序和功能等编写Verilog代码,结合NIOS2软核的AVALON总线,将自定义的SRAM添加进自己的IP核库中。

目前我尚未用到这类存储器,因此也不在此做过多的叙述了。有用到的小伙伴可以自行研究下,方便以后的交流。

(4)软核的生成和引脚的分配

做完上述工作,需要将epcs_flash_controller的基地址改为全0并锁定,这样做是为了符合程序启动或复位时从起始地址开始运行的思维习惯。之后在SOPC Builder的菜单栏System下自动分配地址和中断,防止有重叠或漏分配。最终保存并点Generate生成即可。

进入QuartusⅡ10.1界面,新建和工程名同名的.bdf文件,然后双击添加上述新建的软核。

时钟则由PLL模块提供,添加PLL模块可根据任何教程步骤。在设置阶段,要注意对应硬件板卡时钟频率与PLL输入时钟,PLL输出频率与CPU工作频率的一致性,不然会出问题,还比较难以发现。

将PLL模块和软核连线后,需要生成可以与物理引脚发生映射关系的工程引脚,更改为合适的名字之后,编译成功便可分配实际物理引脚。下面叙述两种分配引脚的方法。

Ⅰ. 使用tcl文件分配。这类文件具有固定的书写格式,如下图所示。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
按照固定写完之后,在QuartusⅡ10.1的Tools菜单栏下选Tcl Scripts,并选中.tcl文件编译成功后实现引脚分配。

Ⅱ. 在Pin Planner中分配。我较多使用这种分配方式,除了可以分配引脚还可设置I/O Standard及输出电流强度等。

分配完编译即可。至此,硬件的开发就结束了,接下来立刻是软件开发。

在引脚分配完,未用到的引脚需要在Device->Device and Pin Options中设置为三态输入,点击Dual-Purpose Pins将专用引脚按需改为相应功能。如下图所示。其中nCE需要注意下, 比较容易有问题。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

二、软件开发

打开nios2-ide软件,选择工作空间为创建硬件的工作目录,新软件工程包括起工程名,选择针对硬件生成的.ptf文件,Hello World或者Hello World Small工程模板。

之后则进入了软件的开发界面,首先右击左侧工程目录,点击Build Project,如下图所示。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
这样就生成了针对NIOS2软核的程序文件供后续编写C代码使用。完成C程序设计并实现功能之后,使用快捷键ctrl+B编译程序,通过之后便可进行软硬件的程序下载和固化了。

三、程序下载及固化

1、使用nios2-ide软件下载

下载程序时,需要先将硬件配置写入FPGA中,再下载软件程序,否则在下载软件时,会出现硬件配置不一致而出错。
在nios2-ide菜单栏,点击下图所示功能,进入硬件配置下载界面。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化
这里即为下载QuartusⅡ自动生成的.sof文件,流程同在QuartusⅡ10.1中正常下载步骤一致。
之后再进入上图的Flash Programmer功能。如下图所示。

关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化

三个红框均需选中,第一个红框中为待下载的软件工程,第二个为待下载的硬件配置.sof文件,第三个为确认ID号。之后Program Flash即可将程序写进EPCS,完成程序的固化。选第二个红框的原因也是便于将硬件配置写入FPGA,固化程序。

2、使用nios II command shell[gcc3]和QuartusⅡ10.1下载

在使用nios2-ide下载程序时,有时会遇到所有文件均配置好,但是却无法完成下载的问题,我遇到最终存储器的无法擦除问题如下。
Checksummed/read 47kB in 1.8s

00000000 ( 0%): Erasing

Erase failed at offset 0
Leaving target processor paused

Checksummed/read 77kB in 3.0s

00030000 ( 0%): Erasing

Erase failed at offset 30000
Leaving target processor paused

最终也没有得到解决,但是却发现另外一种下载程序的方法。在nios2-ide下载过程中,虽然下载出错,但却在工程目录下生成了所需的下载文件,将硬件配置.sof文件转化为.flash文件,将软件配置.elf文件转化为.flash文件。若没有这些转化,也可使用nios II command shell[gcc3]使用如下命令进行转化。
sof2flash --input=hello_cy3.sof --output=hwimage.flash --epcs --verbose
elf2flash --input=hello_world_0.elf --output=swimage.flash --epcs --after=hwimage.flash --verbose

但是在QuartusⅡ10.1中无法对.flash文件进行下载,此时就需使用nios II command shell[gcc3],并用以下命令将.flash文件转化为.hex文件。文件保存在同一目录下。
nios2-elf-objcopy -I srec -O ihex hwimage.flash hwimage.hex
nios2-elf-objcopy -I srec -O ihex swimage.flash swimage.hex

最后,就是在QuartusⅡ10.1中的Convert Programming Files中按照生成固化程序.jic文件的方法,添加进两个生成的.hex文件,注意选择绝对地址,还是先硬件配置,再软件程序,如下图所示生成.jic文件,最终下载即可实现程序固化。
关于QuartusⅡ10.1中NIOS2软核的构建、软件编译及程序固化