基于NIOS II的流水灯

通过设计一个由18个发光二级管组成的流水灯控制电路来完整地描述Nios II软核处理器系统的开发过程。

开发环境:Quartus II 9.0Nios II 9.0 IDE

说明:详细内容参考赫建国 倪德克 郑燕编著《基于Nios II内核的FPGA电路系统设计》电子工业出版社。

1 配置NIOS II软核处理器系统

1.1 创建Nios II软核处理器系统

首先新建一个文件夹,该文件夹用来保存整个设计过程生成的文件。接着由Quartus II开发软件创建一个工程(本次试验选用目标FPGA芯片Cyclone II系列的EP2C35F672C6),并建立一个原理图输入文件。Quartus II窗口中,由菜单“ToolsSOPC Builder”可以打开Nios II软核处理器系统开发工具,系统出现下图所示的SOPC Builder启动画面。


在创建Nios II软核处理器系统对话框“create new system”中的文本框“System Name”中输入将要创建的NiosII软核处理器系统的名称led18_cpu注意:Nios II软核处理系统的名称不要与Quartus II的工程名称相同。完成后单击“OK”按钮关闭该对话框,同时系统将自动出现如下图所示的Nios II软核处理器系统配置窗口。


Nios II软核处理器系统配置窗口右侧为目标器件“Target”的系列名称“Device Family”,这个系列名称建议由创建Quartus II工程时选择的具体目标器件来决定。“Target”的右侧用来设置Nios II软核处理器的系统时钟“Clock Setting”。设置的时钟频率必须与处理器在工作时实际使用的时钟频率一致,若没有,则单击“Add”添加系统时钟,还可以设置多个。

1.2 配置Nios II软核处理器系统

1配置Nios II软核处理器

在如上图所示的Nios II软核处理器系统配置窗口的“System Contents”选项卡中,选择“Nios II Processor”,单击选项卡中的“Add”按钮将出现如下图所示的Nios II软核处理器“Nios II Processor”配置窗口。Nios II软核处理器具有3种类型:经济型内核“Nios II/e”、标准型内核“Nios II/s”和快速型内核“Nios II/f”。不同类型的处理器内核具有不同的功能和技术指标,当然在获得强功能和高技术指标的同时也需要付出较多的逻辑资源,同时使用过程也变得复杂。鉴于这里控制18个发光二级管的任务比较简单,系统工作速度也不需要很高,因此选择经济型内核“Nios II/e”。在选择经济型内核“Nios II/e”的情况下,不能向处理器添加硬件乘法器和硬件除法器,因此这些设备对应的选项无效。复位矢量“Reset Vector”和异常矢量“Exception Vector”指向的储存器及地址需要在完成处理器配置之后才能设置。

配置一个最简单的Nios II软核处理器系统还需要设置“JTAG Debug Module”选项卡中的内容,如下图所示。在选择经济型内核“Nios II/e”的情况下,处理器只支持“Level 1”级的JTAG调试模块。必须选择这个最基本的调试模块,本实验将利用该模块支持对FPGA芯片的配置。


完成Nios II软核处理器“Nios II processor”配置窗口的“Core Nios II”选项卡和“JTAG Debug Module”选项卡的配置后,单击“Finish”,回到Nios II软核处理器系统配置窗口。选择条目在处理器“cpu_0”,单击鼠标右键可以打开一个浮动菜单,选择菜单中的“Rename”命令可以对在处理器进行重命名,我们将其重命名为“cpu”。

2配置储存器

使用FPGA芯片提供的逻辑资源形成储存器,包括程序储存器和数据储存器,可以降低系统的设计难度、制作成本及系统体积。在Nios II软核处理器系统配置窗口的“System Contents”选项卡中,由菜单“Memories and Memory ControllersOn - Chip → On - Chip - MemoryRAM or ROM)”可以打开在片储存器配置对话框。

进行程序储存器(ROM)的配置时,在该对话框的储存器类型“Memory type”栏目中选中“ROMRead-only”;在FPGA芯片的嵌入式阵列块的类型“Block type”下拉菜单中选择“Auto”,表示由开发软件根据目标芯片型号自动选择;选中“Initialize memory content”,表示储存器在FPGA配置时将装入程序代码。在“Size”栏目中,将数据宽度“Date width”下拉菜单设置为“32”;在储存器容量“Total memory size”文本框中输入4096,单位选择“Bytes”。对话框的其他内容保持默认状态。注意,实际需要的储存器容量取决于处理器控制程序的大小,需要根据具体情况进行配置。完成之后,单击对话框右下角的“Finish”按钮完成程序储存器(ROM)的配置,回到Nios II软核处理器系统配置窗口。我们将储存器“onchip_mem”重命名为“program”,使其功能一目了然。

配置数据储存器(RAM)的方法与配置程序储存器(ROM)的方法类似。在对话框的储存器类型“Memory type”栏目中选中“RAMWritable”;在FPGA芯片的嵌入式阵列块的类型“Block type”下拉菜单中选择“Auto”;注意,现在不需要选中“Initialize memory content”。在“Size”栏目中,将数据宽度“Date width”下拉菜单设置为“32”;在储存器容量“Total memory size”文本框中输入4096,单位选择“Bytes”。对话框的其他内容保持默认状态。单击对话框右下角的“Finish”按钮完成程序储存器(RAM)的配置,回到Nios II软核处理器系统配置窗口。并将完成配置的数据储存器(RAM)重命名为“data”。

