SOPC实验指导书.docx

上传人:b****6 文档编号:4280054 上传时间:2022-11-28 格式:DOCX 页数:25 大小:153.58KB
下载 相关 举报
SOPC实验指导书.docx_第1页
第1页 / 共25页
SOPC实验指导书.docx_第2页
第2页 / 共25页
SOPC实验指导书.docx_第3页
第3页 / 共25页
SOPC实验指导书.docx_第4页
第4页 / 共25页
SOPC实验指导书.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

SOPC实验指导书.docx

《SOPC实验指导书.docx》由会员分享,可在线阅读,更多相关《SOPC实验指导书.docx(25页珍藏版)》请在冰豆网上搜索。

SOPC实验指导书.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1