SOPC实验指导书文档格式.docx
- 文档编号:17198108
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:25
- 大小:153.58KB
SOPC实验指导书文档格式.docx
《SOPC实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《SOPC实验指导书文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
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;
i=0;
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"
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<
<
i=0;
while(i<
i++;
return0;
3.3键盘中断实验
(1)熟悉中断服务程序的编写和注册方法。
(2)熟悉中断服务程序的调试方法。
(3)熟悉NiosⅡ处理外部中断的方式。
外部中断信号由键盘值提供,然后将中断事件反映到LED上,每按一次键LED亮一次。
4.实验前准备
键盘模块的设计包括键盘扫描、键盘译码和键盘消抖。
本系统采用VHDL语言对以上三个功能模块进行描述。
其VHDL源程序见附录1。
5.实验步骤
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为KeyBoard_C。
(2)在KeyBoard_C工程文件夹中新建应用程序文件main.c。
(5)中断服务程序处设下断点,全速运行程序,然后按下键盘中一个键,单步调试中断服务程序,并观察中断处理过程。
(6)全速运行程序,按下键,控制LED。
6.实验参考程序
键盘中断参考程序见程序清单3.2。
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.*/
/*Resettheedgecaptureregister.*/
/*Registertheinterrupthandler.*/
alt_irq_register(KEYBOARD_IN_IRQ,edge_capture_ptr,
handle_keyboard_interrupts);
inti;
init_keyboard_pio();
while
(1)
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);
for(i=0;
i<
200000;
i++);
3.4定时器实验1——使用系统时钟服务
NiosⅡ定时器可用作系统时钟,时间标记,看门狗和脉冲发生器,由于standard系统在生成时,并未启动“Timeoutpulse”功能,所以下面的实验将依次介绍定时器的系统时钟,时间标记和看门狗应用。
了解定时器的系统时钟服务功能。
NiosⅡIDE5.0
利用系统时钟服务产生1s的周期性事件,并借此控制LED闪烁。
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为SysTimer_C。
(2)在SysTimer_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,将sys_clock_timer指定为“Systemclocktimer”,并把程序和数据区都指定为flash。
(5)在系统时钟服务程序处设下断点,全速运行程序,单步调试中断服务程序,并观察中断处理过程。
(6)全速运行程序,观察LED的闪烁。
系统时钟服务参考程序见程序清单3.3。
#include<
stdio.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();
printf("
testalarm\n"
);
alt_ticks_per_second()is%ld"
alt_ticks_per_second());
if(alt_alarm_start(&
alarm,alt_ticks_per_second(),my_alarm_callback,NULL)<
0)
Nosystemclockavailable\n"
3.5定时器实验2——使用时间标记服务
通过该项服务,用户可以测得某个事件消耗的时间
了解定时器的时间标记服务功能。
使用时间标记来测两个函数的运行时间。
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为TimeStamp_C。
(2)在TimeStamp_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,指定high_res_timer为“Timestamptimer”,并把程序和数据区都指定为flash。
(5)全速运行程序,观察NiosⅡ信息窗口打印出的信息。
时间标记参考程序见程序清单3.4。
sys/alt_timestamp.h"
voidfunc1(void)
intcnt=10000;
while(cnt--);
voidfunc2(void)
intcnt=20000;
intmain(void)
alt_u32time1;
alt_u32time2;
alt_u32time3;
if(alt_timestamp_start()<
Can'
tStarttimestamp\n"
time1=alt_timestamp();
func1();
time2=alt_timestamp();
func2();
time3=alt_timestamp();
func1need%u\n"
(unsignedint)(time2-time1));
func2needs%u\n"
(unsignedint)(time3-time2));
thefreqoftimeris%u\n"
(unsignedint)alt_timestamp_freq());
3.6定时器实验3——看门狗实验
了解NiosⅡ的WDT(看门狗)功能及其使用方法。
运行WDT,然后控制LED1—LED8显示输出。
先对LED1—LED8进行闪烁控制,并同时喂狗,然后知点亮LED1,并进入死循环,等待WDT复位。
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为WDTRun_C。
(2)在WDTRun_C工程文件夹中新建应用程序文件main.c。
(5)用Flashprogrammer把程序下载到外边Flash中运行。
当WDT复位后,程序会重复闪烁LED,表示WDT复位产生。
看门狗参考程序见程序清单3.5。
altera_avalon_timer_regs.h"
voidWdtFeed(void)
IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE,0x1234);
voidDelayNS(alt_u32dly)
alt_u32i;
for(;
dly>
0;
dly--)
for(i=0;
1000;
i++)
WdtFeed();
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);
alt_u8i;
InitWDT();
2;
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的方法。
了解使用ANSIC标准库函数访问UART的方法。
用ANSIC标准库函数从JTAGUART中读入字符,如果检测到符合要求的字符,则输出提示信息。
学习printf(),scanf(),fopen(),fwrite()等函数的用法。
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为UART1_C。
(2)在UART1_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,先把标准输入输出设备指定为“uart”,再把程序和数据区都指定为flash。
(5)在信息显示框中与UART进行交互,如果在主程序中不对UART设备进行初始化,那么UART将使用在SOPCBuilder中预设的波特率值,本实验的预设值是115200bps。
ANSIC标准库来访问UART参考程序见程序清单3.6。
string.h>
char*msg="
Detectedthecharacter'
t'
\n"
;
FILE*fp;
charprompt=0;
PleaseEntersomecharacter:
fp=fopen(RS232_2_NAME,"
r+"
if(fp)
while(prompt!
='
v'
)
prompt=getc(fp);
if(prompt=='
fwrite(msg,strlen(msg),1,fp);
if(ferror(fp))
clearerr(fp);
fprintf(fp,"
closingthejtaguartfilehandle\n"
fclose(fp);
Failtoopenfile.\n"
3.8UART实验2——通过HALAPI函数访问JTAGUART
1.实验目的
HAL系统库提供了一组Unix风格的I/O系统访问函数,如open(),close(),read(),
write(),lseek()等。
希望读者通过本实验来熟悉使用HALAPI函数来访问UART设备的方法。
用HALAPI函数从UART中读入和输出字符,学习open(),close(),read(),write(),lseek()等函数的用法。
(1)启动NiosⅡIDE并建一个空白C\C++工程,然后命名为UART2_C。
(2)在UART2_C工程文件夹中新建应用程序文件main.c。
(3)在SystemLibrary设置页中,不需要把标准输入输出设备指定为“uart”,但是需把程序和数据区都指定为flash。
(5)在信息显示框中与UART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SOPC 实验 指导书