8.3  基于NIOS II的开发设计流程

NIOS II使用NIOS II IDE集成开发环境来完成整个软件工程的编辑、编译、调试和下载。在采用NIOS处理器设计嵌入式系统时,通常会按照以下步骤。

 

(1)分析系统需求说明,包括功能需求和性能约束等。

(2)根据分析结果,选择片外外设或片内IP(知识产权核)。除此以外,还要对选择的IP和外设进行初步性能评估,以保证能够满足系统需求。

(3)设定IP和系统参数。

(4)确定系统互联逻辑,分配FPGA的引脚等。

(5)结合NIOS提供的软件开发包进行软件开发。

 

8.3.1  硬件开发流程

首先来看一下NIOS的硬件系统组成。

 

1.NIOS硬件组成

如图8.2所示为典型NIOS II系统的硬件组成。

图8.2  NIOS II系统的硬件组成

 

如图8.3所示为典型NIOS CPU的系统框图。

图8.3  NIOS CPU系统框图

 

我们可以将图8.3的系统结构划分如下。

其中,片内逻辑是指实现在FPGA内部的电路设计,系统模块指的是由SOPC Builder自动生成的设计。

 

SOPC Builder会根据用户选择的IP生成相应的HDL描述文件(系统模块文件),这些文件与用户逻辑区域内的设计描述文件一起由Quartus软件综合,然后下载到FPGA内,这样就构成了系统的硬件基础。

 

系统模块包含至少一个Avalon主外设和整个Avalon总线模块。系统模块通常还包含一些Avalon从外设,例如UART、PIO和定时器等。SOPC Builder可以帮助设计者从IP库寻找合适的IP并很快地集成一个系统,它采用图形用户界面(GUI)显示和组织IP模块,能够自动生成IP模块互连逻辑以及生成用于综合和模拟的文件,使得设计者可以轻松完成系统设计。

 

当用户使用SOPC Builder创建一个新的系统时,SOPC Builder会为该系统自动生成一个PTF文件,所有的设计信息都存储在该PTF文件里。当使用SOPC Builder重新打开一个已有的系统时,SOPC Builder会从并且只从PTF文件中读取系统具体设计信息。

 

用户逻辑区内可以包含用户自定义的Avalon外设,以及同系统模块无关的其他的用户自定义逻辑。硬件系统建立起来以后,用户可以利用Altera公司提供的NIOS II IDE工具结合SOPC Builder生成的与硬件系统对应的软件开发包来开发用户软件。

 

下面介绍使用这些设计工具进行NIOS II开发的流程。

 

2.NIOS II硬件开发流程

下面是NIOS II硬件开发流程的主要步骤。

·  用SOPC Builder来选择合适的CPU、存储器及外围器件,比如片内存储器、PIO、UART和片外存储器接口。

·  使用Quartus II软件选取具体的器件,并对SOPC Builder生成HDL设计文件进行布局布线;再根据开发板分配I/O管脚;编译完后生成适合目标器件的网表。

·  使用下载电缆将配置文件下载到开发板上。当校验硬件或时钟完毕后,就可以开始软件开发工作了。

 

下面这个例子将要添加一个NIOS II系统得所有硬件部分,主要包括以下内容。

(1)选择CPU。

选择NIOS II/e经济型处理器,其特点是占用逻辑资源少,编译速度快,不包括缓存,如图8.4所示。

图8.4  选择NIOS II处理器

 

(2)选择JTAG调试模块。

选择第一层JTAG硬件调试模块,如图8.5所示。

图8.5  选择JTAG调试模块

 

(3)设置JTAG UART接口。

它是NIOS II系统嵌入式处理器新添加的接口元件,通过内嵌在Altera FPGA内部的联合测试行动组(JTAG)电路,在PC主机和FPGA之间进行串行字符流通信。特点是在运行时在调试区输入信息可以与FPGA进行交互。

如图8.6所示,使用默认选项即可。

 

(4)设置定时器。

