1、华科电信并行IO接口走马灯实验报告电子信息与通信学院实验报告实验名称:微机原理实验课程名称:并行IO接口设计班级: 姓名:学号:教师:一、实验目的1.掌握GPIO IP核的工作原理和使用方法2.掌握中断控制方式的IO接口设计原理3.掌握中断程序设计方法4.掌握IO接口程序控制方法 -查询方式 -延时方式二、实验任务 写一个Led走马灯输出的程序,并下载到FPGA板子上,用延时、中断两种方式实现。三、实验原理 硬件实现框图 如图所示:四、硬件实现步骤1.使用XPS创建一个基于AXI总线的最小计算机系统。File New BSB Project,如图:2.修改时钟设置:将时钟产生器的时钟输入信号进
2、行修改,修改为单一时钟源。修改后的结果如图:3.添加GPIO IP核,设置LEDs_8Bits配置:a.在IP Catalog标签中,双击下面图标创建GPIO IP核:b.添加GPIO IP核后,将名字改为LED_16Bits,如图:c.更改LED_16Bits配置窗口的属性,如图:4.添加AXI Interrupt Controller IP核:a.在IP Catalog标签中,双击下面图标创建INTC IP核:b.添加axi_intc_0的中断源,如图:c.将microblaze_0实例的INTERRUPT引脚选择axi_intc_0_INTERRUPT,如图:5.产生外部GPIO连接:a
3、.选中LEDs_16Bits中的GPIO_IO_O,选择make external,生成外部连接端口;选中GPIO_IO,设置为“No connection”,取消其外部连接端口。结果如图:b.在ports标签下,展开External Ports项,可看到LEDs_16Bits生成的LEDs_16Bits_GPIO_IO_PIN端口,如图:6.添加timer IP核:a.选择如图的IP核并双击,添加到工程:b.中断信号的连接结果如图所示:7.配置UCF文件:在UCF文件中修改如下所示配置,配置LED连接电路约束:NET CLK TNM_NET = sys_clk_pin;TIMESPEC TS
4、_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;NET CLK LOC = E3 | IOSTANDARD = LVCMOS33;NET RESET LOC = E16 | IOSTANDARD = LVCMOS33;NET RsRx LOC = C4 | IOSTANDARD = LVCMOS33;NET RsTx LOC = D4 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = T8 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_p
5、in LOC = V9 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = R8 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = T6 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = T5 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = T4 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO
6、_IO_pin LOC = U7 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = U6 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = V4 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = U3 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = V1 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits
7、_GPIO_IO_pin LOC = R1 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = P5 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = U1 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = R2 | IOSTANDARD = LVCMOS33;NET LEDs_16Bits_GPIO_IO_pin LOC = P2 | IOSTANDARD = LVCMOS33;8.创建工程过程完成
8、后,a.在主界面下选择Hardware-Generate Netlist;b.在主界面下选择Hardware-Generate Bitstream;c.单击Graphical Design View,可以看到系统的连接图,如下:五、软件设计1.中断方式实现走马灯 用户应用程序的设计包括定时器配置、启动中断系统、设计中断服务程序。中断服务程序:要求每产生一次中断led灯亮的位置向高位移动1位。 完整的程序代码如下,其中:main为主程序,timerCounterHandler为中断服务程序。该程序设置定时器初始值为0x5f5e100,表示计数100M个时钟脉冲,由于时钟为100MHz,因此1秒钟
9、产生一次中断。设置定时器的工作方式为允许中断、自动装载、减计数模式。(1)程序流程图:(2)源代码:#include xparameters.h#include xtmrctr.h#include xintc.h#include xil_exception.h#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID#define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID#define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID#define TIMER_CNTR_0 0#
10、define RESET_VALUE 0X5F5E100void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber);XIntc InterruptController;XTmrCtr TimerCounterInst;u32 LedBits;int main(void) int Status; LedBits = 0; Xil_Out32(XPAR_LEDS_16BITS_BASEADDR+0x04,0x0); Status = XTmrCtr_Initialize(&TimerCounterInst, TMRCTR_DEVICE_
11、ID); XIntc_Initialize(&InterruptController, INTC_DEVICE_ID); XIntc_Connect(&InterruptController,INTC_DEVICE_ID, (XInterruptHandler)XTmrCtr_InterruptHandler, (void *)&TimerCounterInst); XIntc_Start(&InterruptController, XIN_REAL_MODE); XIntc_Enable(&InterruptController, TMRCTR_INTERRUPT_ID); microbla
12、ze_register_handler(XInterruptHandler)XIntc_InterruptHandler, &InterruptController); microblaze_enable_interrupts(); XTmrCtr_SetHandler(&TimerCounterInst, TimerCounterHandler, &TimerCounterInst); XTmrCtr_SetOptions(&TimerCounterInst, TIMER_CNTR_0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION | XTC_D
13、OWN_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_16BITS_BASEADDR, 1LedBits ); /产生中断时,输出LED显示值 LedBits +
14、; /修改显示位置,指向下一个LED灯 if(LedBits=16) /由于只有16位LED灯,因此位置不能16,继续从bit0开始循环 LedBits=0;2延时方式实现走马灯 延时方式的程序,没有中断和计时器部分,通过for循环来达到延时的目的。(1)程序流程图(2)源代码如下:#include xparameters.h#include xil_io.hint main() u32 Led_16Bits = 0x0001; int i, j; Xil_Out32(XPAR_LEDS_16BITS_BASEADDR+0x4, 0x0); while(1) for(i=0;i16;i+) Xil_Out32(XPAR_LEDS_16BITS_BASEADDR, Led_16Bits);/输出LED显示值 for(j=0;j0xa5e100;j+);/延时 Led_16Bits = Led_16Bits1;/指向下一个LED灯 Led_16Bits = 0x0001; return 0;六、心得体会 通过用两种方式实现走马灯的实验,我掌握了GPIO IP核的工作原理和使用方法,同时也明白了中断控制方式的IO接口设计原理,在这基础上,又进一步学习到了中断程序设计方法以及IO接口程序控制方法。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1