一基于FPGA内部RAM的简单NiosII系统.docx
- 文档编号:4547717
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:43
- 大小:1.76MB
一基于FPGA内部RAM的简单NiosII系统.docx
《一基于FPGA内部RAM的简单NiosII系统.docx》由会员分享,可在线阅读,更多相关《一基于FPGA内部RAM的简单NiosII系统.docx(43页珍藏版)》请在冰豆网上搜索。
一基于FPGA内部RAM的简单NiosII系统
第1章SOPC硬件系统基础实验
本章的目的是让读者熟悉SOPC硬件系统的构建流程及SOPCBuilder和NiosIIIDE的基本操作。
这是SOPC系统开发的基础,读者务必熟练掌握。
图1.1一般核心板构造
图1.1展示的是一般核心板的组成。
JTAG口用于配置和调试用,EPCS口用于AS配置模式。
EPCS是一种串行配置芯片,实际上是一种串行Flash,存储完配置文件后的剩余空间可用于存储程序。
目前市面上的很多核心都只配一个容量稍为大一些的EPCS而不使用并行Flash,这样可以节省大约40个I/O口.图中的FLASH和SDRAM并不是核心本身所必需的,只是为了方便开发NiosII系统而增加的,因为FPGA内部的RAM比较小,不适合开发大的程序.
1.1基于FPGA内部RAM的简单NiosII系统
1。
实验目的
(1)熟悉NiosII系统的构成及开发流程;
(2)熟悉SOPCBuilder和NiosIIIDE的使用;
(3)本节内容是后面内容的基础,在后面的实验里对本节的一些基本操作将不再详细阐述,读者若有疑问可返回本节查阅。
2。
实验现象
两个LED灯交替闪烁。
3。
实验原理
控制两个LED灯交替闪烁的程序代码比较小,因此可以将其固化在内部ROM内,系统复位时把其读入内部RAM运行。
说到这,读者是否有似曾相识的感觉呢?
其实我们天天用的计算机也是这么操作的。
ROM相当于硬盘,RAM相当于内存,之后的实验将用到的FLASH和SDRAM也一样,FLASH相当于硬盘,SDRAM相当于内存。
各自的作用大家也应该很熟悉了吧,FLASH属于非易失性的存储器,可以存储程序及其他一些数据文件等,但访问比较慢;SDRAM属于易失性存储器,但访问的速度比较快,系统复位时会把程序复制到SDRAM可以提高程序的运行速度(需要说明一点,系统复位时从哪复制程序取决于在定制NiosII处理器时复位地址设置为在哪,复制到哪取决于把程序代码空间设置为在哪,在后面的实验将详细说明).
原理图如图1。
1.1所示
图1.1.1
由图1.1。
1我们可以得到如表1。
1。
1所示的外设一览表:
表1.1。
1
外设名称
描述
备注
cpu
NiosII/eDebugModule=Level1
sysid
系统ID
系统的唯一标识
OnChip_ROM
片内ROM
8KB
OnChip_RAM
片内RAM
8KB
led_pio
2位只输出
控制LED
4。
实验内容
(1)在QuartusII中建立一个工程;
(2)使用SOPCBuilder建立生成一个一个具有表1.1.1所示元件的硬件系统;
(3)在QuartusII工程中建立基于NiosII的硬件系统并编译生成配置文件*.sof;
(4)在NiosIIIDE中建立对应硬件系统的NiosIIC/C++Application,编写程序实现LED闪烁,在NiosIIIDE中编译程序生成执行文件*。
elf;
(5)将配置文件*.sof和可执行文件*。
elf都下载到FPGA进行调试。
5。
实验步骤
1)使用QuartusII建立工程
QuartusII是以工程的方式对设计过程进行管理,QuartusII工程中存放创建FPGA配置文件需要的所有设置和设计文件。
因此,每个开发过程开始时都应建立一个QuartusII工程并存放在单独的文件夹下。
(1)打开QuartusII并新建工程
在QuartusII主界面中选择File→NewProjectWizard.。
.(如图1.1。
2),此时将打开新工程设计向导,如图1.1.2~图1.1.6,按如图所示并根据自己的实际情况进行设置.
图1。
1.2
图1。
1。
3工程路径、名称、顶层实体指定对话框
文件夹所在路径名不能用空格,不能用括号“()",可以用下划线“_”,最好不要以数字开头或使用中文名。
图1。
1.4添加文件对话框
若有设计好的模块需要在该工程中使用可事先在此处加入工程中,本次设计不添加。
图1.1。
5选择FPGA型号对话框
型号必需与所使用的核心板上的型号一致
图1。
1。
6EDA工具设置对话框
如果要利用其他工具综合,仿真,时序分析的话在此处具体指定
图1。
1。
7配置信息报告框
(2)建立顶层模块
顶层模块是为了将各个模块组合起来。
在QuartusII主界面中选择File→New。
..新建原理图格式设计输入文件并保存。
如图1.1。
8~图1。
1.11所示.
图1.1。
8
新建文件菜单,不要与新建工程混淆了
图1。
1。
9
选择新建文件类型,本设计顶层采用原理图的形式,选择BlockDiagram/SchematicFile
图1.1.10
由于新建的文件没有做任何改变,Save选项不可用,帮我们选SaveAs…
图1。
1。
11另存为对话框
至此,QuartusII主界面下工作先告一段落,不过需要提醒读者,务必按照前言所要求将未使用的管脚设置为“Asinputtri—stated”,下面我们进入SOPCBuilder进行NiosII系统定制。
2)使用SOPCBuilder创建NiosII系统
(1)启动SOPCBuilder
启动SOPCBuilder有两种方法,一种是巡边员图1.1。
12所示从菜单启动,另一种是
如图1.1.13所示从工具栏启动。
不过需要提醒一下读者,只有QuartusII打开一个工程SOPCBuilder才可以启动,否则这两项均无效。
如果打开的工程已经建立过一个NiosII系统,启动后将直接进入SOPCBuilder主界面,否则启动后出现如图1.1。
14所示CreatNewSystem对话框.在对话框输入系统名称,注意该名称不能与顶层文件名相同,否则无法加入到顶层模块中。
在此处可以选择用VerilogHDL还是VHDL描述所定制的系统,读者可以根据自己的习惯进行选择。
对话框设置完毕后进入如图1。
1。
15所示的界面。
图1.1.12启动SOPCBuilder菜单
图1.1.13工具栏启动SOPCBuilder
图1.1。
14NiosII系统名称及目标描述语言
系统名为niosii,选择Verilog
图1.1。
15SOPCBuilder主界面
(2)指定目标FPGA和时钟设置
根据读者所使用的FPGA型号选择器件系列.在定制系统之前,还需要指定系统的时钟频率。
SOPCBuilder将根据这一频率产生时钟分步或波特率等。
因此,所设置的时钟频率一定要与实际接入NiosII系统的时钟相对应,一般为核心板上的晶振提供的时钟频率,如果设计者在FPGA内部倍频后再输入NiosII系统,则需要进行相应设置.
(3)添加NiosII处理器内核
双击可用元件列表里的NiosIIProcess(图1.1.16)即可弹出NiosII处理器内核设置向导,参考图1。
1。
17~图1。
1.22。
因为我们选用的是NiosII/e处理器,所以图1.1。
18~图1.1.20均不可设置,图1.1。
21在JTAG调试模块可选无或Level1,此处选Level1以进行调试。
图1.1。
22是添加用户指令用的,本实验不添加,故也不进行任何操作,直接点Finish完成NiosII处理定制。
图1.1.16
图1。
1.17处理器类型选择
处理器内核有3种类型,分别是经济型(NiosII/e)、标准型(NiosII/s)和快速型(NiosII/f)。
性能依次提高但所占的逻辑单元则依次增加,因为在具体设计中应根据自己器件的资源和系统要求进行合理选择。
本实验比较简单,故选择经济型。
为了比较性能和所占的资源,读者可以选择标准型或快速型重新做做一次本实验,观察实验现象有何不同。
另外,可以看到信息栏有一个警告信息,这是因为在定制处理器时需要我们指定复位向量的存储地址和异常向量的存储地址。
因为我们还没添加存储器,所以暂时无法设置,等添加存储器后再返回此处进行设置。
所谓的复位地址就是CPU复位时从哪读程序,异常地址是用于存储异常向量的。
图1。
1。
18指令和数据缓存设置
添加缓存可以提高CPU的运行效率,但会让程序的运行时间变得不可预测.
图1.1。
19
图1。
1.20
图1.1。
21
JTAG调试模块要占用较多的逻辑单元,如果整个系统已经调试完毕,可以选用NoDebugger,以减小系统占用资源。
JTAG调试模块根据功能不同,分成4级。
本实验选择“Level1”,支持软件断点调试.
图1.1。
22
用户自己定制指令可以把原需要软件完成的任务交给硬件处理以提高运算速度
(4)添加系统ID
如果系统包括系统ID外设,则当SOPCBuilder生成NiosII系统时,将为NiosII系统生成一个标识符,供IDE编译器和用户辨别所运行的程序是否与目标系统匹配。
若不匹配,将阻止用户下载程序到NiosII系统。
双击可用元件列表里SystemIDPeripheral(图1。
1.23)将弹出系统ID配置对话框(图1。
1。
24),系统ID没有需要用户配置的选项,不过可以看到信息栏里有一个警告,要求我们把该元件名命名为“sysid”(默认的是“sysid_0")。
图1。
1。
23
图1。
1。
24
(5)添加片内ROM
实际上FPGA内部并没有ROM,所谓的ROM是通过对RAM初始化实现的。
本实验添加ROM用于存储程序文件。
双击可用元件列表里的“On—ChipMemory(RAMorROM)”(如图1。
1。
25)即弹出图1。
1。
26所示的ROM设置对话框,按如图所示进行设置。
实际上,设置得越大,可存储的程序代码越大,但是每一款的FPGA内部RAM是有限的,所以要依据实际器件进行合理设置.设置完成后将该元件重命名为onchip_rom(图1.1。
27)。
图1.1。
25
图1。
1。
26ROM设置对话框
前面说过,FPGA内部实际上并没有ROM,而是通过对RAM初始化实现的,那么这具体是怎么样的一个过程呢?
实际上,在NiosIIIDE成功编译工程后将生成与SOPCBuilder里定制的ROM元件名相同的*.hex文件,对于本例是onchiprom。
hex.而在图1。
1。
26中可以看到有一个“Initializememorycontent"选项,当该选项选上时,“Memorywillbeinitializedfromonchiprom.hex”即在QuartusII里编译时ROM将用该文件初始化.由此可以知道,用NiosIIIDE调试好软件后再次编译QuartusII工程,程序文件就会被固化在ROM内,实际上相当于把可执行程序下载到CPU内.读者可以做这样的两个实验对比:
1、在建立NiosII应用程序之前将*.sof配置文件下载到FPGA内,观察现象;2、先建立NiosII应用程序并编译成功,然后重新编译QuartusII工程,最后下载*.sof配置文件至FPGA,观察现象.如果你的操作没有错误的话,你可以观察到前者LED不闪烁,而后一实验LED灯会闪烁。
图1.1.27重命名为onchiprom
(6)添加片内RAM
RAM的设置与ROM大致相同,同样如图1.1。
25所示操作可弹出图1。
1。
28所示的ROM设置对话框,按如图所示进行设置,然后,按图1。
1。
27所示进行重命名为onchipram。
图1.1。
28RAM设置对话
(7)添加PIO外设
PIO外设是CPU与外界通信的最基本的单元,双击可用元件列表里的PIO(ParallelI/O)(如图1。
1。
29所示)即可打开PIO的设置向导,共有3个标签页可设置(图1.1.30~图1.1.32).
图1.1.29
图1.1.30
图1.1.31
图1。
1.32
输入口仿真时的输入值设置,若不进行仿真此处可不设置
在图1。
1。
30共有3个参数可以设置:
Width(位宽),Direction(方向),OutputPortResetValue(输出口复位时的默认值)。
当PIO只具有输出属性时只有图1。
1.30标签页可设置,图1。
1.31和图1.1.32均是针对具有输入属性的端口进行设置的。
对于图1.1。
30的每一种方向具体含义如图1.1。
33所示。
特别提醒一点,双向端口对外呈绿色,添加输入输出引脚时就使用Bidir(图1。
1。
34),这在后面添加SDRAM和FLASH时将使用到,因为SDRAM和FLASH的数据口是双向的。
在图1.1.31中有两个参数可以设置,边沿捕获寄存器和中断设置,设计者可以自己决定输入口是否要生成边沿捕获寄存器及什么样的边沿和是否产生中断及什么类型的中断.如果采用的是电平触发的中断,可以不需要边沿捕获寄存器,如果是边沿触发则必须有边沿捕获寄存器。
图1。
1.33
图1。
1.34
本次实验的目的是控制两个LED灯交替闪烁,因此我们只添加2位的只输出端口,如图1.1.30所示,并命名为led_pio(该名字具体有重要的应用,在后面的软件编程时将具体介绍,实际上SOPCBuilder里定制的元件的命名都是软件编程里访问的接口).
(8)设置复位地址和异常向量地址
在第(3)步中我们说过(图1.1。
17),由于没有添加存储器,复位地址和异常向量地址无法设置,该步的目的是完成这一过程.如图1.1.35所示,复位地址设置为onchip_rom,异常向量地址设置为onchip_ram.Offset采用默认的,不过由于这两个地址使用的是不同的存储器,所心从合理利用资源的角度出发应该把异常向量地址的Offset设置为0x0。
图1.1。
35
(9)分配基地址和中断优先级
这两步均可以采用自动分配的方式(图1。
1。
36),对于基地址,采用自动分配一般可以满足我们的需求,而中断优先级则不建议使用自己分配设计者应该根据自己系统的实际进行设置。
NiosII最多允许32个中断。
至此我们已经完成了整个NiosII系统的定制,整个系统如图1.1。
37所示。
直接点Generate则SOPCBuilder将根据设计的设置生成相关的设计文件以供QuartusII和NiosIIIDE使用。
生成成功后将显示如图1.1.38所示的信息,若有错误请返回检查直至无错。
退出SOPCBuilder,在QuartusII添加符号的对话框里将出现设计者定制的NiosII系统的元件符号(图1.1。
39)。
同时在工程文件夹里有对应的系统文件niosii。
ptf和硬件描述语言niosii。
v及其他外设对应的HDL文件。
图1.1.36
图1.1。
37
图1。
1。
38
图1.1.39
3)集成NiosII系统到QuartusII工程
将图1.1.39所示的元件符号加入到QuartusII工程的顶层文件,添加相应的引脚并重命名,如图1.1。
40所示。
分配管脚并编译,把生成的配置文件下载到FPGA内。
至此,硬件开发部分已经完成,读者可以先退出QuartusII.
图1。
1。
40
4)使用NiosIIIDE建立用户应用程序
(1)建立NiosIIC/C++应用程序
①切换工作空间
一般每一个项目对应一个单独的工作空间,这样便于程序组织和管理.选择File→SwitchWorkplace..。
(图1.1。
41)弹出工作空间选择对话框,选择自己想编写应用程序的QuartusII工程项目文件夹(图1.1。
42)。
如果所选的文件夹下没建立过应用程序,将出现如图1。
1.43所示的欢迎画面,若对相关内容不感兴趣直接关闭即可。
强烈建议读者将应用建在对应的SOPC系统所在的工程文件夹下.
图1.1.41
图1。
1。
42
图1.1。
43
②编写NiosIIC/C++应用程序文件
选择File→New→NiosIIC/C++Apllication(图1.1.44)弹出新建程序对话框(图1.1。
45),Name为所要建立的应用程序工程名,SelectProjectTemplate为选择工程模板,此处我们选BlankProject并命名为led;SelectTargetHardware选择自己想建立应用程序的SOPC系统,我们选择此前建立的SOPC系统niosii。
ptf,位于我们刚才建立的QuartusII工程文件夹下。
需要提醒读者的是,在选择的SOPC系统时一般默认弹出的是前一次工作空间所在的目录,如果读者更换了工作空间,则应到对应的工作空间下找*。
ptf文件(图1。
1.46)。
图1.1.44
图1.1。
45
图1.1。
46
完成新建工程后,在新建的工程名led处右击选择New→SourceFile(图1。
1.47)弹出如图1。
1.48所示的对话框,因为我们要建立的是C语言程序,所以命名为led。
c,也可采用其他命名,但要指定文件类型。
编写C程序代码(图1。
1。
49),至此应用程序工程及源代码建立完毕。
图1。
1.47
图1。
1。
48
/********************版权声明*****************************
*新疆大学信息科学与工程学院创新实验室
*文件名:
led。
c
*创建者:
吴占敏
*创建日期:
2010。
4。
21
*校验者:
*校验日期:
*版本号:
V1.0
*功能描述:
两个LED灯交替闪烁
********************************************************/
#include”system.h"
#include”alt_types。
h"
#include"altera_avalon_pio_regs.h”
/**********************************************************
*名称:
main()
*功能:
控制两个LED灯交替闪烁。
***********************************************************/
intmain(void)
{
alt_u8led=0x2;
inti;
while
(1)
{
for(i=0;i〈50000000;i++){};//延时
led=0x1;
//LED_PIO是SOPC创建NIOS2时的外设名,必需相同且大写
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);
for(i=0;i〈50000000;i++){};//延时
led=0x2;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);
}
return0;
}
图1。
1.49
system。
h是NiosIIIDE根据SOPCBuilder中定制的NiosII系统生成的,其中包含了系统各组件信息,如名称、基地址、中断号等。
在工程编译连接成功后才存在访文件,否则不存在。
NiosII系统存储器与外设是统一的,而对于外设的访问都是通过访问外设的寄存器达到操作目的。
本例中,LED_PIO_BASE即LED_PIO这个外设的数据寄存器地址。
在altera_avalon_pio_regs.h中定义了PIO内核的寄存器映射以及硬件访问的宏,用户可以调用其中定义的宏进行访问。
alt_u8表示无符号8位数即unsignedchar,在alt_types。
h中定义。
③设置应用工程系统属性
在工程文件目录led右击先SystemLibraryProperties(图1.1.50)弹出图1。
1。
51所示系统库属性设置对话框,其他参数将在后面陆续介绍,此处只介绍LinkerScript(图1.1。
52)。
ØCustomlinkerscript。
全能该选项时,用户必须自行建立和管理LinkerScript。
(注:
用户自定义的LinkerScript文件必须放到系统库项目的根目录下;Altera强烈建议用户使用系统自动生成和管理的LinkerScript。
ØUseauto-generatedlinkerscript.选择该选项时,NiosIIIDE将自动和管理LinkerScript,在大多数项目中这个选择已经足够了.具体有以下几个子选项可以配置:
⏹Programmemory(。
text):
配置执行代码的物理存储器;
⏹Read-onlydatamemory(.rodata):
配置只读数据的物理存储器;
⏹Read/writedatamemory(.rwdata):
配置可读写数据的物理存储器;
图1.1。
50
图1。
1.51
图1.1。
52
⏹Heapmemory:
配置堆空间的物理存储器;
⏹Stackmemory:
配置栈空间的物理存储器;
⏹Useaseparateexceptionstack:
选择了该选项时,异常的栈空间将独立于系统栈空间,可以在一个单独的物理存储器中开辟;将异常栈空间开辟在一个快速的存储器(如紧耦合存储器)可以提高系统的中断响应性能。
◆Exceptinstackmemory:
配置独立异常栈的物理存储器;
◆Maximumexceptionstacksize(bytes):
配置独立异常栈尺寸。
此实验把Programmemory(.text)选项设置为onchip_rom,其他几项设为onchip_ram,不单独设立Exceptionstackmemory.一般为说,这几个选项设置在SDRAM以提高程序的程序运行速度。
至此,我们已经基本完成了应用程序设计的各步骤,右击工程目录led选择BuildProject(图1。
1.53)或在菜单栏选择Project→BuildProject(图1.1。
54)编译连接工程。
如果你之前片内RAM的设置和本教程相同,那么,很遗憾,编译将无法通过(图1。
1。
55),因为程序代码大小大于RAM的大小。
我们将在下一步介绍优化代码的方法.
图1。
1.53
图1。
1.54
图1。
1.55
④优化代码大小
由于没进行优化而片内RAM的空间又太小,所以编译错误。
我们将通过下面方法优化代码。
Ø优化工程编译选项:
右击工程led选择Properties→C/C++Build→ConfigurationSettings→NiosIICompiler→Gneral→OptimizationLevels选择“Optimizesize(—0s)”(图1。
1.56~图1。
1。
57);
Ø优化系统库编译选项:
右击系统库led_syslib[niosii]选择Properties→C/C++Build→ConfigurationSettings→NiosIICompiler→Gneral→OptimizationLevels选择“Optimizesize(—0s)"(图1.1。
58~图1。
1。
59);
Ø使用小封装的驱动库:
HAL为处理器的外设提供了两种驱动库,一种是执行速度快,但代码量大的版本,另一种是小封装版本.默认情况下,HAL系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 内部 RAM 简单 NiosII 系统