如图8.7所示,定时器对于HAL系统库中的器件驱动非常有用,比如JTAG UART驱动使用定时器来实现10s的暂停。选择Interval timer在设置向导中周期选择1msec,预设置(Preset Configurations)中选择Full-featured。

   

 图8.6  JTAG UART 接口                  图8.7  Avalon总线定时器

 

(5)添加外部Flash。

设置Flash地址宽度为20bits,带宽为16bits,如图8.8所示。

图8.8  添加外部Flash

图8.8  添加外部Flash(续)

 

如果用户程序和数据比较大,超出了EPCS1的容量,则程序和数据可以保存在普通Flash中。Flash的烧写可以采用NIOS II IDE的“Flash Programmer”来烧写,具体操作过程请参考/altera/kits/NIOS2/documents目录下“ug_NIOS2_flash_programmer.pdf”。

 

(6)添加外部SDRAM。

通常的系统都需要用户指定一个内存空间,这个内存是指RAM,可以是片上的,也可以是片外的SDRAM或SRAM等。如果用户程序较大,超出了EP1C20所能定制的最大片上RAM容量,则也可以将程序放在SDRAM中运行。

将SDRAM进行如图8.9所示的设置。

   

图8.9  添加外部SDRAM

 

(7)设置Avalon外部总线。

软件使用Avalon接口来连接片上元件和Avalon主从端口的。在NIOS开发板上,要实现NIOS系统与FPGA片外存储器通信,就必须在Avalon总线和连接外部存储器的总线之间添加一个桥,这个桥就是Avalon三态总线。

在如图8.10中选择为Avalon外部总线添加寄存器。

 

(8)添加串行通信设备UART。

通用串行总线RS-232协议是我们最常用的通信协议,所以把它也添加到我们的系统里。注意选择所需的数据帧格式,如图8.11所示。

    

图8.10  设置Avalon外部总线          图8.11  添加串行通信设备UART

 

(9)添加LCD显示。

使用标准16027字符型液晶显示器。

 

(10)添加片上RAM。

如图8.12所示,为SOPC系统添加片上RAM资源,并设置RAM参数。

 

(11)添加system id。

 

(12)添加8个LED和输入设备按键开关。

以上几个步骤包含了一个标准SOPC一般所需要的设备,根据下面信息栏中的提示把RAM的数据线连接到总线上。接下来指定Flash地址为基地址,自动分配基地址及中断。

最后完成的SOPC模块如图8.13所示。

接下来就可以在Quartus II中搭建完整的系统,加入锁相环、定义管脚等,并进行编译。这部分的内容详见本书其他章节的介绍。

 

需要注意的是由于Flash与SRAM共用一条数据总线,所以要把SRAM的片选关闭,如图8.14所示。

至此,整体SOPC硬件系统搭建完毕,其原理图如图8.15所示。

 

这样一个硬件系统规模已经比较完整了,可以作一些设计,比如Flash读写、液晶显示、串口传输等功能。把这些集合起来就可以用C++软件编写一个简单的图像处理算法。

下面介绍一下SOPC系统的软件开发流程。

图8.13  建立的SOPC模块

图8.14  关闭SRAM片选

图8.15  SOPC系统原理图

 

8.3.2  软件开发流程

系统软件设计具体工作如下。

(1)在用SOPC Builder系统集成软件进行硬件设计同时,开始编写C/C++软件,比如算法或控制程序。用户可以使用现成的软件库和开放的操作系统内核加快开发进程。

(2)在NIOS II IDE中建立新的软件工程时,IDE会根据SOPC Builder对系统的硬件配置自动定制HAL(硬件抽象层)系统库。这个系统库可以为程序和底层硬件的通信提供接口驱动程序。

(3)使用NIOS II IDE编译调试软件。

(4)在硬件逻辑已经下载到开发板的基础上将软件下载到开发板上并在硬件上运行。

 

下面主要介绍使用SOPC Builder来为一个NIOSⅡ嵌入式处理器系统进行软件开发的过程,具体实现过程如下。

(1)进行硬件开发,如8.3.1小节所示。

