SOPC范例程序入门Word格式文档下载.docx
《SOPC范例程序入门Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SOPC范例程序入门Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
On-Chip->
On-ChipMemory(RAMorROM),双击添加至系统中。
在弹出的对话框中指定片上RAM的属性。
保持默认设置即可。
再添加CPU。
双击AlteraSOPCBuilder->
NiosIIProcessor,在弹出的对话框中间选择第一个NiosII/e,表示economy,最小的NIOSII核心。
下面的ResetVector和ExceptionVector都选择onchip_men,即刚才添加的片上RAM的名称。
其它的都保留默认设置即可。
点击Finish添加CPU核。
添加定时器。
在列表中选择Peripherals->
MicrocontrollerPeripherals->
IntervalTimer,弹出如下对话框。
定时器在本系统中主要作用是产生一个固定间隔的中断信号,让CPU改变LED灯的状态。
因此在Period中选择500ms,表示灯的状态每500ms改变一次。
Preset选择Simpleperiodicinterrupt即可。
最后添加IO口控制器。
双击Peripherals->
PIO(ParallelI/O),保持默认设置即可,表示有8个输出用IO口,分别控制开发板上的8个绿色LED灯(LEDG[7..0])。
至此系统组件添加完毕。
为了方便,我们将PIO的名称改为LEDG。
在pio上点击右键->
rename,将名称改为LEDG。
系统的每个组件都需要一个地址才能正常工作。
某些组件,如定时器(IntervalTimer)还需要分配一个IRQ号。
如果发现各组件的地址或者IRQ号出现冲突,可以选择菜单栏上System->
Auto-AssignBaseAddresses以及System->
Auto-AssignIRQs自动设定地址和IRQ。
(注:
系统IRQ可以是从0到31的整数,数值越小优先级越高。
至此系统已经构造完毕,点击下方Generate生成系统。
程序将提示需要先保存,选是即可。
出现以下画面说明SOPC系统已经生成完毕。
硬件电路设计
SOPC系统生成完毕后,回到QuartusII软件,选择File->
New…,在弹出的对话框中选择BlockDiagram/SchematicFile,点击OK。
双击空白处,打开新对话框,在左侧的列表中选择Project->
smallest,双击或点下方的OK。
此元件为刚才使用SOPCBuilder生成的片上系统。
共有3组IO口,分别是clk时钟输入、reset_n重启信号输入和绿色LED灯信号输出IO口。
再次在空白部分双击,在Name框内输入input,添加输入端口。
一共需要两个。
然后使用同样步骤添加一个ouput输出端口。
结果应如下图所示。
双击输入或输出元件可以更改它们的名称。
将两个输入端分别改名为CLOCK_50及KEY[0],代表开发板上的50MHz晶振和KEY0按钮。
将输出端改名为LEDG[7..0],代表开发板上的LEDG7到LEDG0共8个绿色LED灯。
需要注意的是SOPCBuilder生成的系统的重启信号为低电平有效,开发板上的按键按下后代表低电平,弹起代表高电平。
然后将这几个元件连接起来,硬件电路部分设计完毕。
电路应如下图所示。
最后,点击QuartusII软件菜单栏上的Assignments->
ImportAssignments…导入DE2开发板默认的管脚定义文件
保存顶层图为runningled.bdf,编译即可。
编译完成后将程序烧写至FPGA开发板。
由于目前还没有编写软件,因此开发板上不会有什么现象。
软件设计
接下来是软件设计。
打开NIOSIIIDE软件。
第一次打开的时候会提示选择工作空间。
也可在程序打开后选择菜单栏File->
SwitchWorkspace…
选择<
工程所在目录>
\software作为NIOSII的工作空间。
确认以后软件会重新启动。
在欢迎界面中选择Workbench,进入主界面
选择File->
New->
NiosIIC/C++Application
在SelectProjectTemplate内选择第一项BlankProject,Name使用默认blank_project_0,SOPCBuilderSystemPTFFile使用默认设置,即刚才生成的SOPC系统。
点Next>
,在下一个界面中选择第一项,Createanewsystemlibrary,点击Finish完成。
此时,NIOSIIIDE左侧工程列表将多出3个工程
并且程序会在后台开始自动索引。
选择菜单栏Window->
Preferences…弹出以下对话框
选择Run/Debug->
Launching,取消GeneralOptions内Build(ifrequired)beforelaunching前面的勾。
选择工程blank_project_0,右键单击,选择Properties,在C/C++MakeProject选项卡内选中Build(IncrementalBuild),在ProjectReferences选项卡内取消所有的勾,确认。
类似地,右键单击工程blank_project_0_syslib->
Properties,选中C/C++MakeProject选项卡中的Build(IncrementalBuild)。
选中SystemLibrary选项卡,在下图所示界面中,取消掉CleanExit(FlushBuffer)和SupportC++前的勾,因为我们的程序不会退出,也不包含C++的函数和库。
选中Programneverexits,Reducedevicedrivers和SmallClibrary以减小程序体积。
其他保持默认设置即可。
右键点击工程blank_project_0_syslib,选择BuildProject,编译系统库。
之后右键点击工程blank_project_0,选择New->
SourceFile,
在弹出的对话框中指定文件名为main.c,并将以下代码复制进去,并保存。
//ForFPGAproject:
runningled
//SOPCSystem:
smallest
#include"
system.h"
#include<
sys/alt_irq.h>
alt_types.h"
io.h>
//InternalTimerOverflowinterrupt
staticvoidtimer_overflow(void*context,alt_u32id)
{
IOWR(TIMER_BASE,0,0);
if(*(alt_u8*)context&
0x80)
{
*(alt_u8*)context=0x01;
}
else
*(alt_u8*)context=*(alt_u8*)context<
<
1;
IOWR(LEDG_BASE,0,*(alt_u8*)context);
return;
}
intmain()
alt_u8led=0x01;
//RegisterInterruptServiceRoutine(ISR)
alt_irq_register(TIMER_IRQ,(void*)&
led,timer_overflow);
while
(1);
右键点击工程blank_project_0,选择BuildProject。
编译完成后,软件部分也就完成了。
最后,选择菜单栏Run->
Run…,出现以下对话框
选择NiosIIHardware,点击左上角
,出现以下界面。
点击Run,NIOSIIIDE将程序下载到开发板上,之后就能看到8个LED灯轮流点亮了。
.
二、LCD液晶显示器
同第一个例子一样,首先需要打开QuartusII软件并新建一个工程。
我们将工程取名为hello_lcd。
选择好路径,其他同上例一样。
注意两个不同工程路径不要完全相同。
然后打开SOPCBuilder,选择Verilog作为编译语言,系统名称设为lcd_sys。
这个系统同样需要一个CPU核,以及显示用的LCD液晶模块。
由于需要用到很多内置库,因此程序体积会比较大,需要一个容量较大的RAM,我们选择结构较为简单的512KSRAM。
首先添加存储器,但在列表中并没有DE2开发板使用的SRAM芯片组件,需要我们手工添加。
首先需要SRAM_16Bit_512K.v以及SRAM_16Bit_512K_hw.tcl两个文件,将它们复制到工程所在的目录。
双击CreateNewComponent…
选择File->
Open…,选择SRAM_16Bit_512K_hw.tcl,打开。
之后点击Finish即可。
系统将会提示需要保存这个组件。
保存以后,在左侧列表中多出了TerasicTechnologiesInc一项,双击此项下面的SRAM_16Bit_512K,将SRAM加入系统中。
然后添加CPU,双击NiosIIProcessor。
在对话框中,可以选择三种CPU规模中的任意一种。
我们仍然选择NiosII/e。
ResetVector以及ExceptionVector都设为刚刚添加的sram。
其他保留默认设置,点击Finish添加CPU。
再添加LCD模块。
选择Peripherals->
Display->
CharacterLCD,将LCD加入系统中。
之后将各组件地址设置好以后就可以生成系统了。
回到QuartusII,新建一个BlockDiagram/SchematicFile,双击空白部分加入刚才生成的系统lcd_sys。
本系统需要两个输入端口以及多个输出端口。
双击空白部分,输入input,添加输入端口。
输入output,添加输出端口。
注意LCD和SRAM的数据线需要使用双向IO口(bidir)。
添加完以后,按照下图所示修改端口名称并连线。
还需要一个输出IO口LCD_ON置高,打开LCD显示屏。
保存顶层图为hello_lcd.bdf,编译即可。
打开NIOSIIIDE,选择File->
SwitchWorkspace…,选择<
在欢迎界面中选择Workbench,进入主界面。
同上例,选择File->
NiosIIC/C++Application,在SelectProjectTemplate内选择HelloWorld,其他保持默认设置。
第二页中选择第一项Createanewsystemlibrary。
同上例,选择Window->
Preferences…->
Run/Debug->
Launching,取消Build(ifrequired)beforelaunching。
打开两个工程hello_lcd_0及hello_lcd_0_syslib的属性对话框,在C/C++MakeProject选项卡内选中Build(IncrementalBuild),并取消ProjectReferences选项卡内的所有选项。
在hello_lcd_0_syslib的属性对话框,SystemLibrary选项卡内,选中Cleanexit(flushbuffers),取消其他选项。
stderr,stdout和stdin都选为lcd,如下图所示
然后依次编译hello_world_0_syslib和hello_world_0。
完成以后选择菜单栏Run->
Run…,选择NiosIIHardware,点击
出现以下界面,点击Run,程序将被下载到开发板上运行。
注意开发板上液晶显示器每行只能显示16个字符,因此程序中输出的”HellofromNiosII!
”只能显示出前16个字符”HellofromNios“。