教程02_创建NIOS II软核、添加外设、引线连接

上一节,说了NIOS II开发的软硬件环境,这一节先创建一个软核,软核的创建过程比较繁琐,需要注意的地方很多。所以,第一次创建的时候尤其要细心。

首先,打开Quartus II 13.0 (64-bit),创建工程

创建过程就不多说了,工程名称:nios_led。芯片选择:EP4CE10F17I7.

创建成功后,点击左上角:new,创建文件。

在弹出的对话框中,选择文件类型为VHDL文件,然后点击OK。

会创建一个空白页,保存该页面,选择:save as,文件名称一定要与工程名称一样。我这里是nios_led.vhd。

第二,搭建软核

点击工具栏:Qsys,如图:

第一次打开是这样的:

在该软件对话框中,依次添加Avalon ALTPLL、Nios II Processor、SDRAM Contrlooer、System ID Peripheral、UART(RS-232 Serial Port)、PIO(Parallel I/O)等模块。关于如何添加与配置,下面进行详细说明。

2.1 Nios II Processor添加

在左侧的组件库中,找到Nios II Processor,双击打开:

这是NIOS II软核的核心处理器,类似单片机的CPU。

什么都不用改,直接点击右下侧:Finish,即可添加到右边的系统中。因为系统架构不完整,所以等到后面组件添加完整后再做修改。

2.2 System ID Peripheral添加与配置

这是系统ID,通过这种方式,可以给软核配置一个指定的ID编号。

在左侧的组件库中找到System ID Peripheral,双击打开,这里只把最后四位改成了:1234.

然后点击右下侧:Finish,将该组件添加到系统中。

2.3 Avalon ALTPLL添加与配置

PLL,简单来说,可以对外部输入的时钟信号进行分频或倍频,达到我们需要的频率。给该组件提供一路输入的时钟源,最多可以输出5路不同的时钟源,功能还是很强大的。

在左侧的组件库找到Avalon ALTPLL,双击打开。如图所示:


输入频率设置为50MHZ,因为板子上提供的有源晶振就是50MHZ,去掉一些不用的“复位”和“锁存”管脚。

我们主要用到了C0和C1这两路输出,输出时钟频率设置为100MHZ,需要注意的地方,C0的Clock phase shift这里:-90。C1那里不需要修改。

因为C0要输出给SDRAM提供时钟信号,而SDRAM在FPGA芯片外部,和芯片内部的设备存在一定的相位差,所以在这里进行调整。

剩下就一路Next下去就行了。最后点击:Finish,完成。

2.4 SDRAM添加与配置

模块上配备了一片大容量SDRAM,型号为:W9825G6KH-6I,它能提供256Mb的存储空间,也就是32MB。主要接口信息如下,后续配置接口时会用到:

Column,即列地址,0~8,共9位;

Row,即行地址,0~12,共13位;

BS0和BS1,组合,有4个BANK;

Data input/output接口是16位的。

FPGA的软核要想发挥最大性能,必须要配一个SDRAM。所以这里添加一个SDRAM控制器,连接软核与SDRAM。步骤如下:

2.5 UART模块添加与配置

增加一个串口,用来打印相关信息,好用又安心,懂得都懂。步骤如下:

双击后添加即可,不用做修改。波特率默认115200,这里需要注意的是,波特率是固定的,后续写C程序的时候不能修改。

2.6 PIO模块添加与配置

最关键的来了,要控制LED,必须要使用PIO。注意,它这里IO模块的名称为“PIO”,不是单片机里面常说的“GPIO”。

这里添加4个GPIO,把它配置为输出模式,步骤如图:

注意,这里不要勾选:Output Register下面的选项。从字面意思看,这个选项的功能是实现单个IO的控制。但我尝试过很多次,发现功能异常,所以个人不推荐。

至此,各个模块的添加工作完成。

三、修改名称

把SDRAM控制器的名称改一下,方法很简单:鼠标右键点一下,然后选中Rename。

改成sdram,相同的方法,pio_0改成led。

改完后如图:

四、模块调整

刚才添加了各种功能模块,有CPU,有SDRAM控制器,有串口,有IO,添加的先后顺序没有要求。

即便一开始添加的时候配置的不对,添加完成后也能修改。双击该模块就能打开配置页面,修改所需参数。

这里要确认clk_0模块中,输入时钟的频率为50Mhz。因为该模块在创建软核时是自带的,配置参数时容易被忘记。双击打开确认一下:

5后面7个0。

另外,模块的排列顺序也可以通过左侧的工具栏进行上下调整。选中某个模块之后,工具栏上的“箭头”即可使用。

我个人的排序习惯:clk在最上面,然后是pll,接着nios软核,接着sdram控制器,剩下的就随意了。排序之后如图:

五、模块连接

模块添加进来以后,还是独立的状态。这一步实现模块之间的连接,如时钟线、数据线、指令线等。

