SOPC实验指导书.docx
《SOPC实验指导书.docx》由会员分享,可在线阅读,更多相关《SOPC实验指导书.docx(25页珍藏版)》请在冰豆网上搜索。
SOPC实验指导书
SOPC实验
3.1使用NiosⅡIDE建立用户程序
1.创建一个新的C/C++应用工程
执行下面的步骤来创建一个新的C/C++应用工程:
1.启动NiosⅡIDE。
选择【开始】››【程序】››【Altera】››【QuartusⅡ5.0】››【NiosⅡDevelopmentKits5.0】››【NiosⅡIDE】启动NiosⅡIDE。
也可以通过图1.1直接点击
按钮来启动NiosⅡIDE。
图1启动NiosⅡIDE
2.如果出现WorkspaceLauncher对话框,单击
设置工作空间为QuartusⅡ工程的文件夹,如图2所示,这样便于管理。
如果是第一次进入工作区,NiosⅡIDE会先弹出一个欢迎界面,此时点击右上角的Workbench图标,就可以进入NiosⅡIDE编辑界面。
图2设置IDE工作空间
3.如图3所示,选择【File】››【New】››【C/C++Application】来打开新建C/C++工程向导,如图4所示。
图3打开新建C/C++工程向导
图4新建C/C++工程向导
4.单击SelectTargetHardware右侧的
按钮打开SelectTargetHardware窗口,选择led_nios2_system.ptf文件,即指向当前硬件设计系统,如图5所示。
图5选择硬件目标文件
5.选择SelectProjectTemplate列表中的hello_led。
Name栏中自动更新为hello_led_0,确认选中UseDefaultLocation栏,如图6所示,单击
完成工程创建。
图6完成设置后的工程向导
向导中的SelectProjectTemplates一栏中是已经设计好的软件工程,用户可以选择其中的一个,把它当作模板来创建自己的工程。
当然也可以选择BlankProject(空白工程),完全由用户写所有的代码。
本实验选取了hello_led工程,然后在此基础上进行适当的修改,一般情况下这比空白工程更加容易,也更方便。
创建工程后,在NiosⅡIDE工作台左侧的C/C++Projects视图中显示两个新的工程:
hello_led_0和hello_led_0_syslib。
hello_led_0是C/C++应用工程,而hello_led_0_syslib是描述hello_nios2_system系统硬件细节的系统库。
IDE工作台的左侧有两个标签:
C/C++Projects视图和Navigator视图。
单击C/C++Project选项卡来显示C/C++Project视图。
该视图适合于大多数的C/C++开发活动。
打开hello_led.c,将其中的intalt_main函数用程序清单2.1所示的清单替换,然后保存。
intalt_main(void)
{
alt_u8led=1;
alt_u32i;
while
(1)
{
led=1;
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);
i=0;
while(i<500000)
{
i++;
}
led=0;
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);
i=0;
while(i<500000)
{
i++;
}
}
return0;
}
3.2PIO输出控制实验1——流水灯控制
1.实验目的
熟悉NiosⅡPIO设备的访问方法
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
QuartusⅡ5.0、NiosⅡIDE5.0
3.实验内容
使用PIO口控制8个LED进行流水灯显示。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为LEDCon_C。
(2)在LEDCon_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)Debug整个程序,看输出是否正确。
(6)把程序下载到Flash中去全速运行程序。
5.实验参考程序
PIO输出控制实验1的例程见程序清单3.1
程序清单3.1流水灯控制
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
intmain(void)
{
alt_u8led=0x2;
alt_u8dir=0;
volatileinti;
while
(1)
{
if(led&0x81)
{
dir=(dir^0x1);
}
if(dir)
{
led=led>>1;
}
else
{
led=led<<1;
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);
i=0;
while(i<500000)
i++;
}
return0;
}
3.3键盘中断实验
1.实验目的
(1)熟悉中断服务程序的编写和注册方法。
(2)熟悉中断服务程序的调试方法。
(3)熟悉NiosⅡ处理外部中断的方式。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
QuartusⅡ5.0、NiosⅡIDE5.0
3.实验内容
外部中断信号由键盘值提供,然后将中断事件反映到LED上,每按一次键LED亮一次。
4.实验前准备
键盘模块的设计包括键盘扫描、键盘译码和键盘消抖。
本系统采用VHDL语言对以上三个功能模块进行描述。
其VHDL源程序见附录1。
5.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为KeyBoard_C。
(2)在KeyBoard_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)中断服务程序处设下断点,全速运行程序,然后按下键盘中一个键,单步调试中断服务程序,并观察中断处理过程。
(6)全速运行程序,按下键,控制LED。
6.实验参考程序
键盘中断参考程序见程序清单3.2。
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
volatileintedge_capture;
alt_u32done=0;
staticvoidhandle_keyboard_interrupts(void*context,alt_u32id)
{
//inti;
/*castthecontextpointertoanintegerpointer.*/
volatileint*edge_capture_ptr=(volatileint*)context;
unsignedinttemp;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEYBOARD_IN_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DATA(KEYBOARD_CONTROL_BASE,0x1);
/*ReadthedataregisteronthekeyboardPIO*/
temp=IORD_ALTERA_AVALON_PIO_DATA(KEYBOARD_IN_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x01);
/*ReadtheedgecaptureregisteronthekeyboardPIO.Storevalue.*/
*edge_capture_ptr
IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEYBOARD_IN_BASE);
/*Writetotheedgecaptureregistertoresetit.*/
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEYBOARD_IN_BASE,0x0);
/*resetinterruptcapabilityforthekeyboardPIO.*/
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEYBOARD_IN_BASE,0x0f);
IOWR_ALTERA_AVALON_PIO_DATA(KEYBOARD_CONTROL_BASE,0x0);
}
/*Initializethekeyboard_pio.*/
staticvoidinit_keyboard_pio(void)
{
/*Recasttheedge_capturepointertomatchthealt_irq_register()function
*prototype.*/
void*edge_capture_ptr=(void*)&edge_capture;
/*Enableallkeysinterrupts.*/
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEYBOARD_IN_BASE,0x0f);
/*Resettheedgecaptureregister.*/
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEYBOARD_IN_BASE,0x0);
IOWR_ALTERA_AVALON_PIO_DATA(KEYBOARD_CONTROL_BASE,0x0);
/*Registertheinterrupthandler.*/
alt_irq_register(KEYBOARD_IN_IRQ,edge_capture_ptr,
handle_keyboard_interrupts);
}
intmain(void)
{
inti;
init_keyboard_pio();
while
(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);
for(i=0;i<200000;i++);
}
return0;
}
3.4定时器实验1——使用系统时钟服务
NiosⅡ定时器可用作系统时钟,时间标记,看门狗和脉冲发生器,由于standard系统在生成时,并未启动“Timeoutpulse”功能,所以下面的实验将依次介绍定时器的系统时钟,时间标记和看门狗应用。
1.实验目的
了解定时器的系统时钟服务功能。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
NiosⅡIDE5.0
3.实验内容
利用系统时钟服务产生1s的周期性事件,并借此控制LED闪烁。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为SysTimer_C。
(2)在SysTimer_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,将sys_clock_timer指定为“Systemclocktimer”,并把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)在系统时钟服务程序处设下断点,全速运行程序,单步调试中断服务程序,并观察中断处理过程。
(6)全速运行程序,观察LED的闪烁。
5.实验参考程序
系统时钟服务参考程序见程序清单3.3。
#include
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_alarm.h"
staticalt_alarmalarm;
staticunsignedcharled=0xff;
alt_u32my_alarm_callback(void*context)
{
if(led==0xff)
{
led=0x00;
}
else
{
led=0xff;
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);
returnalt_ticks_per_second();
}
voidInitPIO(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_BASE,0X01);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LED_BASE,0X00);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LED_BASE,0X00);
}
intmain()
{
InitPIO();
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);
printf("testalarm\n");
printf("alt_ticks_per_second()is%ld",alt_ticks_per_second());
if(alt_alarm_start(&alarm,alt_ticks_per_second(),my_alarm_callback,NULL)<0)
{
printf("Nosystemclockavailable\n");
}
while
(1)
return0;
}
3.5定时器实验2——使用时间标记服务
通过该项服务,用户可以测得某个事件消耗的时间
1.实验目的
了解定时器的时间标记服务功能。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
NiosⅡIDE5.0
3.实验内容
使用时间标记来测两个函数的运行时间。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为TimeStamp_C。
(2)在TimeStamp_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,指定high_res_timer为“Timestamptimer”,并把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)全速运行程序,观察NiosⅡ信息窗口打印出的信息。
5.实验参考程序
时间标记参考程序见程序清单3.4。
#include
#include"system.h"
#include"sys/alt_timestamp.h"
#include"alt_types.h"
voidfunc1(void)
{
intcnt=10000;
while(cnt--);
}
voidfunc2(void)
{
intcnt=20000;
while(cnt--);
}
intmain(void)
{
alt_u32time1;
alt_u32time2;
alt_u32time3;
if(alt_timestamp_start()<0)
{
printf("Can'tStarttimestamp\n");
}
time1=alt_timestamp();
func1();
time2=alt_timestamp();
func2();
time3=alt_timestamp();
printf("func1need%u\n",(unsignedint)(time2-time1));
printf("func2needs%u\n",(unsignedint)(time3-time2));
printf("thefreqoftimeris%u\n",(unsignedint)alt_timestamp_freq());return0;
}
3.6定时器实验3——看门狗实验
1.实验目的
了解NiosⅡ的WDT(看门狗)功能及其使用方法。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
NiosⅡIDE5.0
3.实验内容
运行WDT,然后控制LED1—LED8显示输出。
先对LED1—LED8进行闪烁控制,并同时喂狗,然后知点亮LED1,并进入死循环,等待WDT复位。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为WDTRun_C。
(2)在WDTRun_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)用Flashprogrammer把程序下载到外边Flash中运行。
当WDT复位后,程序会重复闪烁LED,表示WDT复位产生。
5.实验参考程序
看门狗参考程序见程序清单3.5。
#include
#include"system.h"
#include"altera_avalon_timer_regs.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
voidWdtFeed(void)
{
IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE,0x1234);
}
voidDelayNS(alt_u32dly)
{
alt_u32i;
for(;dly>0;dly--)
{
for(i=0;i<1000;i++)
WdtFeed();
}
}
voidInitPIO(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LED_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LED_BASE,0x00);
}
voidInitWDT(void)
{
IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_BASE,ALTERA_AVALON_TIMER_CONTROL_START_MSK);
}
intmain(void)
{
alt_u8i;
InitPIO();
InitWDT();
WdtFeed();
for(i=0;i<2;i++)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);
DelayNS(100);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xff);
DelayNS(1000);
}
3.7UART实验1——通过C库函数访问UART
Altera建议用户用HALAPI函数或ANSIC标准库来访问UART,而不是直接访问UART寄存器。
以下两个实验,先给出ANSIC标准库函数来访问UART的方法,再给出通过HALAPI函数访问UART的方法。
1.实验目的
了解使用ANSIC标准库函数访问UART的方法。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
NiosⅡIDE5.0
3.实验内容
用ANSIC标准库函数从JTAGUART中读入字符,如果检测到符合要求的字符,则输出提示信息。
学习printf(),scanf(),fopen(),fwrite()等函数的用法。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为UART1_C。
(2)在UART1_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,先把标准输入输出设备指定为“uart”,再把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)在信息显示框中与UART进行交互,如果在主程序中不对UART设备进行初始化,那么UART将使用在SOPCBuilder中预设的波特率值,本实验的预设值是115200bps。
5.实验参考程序
ANSIC标准库来访问UART参考程序见程序清单3.6。
#include
#include
#include"system.h"
intmain()
{
char*msg="Detectedthecharacter't'\n";
FILE*fp;
charprompt=0;
printf("PleaseEntersomecharacter:
\n");
fp=fopen(RS232_2_NAME,"r+");
if(fp)
{
while(prompt!
='v')
{
prompt=getc(fp);
if(prompt=='t')
{
fwrite(msg,strlen(msg),1,fp);
}
if(ferror(fp))
clearerr(fp);
}
fprintf(fp,"closingthejtaguartfilehandle\n");
fclose(fp);
}
else
{
printf("Failtoopenfile.\n");
}
return0;
}
3.8UART实验2——通过HALAPI函数访问JTAGUART
1.实验目的
HAL系统库提供了一组Unix风格的I/O系统访问函数,如open(),close(),read(),
write(),lseek()等。
希望读者通过本实验来熟悉使用HALAPI函数来访问UART设备的方法。
2.实验设备
硬件:
PC机
EDA/SOPC/DSP实验箱
软件:
NiosⅡIDE5.0
3.实验内容
用HALAPI函数从UART中读入和输出字符,学习open(),close(),read(),write(),lseek()等函数的用法。
4.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为UART2_C。
(2)在UART2_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,不需要把标准输入输出设备指定为“uart”,但是需把程序和数据区都指定为flash。
(4)编译整个工程,查找语法错误。
(5)在信息显示框中与UART