完成储存器配置的Nios II软核处理器系统配置窗口如下图所示,这里程序储存器被命名为“program”,数据储存器被命名为“data”。开发软件将自动完成处理器“cpu”与储存器的硬件连接,不需要设计者干预。

3配置并行输入/输出端口

Nios II软核处理器通过并行输入/输出(PIO)内核控制发光二极管。在Nios II软核处理器系统配置窗口的“System Contents”选项卡中,由菜单“PeripheralsMicrocontroller PeripheralsPIOParallel I/O)”可以打开并行输入/输出(PIO)内核的配置对话框。

可在并行输入/输出(PIO)内核的配置对话框中的基本设置“Basic Settings”选项卡中完成端口宽度“Witch”和信号传输方向“Direction”的设置。这里选择端口宽度为18位,信号传输方向为单向输出端口“Onput ports only”。上述工作完成后,单击“Finish”按钮完成所需要的并行输入/输出(PIO)内核的配置。在Nios II软核处理器系统配置窗口中,将并行输入/输出(PIO)内核重新命名为“led18_pio”。

完成Nios II软核处理器、储存器及并行输入/输出(PIO)内核的配置以后,Nios II软核处理器系统配置窗口中的系统组成如下图所示。


2  产生Nios II软核处理器系统

2.1 产生Nios II软核处理器系统模块

在配置Nios II软核处理器时复位矢量“Reset Vector”和异常矢量“Exception Vector”指向的储存器及地址没有设置,现在对其进行设置。

在Nios II软核处理器系统配置窗口中通过双击“cpu”条目可以再次打开图5.5所示的Nios II软核处理器“Nios II processor”配置窗口。在复位矢量“Reset Vector”的储存器“memory”下拉菜单中选择“program”,即程序储存器;在异常矢量“Exception Vector”的储存器“memory”下拉菜单中选择“data”,即数据储存器。两者的偏移地址“Offset”可以直接采用默认值。然后单击“Finish”完成Nios II软核处理器的完全配置。

上述工作完成以后,在Nios II软核处理器系统配置窗口中通过单击“Generate”按钮开始Nios II软核处理器系统“led18_cpu”的产生过程。当提示是否储存时,选择储存“Save”。这个产生过程需要一段时间,请等待。产生过程中会出现一系列相关信息,当显示信息“System generation was successful”时,表示这个产生过程完成。通过单击Nios II软核处理器系统配置窗口中的“Exit”按钮退出SOPC Builder软核处理器系统开发工具。

2.2 Nios II软核处理器系统的产生

在原理图编辑窗口中单击鼠标右键将打开一个浮动菜单,选择“InsertSymbol”命令打开电路符号“Symbol”选择对话框。在对话框左侧的“Libraries”选择栏中选择“led18_cpu”,右边的符号窗口将出现对应的电路符号。这个模块就是SOPC Builder工具产生的Nios II软核处理器系统。单击对话框左下角的“OK”按钮将把这个电路符号放入原理图编辑窗口。如下图所示为完成所需要的引脚放置、连接及命名后的电路原理图。FPGA芯片的引脚“sys_clk”应该与时钟产生电路的时钟输入端连接;Nios II软核处理器系统“led18_cpu”的复位信号输入端“reset_n”与电源符号“VCC”连接,当芯片上电时自动完成处理器的复位;FPGA芯片的引脚“led18_pio[17...0]”分别与18个发光二级管连接。

3 创建Nios II IDE环境下的应用工程

3.1 Nios II IDE工程创建

Nios II集成开发环境(Nios II IDE)的软件开发工作需要前面产生的Nios II软核处理器系统硬件的支持。在Quartus II原理图编辑窗口中通过双击Nios II软核处理器(led18_cpu)符号再次打开SOPC Builder。在“System Generation”选项卡的“Nios II Tools”栏目中单击“Nios II IDE”按钮可以打开Nios II IDE开发平台,如下图所示。利用这种方法打开的Nios II集成开发环境将自动地与产生的Nios II处理器系统建立关联。


Nios II IDE启动完成以后,如下图所示的C语言开发窗口“Nios II C/C++”被打开,利用这个环境,设计者可以进行C语言程序的编辑、编译及调试。

现在准备创建Nios II IDE环境下的应用工程。如果C语言开发窗口的“Nios II C/C++ Projects”栏目中还具有其他项目,为避免不必要的麻烦建议将其删除,使这个栏目呈现如下图所示的状态。


由Nios II C/C++菜单“FileNewNios II C/C++ Application”打开新工程设置窗口。Nios II IDE提供了许多设计模板,在菜单“Select Project Template”中可以选择参考模板。这里选择“Blank_project”,该模板提供了一个空工程。由于Nios II IDE是在SOPC Builder中打开的,因此选择目标硬件栏目“Select Target Hardware”的内容已经被自动填写。