(2)启动NIOS II IDE。

 

首先在Alter SOPC Builder中,单击Run NIOS II IDE,启动NIOS II IDE,如图8.16所示。

图8.16  NIOS II IDE界面

 

(3)新建软件工程。

选择“File”菜单的“New”菜单的“Project”选项,开启“New Project”对话框,选择“C/C++Application”,如图8.17所示。

 

(4)选择软件模板。

在新建软件工程对话框中单击“Next”按钮,为SOPC系统选择软件模板,如图8.18所示。

   

图8.17  新建软件工程                   图8.18  选择软件模板

 

(5)获取SOPC系统信息。

单击“SOPC Builder System”右边的“Browse”按钮打开目录对话框,从该工程目录下找到“NIOS II_c.ptf”,因为NIOS II IDE必须从这个文件获取该系统的相关信息。打开该文件后,界面显示如图8.19所示。

图8.19  新建的软件工程

 

单击“Finish”按钮,即可建立一个名为Hello_LED_0的软件模板工程。

(6)编辑软件代码。

(7)设置工程优化级别。

编译之前我们先对项目进行一些设置,以使编译器编译出更高效、占用空间更小的代码。右键单击工程名称,在弹出的菜单中选择“Properties”选项,如图8.20所示。

 

图8.20  设置工程属性

单击后打开工程属性对话框,在“Configuration Settings”点击“General”页面,在“Optimization Level”(优化级别)中选择“Optimize size(-Os)”,如图8.21所示。

 

图8.21  工程优化级别

 

(8)设置系统库属性。

右键单击*_syslib[NIOS II_c]工程名称,在弹出的菜单中选择“Properties”选项,如图8.22所示。

图8.22  设置系统库属性

 

在系统库工程属性对话框中,同样在“Configuration Settings”点击“General”页面,在“Optimization Level”中选择“Optimize size(-Os)”,如图8.23所示。

图8.23  系统库工程优化级别

 

然后,单击该对话框左侧的“System Library”打开“System Library”属性页面。将“Max file descriptors:”栏改为4,清除“Clean exit(flush buffers)”和“Link with profiling library”,选上“Reduced device drivers”和“Small C library”,如图8.24所示。

单击“OK”按钮,完成设置。以上设置主要目的是为了优化程序,并减少程序占用内存空间。

图8.24  设置系统库其他属性

 

(9)编译。

右键单击工程,在弹出的菜单中选择“Build Project”选项,开始进行软件工程编译(为使编译过程更加顺利,此时最好关闭杀毒软件和其他占用电脑资源较大的软件)。

如果工程设计无误,可以看到以下信息:“Build completed”。如果看到了该条提示,表示软件编译成功,可以看到程序占用空间等信息。

 

(10)调试。

将ByteBlasterII下载线接到FPGA实验平台的JTAG口,接上5V电源。选择“Run”菜单下的“Debug As”选项,选择“NIOS II Hardware”,如图8.26所示。

图8.26  打开调试界面

 

选择后,NIOS II IDE会打开调试界面(Debug Perspective)。可以在程序中设置断点,运行停止在断点处(图8.27的箭头处),如图8.27所示。

图8.27  调试至断点

 

单击继续执行(Resume)按钮,程序就会继续运行。单击暂停按钮,程序暂停运行。单击停止按钮,将退出运行,如图8.28所示。

图8.28  调试按钮

如需对程序进行修改,单击停止按钮退出运行,然后单击如图8.29所示的按钮回到C/C++编辑界面。

选择后,即可返回程序编辑界面修改代码,然后后再重复上述调试过程。

 

(11)编译并下载。

编写完软件工程后,我们还要回到QuartusⅡ里面对整个系统进行编译。选择“Processing”菜单下面的“Star Compilation”。编译成功以后我们就可以选择“Tools”菜单里面的“Programmer”,下载整个配置到FPGA中去了。

至此整个SOPC系统的软硬件开发流程就已经介绍完毕。读者可以动手设计自己的SOPC系统了。