首先是时钟线,时钟线的运行逻辑是:外部晶振提供50Mhz的信号,通过clk模块进入niso软核,然后连接到PLL模块。在PLL模块实现两路100Mhz时钟的输出,一路连接到FPGA芯片外部的SDRAM(暂时不用管),一路连接到nios软核内部的所有功能模块。毕竟,外设需要时钟信号才能工作。

操作步骤如图:

图片中首先连接clk模块的时钟到PLL模块中,PLL模块倍频后,软核内部使用的是c1。把100Mhz的C1依次连接到nios、pll、sysid、sdram控制器、uart和led模块,在交汇的位置点击鼠标左键即可。

然后是数据线和指令线的连接。在nios的cpu模块中,有这样两条线:

data_master和instructio_master两条线,分别代表cpu中数据和指令的传输(我瞎猜的,先这么记)。所以,cpu要想控制外设,就要和它们有数据和指令上的交互。

注意,并不是所有的外设都需要连接两条线。通常来说,起到存储功能的flash和ram,需要连接两条线。而一些普通的外设,如io、uart、pll等,只需要连接数据线即可。连接后如图:

接着是复位信号线,除了clk模块,其它的模块都连上,如图:

六、对外接口

这一步主要实现nios软核中一些对外接口的引出,例如led接口,其实就是几个IO,最终要配置到实际的FPGA管教上。再比如SDRAM控制器,它要实现的是片外的SDRAM与片内nios软核的连接,有大量的IO要进行引出。

回到这一节的内容上,需要进行引出的模块如下:

ALTPLL,提供一路-90度的100Mhz的时钟信号给片外的SDRAM;

SDRAM控制器,地址线、数据线、片选线等等,和片外SDRAM连接;

UART模块,txd和rxd两条线,不解释;

LED模块,点灯用的那几个IO。

引出方法很简单,如下在Export那一列,与红色框住的那几行交叉的位置,双击,即可引出,同时要给引出的管脚命名,名称言简意赅。

引出后如图:

可以看到,clk模块的时钟信号和复位信号是自动引出的,剩下的是我们手动引出的。

七、配置基地址与中断号

程序运行时,每个外设,包括nios软核在ram中有一段固定的地址,存储相应信息。因此这一步要给每个外设配置一段基地址。

7.1配置基地址

首先要修改nios ii软核的配置,让它启动时从SDRAM中启动,异常复位时也从SDRAM中指定位置执行。双击打开nios ii模块,修改如下:

红色框住的那两个位置,修改为:sdram.s1。其它位置不动,对照一下,点击:finish即可。

确保SDRAM这里的基地址是从0x0000 0000开始,如果不是,双击修改。地址左侧有一个浅灰色的小锁的图标,点一下图标,让它从开锁状态变成锁住状态,保证SDRAM的地址不会被破坏。

锁住之后如图:

然后点击左上角菜单栏里面的:System,在弹出的下拉列表中,选中:Assign Base Addresses 选项。

通过这种方法,可以自动为其它模块分配地址。分配后如图:

SDRAM控制器的基地址从0开始,其它模块按顺序依次排列。可能模块顺序不同,地址会略有区别,但只要保证SDRAM控制器是从0开始的,然后使用系统自动分配基地址,一般是没问题的。

最明显的地方就是左下角的提示信息,之前有很多错误,现在只剩下几个警告了。

7.2 配置中断号

然后配置中断号。玩过单片机的都知道,不同的中断类型对应不同的中断号,不同的中断号还对应不同的中断优先级。

这里有中断功能的外设是UART模块,先要把它的中断信号连接到nios软核的中断总线上。方法很简单,鼠标左键点一下红色框住的地方即可:

然后点击左上方菜单栏中的:Assign Interrupt Numbers,自动分配中断号。

最后效果如下:

最后,确认一下左下方的警告信息,只剩下三个:

无关紧要,可忽略。

点击左上方File菜单下的保存,保存配置好的软核。存在项目文件夹内即可,我这里已经命名好了:core_led,名称尽量带一个core的前缀,这样一眼就能看出它是软核。

八、nios ii软核生成

软核的配置工作全部完成,这里进行软核的生成工作。点击选项卡最右侧的:Generation,跳转到选项卡页面。生成语言这里,我选择VHDL,个人习惯。

按照1、2、3顺序,进行配置,点击Generate后,等待一段时间。

完成后是这样:

没错误,但是有几个警告。不影响使用,忽略即可,点击Close,关闭就行了。

打开工程所在目录,可以看到生成的文件:

那个core_led.sopcinfo就是最终可用的软核文件,通过它可以在FPGA内部实现一个类似单片机的结构,使用C语言编程。

这一节操作内容比较多,也比较繁琐。但只要理解了每一步操作背后的目的及意义,就明白整个的创建流程了。届时,操作起来就能得心应手一些,不必一定按照这里的步骤。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据