通过单击“Finish”按钮关闭新工程设置窗口,回到C语言开发窗口。

3.2 C语言源文件的编辑

由Nios II C/C++菜单“FileNewSource File”可以打开新源文件设置窗口,如下图所示。该设置窗口中的源文件从属的工程“Source Folder”和源文件名称“Source File”这两个文本框需要填写。通过单击“Finish”按钮关闭新源文件设置窗口,回到C语言开发窗口。

在C语言文本编辑窗口“led18.c”完成C语言源程序的输入,这段程序的清单如下:

/* code */

#include "system.h"
#include "altera_avalon_pio_regs.h"
void delay(void);
int alt_main(void)
{
    unsigned char led_data;
    unsigned int led_code;
    while(1)
    {
        for(led_data=0;led_data<18;led_data++)
            {
                led_code = 0x01 << led_data;
IOWR_ALTERA_AVALON_PIO_DATA(LED18_PIO_BASE,led_code);
                delay();
            }
    }
    return 0;
}
void delay(void)
{
    unsigned int i;
    i = 1000000;
    while(i>0)
    {
        i--;
    }
}

3.3 C语言源文件的编译

对“led18.c”源程序进行编译之前,需要对连接器中部分配置的默认值进行修改。在“Nios II C/C++ Projects”栏目中选择“blank_project_0”条目,单击鼠标右键将打开一个浮动菜单,选择其中的“System Library Properties”命令就可以打开如下图所示的应用系统库特性设置窗口。

现在只需要对“Linker Script”选择栏的相关内容进行修改即可:选择“Use auto - generated linker script”选项;设置“Program memory.text”下拉菜单为“program”,把C语言程序定位于前面利用SOPC Builder工具为Nios II软核处理器系统配置的程序储存器“program”;其他内容定位于数据储存器“data”。完成后,单击“OK”返回C语言开发窗口。

在C语言程序开发窗口中,由菜单“ProjectBuild Project”可以开始C语言源程序“led18.c”的编译。编译过程需要一段时间。随着工作进行,在“console”栏目中将显示编译信息。如果给出错误,则需要纠正,然后重新编译,直到成功。如图5.22所示。

C语言源程序编译完成后,“console”栏目将给出储存器的占用情况。

4 C语言源程序的调试

4.1 在目标电路板上运行程序

在利用Nios II IDE运行完成编译的C语言源程序以前,需要把利用Quartus II完成编译的Nios II软核处理器系统配置到目标FPGA芯片上。本次实验使用Altera公司提供的DE2电路板。源程序“led18.c”将要控制的发光二极管在电路板上已经与Cyclone II系列EP2C35F672C6FPGA芯片完成连接,因此这里能够完成目标芯片引脚的指定。如图5.23所示的Quartus II开发软件窗口中,Nios II软核处理器系统“led18_cpu”原理图已经完成了芯片引脚的指定。注意,在完成FPGA芯片对应引脚的指定以后,需要再次进行编译,才能对目标FPGA芯片进行配置。

在如图5.23所示的Quartus II开发软件窗口中,由菜单“ToolsProgrammer”可以打开编程/配置窗口,利用该窗口就可以完成Nios II软核处理器系统“led18_cpu”对目标FPGA芯片的配置。在这里需要正确选择下载线的类型和下载模式,DE2电路板采用USB-Blaster接口的下载线,下载模式为JTAG

完成目标芯片的配置以后,回到C语言开发窗口“Nios II C/C++”。首先由菜单“RunRun”打开如下图所示的运行设置窗口。

在窗口左边的“type filter text”栏目选择当前工程的硬件配置“blank_project_0 Nios II HW confihuration”,窗口右边有包括目标连接“Target Connection”、调试“Debugger”等在内的5个选项卡。

选择目标连接“Target Connection”选项卡,如图5.24所示。在“Target Connection”选项卡中,将“JTAG cable”下拉菜单设置为“USB-Blaster”;将“JTAG device”下拉菜单设置为“automatic”。

选择调试“Debugger”选项卡,如下图所示。在“Download and Reset”栏目中选择“Download program to RAM”,在“Breakpoints at Start-up”栏目中选择“Break at alt_main()”。

配置窗口的其他内容保持默认状态。最后通过单击配置窗口右下脚的“Run”按钮开始C语言程序代码向目标电路板的下载。下载完成之后(DE2开发板必须处理工作状态,注意下载时间比较长),DE2电路板上的发光二极管在程序的控制下将依次点亮。

4.2 配置目标FPGA器件

前面讲的是在C语言开发窗口“Nios II C/C++”中完成C语言源程序“led18.c”的运行。在Quartus II软件开发窗口下也可以完成C语言源程序向目标FPGA芯片的下载及运行。

完成C语言源程序的编译后,再次回到Quartus II原理图输入窗口,并再次对原理图输入文件进行编译。编译完成后,下载到DE2电路板上,将看到发光二极管在程序的控制下依次点亮。


参考文献:赫建国 倪德克 郑燕编著《基于Nios II内核的FPGA电路系统设计》电子工业出版社。


你可能感兴趣的:(Nios,II)