1、华科并行接口设计走马灯实验报告 专业: 电子信息工程 姓名: 朱 东 福 班级: 201401 班学号: 日期: 年 月 日微机原理实验测试并行IO接口实验走马灯专业 电子信息与通信学院 班级 电信 班 日期2016/12/05 第3次试验姓名 组别 15 指导老师 成绩 实验课题 并行IO接口实验走马灯一、 实验目的1. 掌握GPIO IP核的工作原理和使用方法2. 掌握中断控制方式的IO接口设计原理3. 掌握中断程序设计方法4. 掌握IO接口程序控制方法 -查询方式 -延时方式二、 实验任务 Led走马灯输出 用延时、中断两种方式实现三、 实验原理 硬件实现框图如图所示:四、 硬件实现步骤
2、1. 使用XPS创建一个基于AXI总线的最小计算机系统。File New BSB Project,如图:2. 修改时钟设置:将时钟产生器的时钟输入信号进行修改,修改为单一时钟源。修改后的结果如图: 3. 添加GPIO IP核,设置LEDs_8Bits配置:a. 在IP Catalog标签中,双击下面图标创建GPIO IP核:b. 添加GPIO IP核后,将名字改为LED_8Bits,如图:c. 更改LED_8Bits配置窗口的属性,如图:4. 添加AXI Interrupt Controller IP核:a. 在IP Catalog标签中,双击下面图标创建INTC IP核:b. 添加axi_i
3、ntc_0的中断源,如图:c. 将microblaze_0实例的INTERRUPT引脚选择axi_intc_0_INTERRUPT,如图:5. 产生外部GPIO连接:a. 选中LEDs_8Bits中的GPIO_IO_O,选择make external,生成外部连接端口;选中GPIO_IO,设置为“No connection”,取消其外部连接端口。结果如图:b. 在ports标签下,展开External Ports项,可看到LEDs_8Bits生成的LEDs_8Bits_GPIO_IO_PIN端口,如图:6. 添加timer IP核:a. 选择如图的IP核并双击,添加到工程:b. 中断信号的连接
4、结果如图所示:7. 配置UCF文件:在UCF文件中修改如图所示配置,配置LED连接电路约束:8. 创建工程过程完成后,a. 在主界面下选择Hardware-Generate Netlist;b. 在主界面下选择Hardware-Generate Bitstream;c. 单击Graphical Design View,可以看到系统的连接图,如下: 五、 应用软件设计1、 延时方式实现走马灯(1) SDK提供的外设驱动以及应用程序1 点击project-Expert Hardware Design to SDK,点击Export&Launch SDK:2 在SDK中,点击file-new-boa
5、rd support package,如图:3 点击file-new-application project,创建一个Empty Applicant工程,如图所示:2、 设计用户应用程序 (1)延时方式的程序,没有中断和计时器部分,通过for循环来达到延时的目的#include xparameters.h#include xil_io.hint main() char Led_8Bits = 0x01; int i,j; Xil_Out32(XPAR_LEDS_8BITS_BASEADDR+0x4,0x0); while(1) for(i=0;i8;i+) Xil_Out32(XPAR_LED
6、S_8BITS_BASEADDR,Led_8Bits); for(j=0;j0xa5e100;j+); Led_8Bits=Led_8Bits1; Led_8Bits=0x01; return 0;(2) 中断方式实现走马灯 用户应用程序的设计包括定时器配置、启动中断系统、设计中断服务程序。 中断服务程序:要求每产生一次中断led灯亮的位置向高位移动1位。 完整的程序代码如下,其中:main为主程序,timerCounterHandler为中断服务程序。该程序设置定时器初始值为0x5f5e100,表示计数100M个时钟脉冲,由于时钟为100MHz,因此1秒钟产生一次中断。设置定时器的工作方式为
7、允许中断、自动装载、减计数模式。源代码: 代码如下: #include xparameters.h #include xtmrctr.h #include xintc.h #include xil_exception.h #define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID #define TIMER_CNTR_0 0 #define RESET_VA
8、LUE 0x5F5E100 void TimerCounterHandler(void *CallBackRef,u8 TmrCtrNumber); XIntc InterruptController; XTmrCtr TimerCounterInst; u32 LedBits; int main(void) int Status; LedBits=0; Xil_Out32(XPAR_LEDS_8BITS_BASEADDR+0x4,0x0); Status=XTmrCtr_Initialize(&TimerCounterInst,XPAR_TMRCTR_0_DEVICE_ID); if(Sta
9、tus !=XST_SUCCESS) return XST_FAILURE; Status=XIntc_Initialize(&InterruptController,INTC_DEVICE_ID); if(Status !=XST_SUCCESS) return XST_FAILURE; Status=XIntc_Connect(&InterruptController,TMRCTR_INTERRUPT_ID,(XInterruptHandler)XTmrCtr_InterruptHandler,(void *)&TimerCounterInst); if(Status !=XST_SUCC
10、ESS) return XST_FAILURE; Status=XIntc_Start(&InterruptController,XIN_REAL_MODE); if(Status !=XST_SUCCESS) return XST_FAILURE; XIntc_Enable(&InterruptController,TMRCTR_INTERRUPT_ID); microblaze_register_handler(XInterruptHandler)XIntc_InterruptHandler,&InterruptController); microblaze_enable_interrup
11、ts(); XTmrCtr_SetHandler(&TimerCounterInst,TimerCounterHandler,&TimerCounterInst); XTmrCtr_SetOptions(&TimerCounterInst,TIMER_CNTR_0,XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION | XTC_DOWN_COUNT_OPTION); XTmrCtr_SetResetValue(&TimerCounterInst,TIMER_CNTR_0,RESET_VALUE); XTmrCtr_Start(&TimerCounterInst,TIMER_CNTR_0); while(1); return XST_SUCCESS; void TimerCounterHandler(void *CallBackRef,u8 TmrCtrNumber) Xil_Out32(XPAR_LEDS_8BITS_BASEADDR,1LedBits); LedBits+; if(LedBits=8) LedBits=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1