《华科电信并行IO接口走马灯实验报告》由会员分享,可在线阅读,更多相关《华科电信并行IO接口走马灯实验报告(11页珍藏版)》请在金锄头文库上搜索。
1、电子信息与通信学院实验报告实验名称:微机原理实验课程名称:并行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_INT
3、ERRUPT, 如图:5. 产生外部 GPIO连接: a. 选中 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文件中修改如下
4、所示配置,配置LED连接电路约束:NET “CLK“ TNM_NET = sys_clk_pin; TIMESPEC TS_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 = “LVCMOS3
5、3“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “T8“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ 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
6、_pin“ LOC = “T5“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “T4“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “U7“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “U6“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “V4“ | IOSTANDAR
7、D = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “U3“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “V1“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “R1“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16Bits_GPIO_IO_pin“ LOC = “P5“ | IOSTANDARD = “LVCMOS33“; NET “LEDs_16
8、Bits_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. 创建工程过程完成后,a. 在主界面下选择 Hardware-Generate Netlist; b. 在主界面下选择 Hardware-Generate Bitstream; c.单击 Graphical De
9、sign View ,可以看到系统的连接图,如下:五、软件设计1.中断方式实现走马灯用户应用程序的设计包括定时器配置、启动中断系统、设计中断服务程序。 中断服务程序:要求每产生一次中断led 灯亮的位置向高位移动1 位。 完整的程序代码如下, 其中:main 为主程序, timerCounterHandler 为中断服 务程序。该程序设置定时器初始值为0x5f5e100,表示计数 100M 个时钟脉冲, 由于时钟为 100MHz,因此 1 秒钟产生一次中断。设置定时器的工作方式为允许 中断、自动装载、减计数模式。(1) 程序流程图:(2)源代码:#include “xparameters.h“
10、 #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 #define RESET_VALUE 0X5F5E100 void TimerCounterHandler(void
11、 *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( XIntc_Initialize( XIntc_Connect( XIntc_Start( XIntc_Enable( microblaze_register_handl
12、er(XInterruptHandler)XIntc_InterruptHandler, microblaze_enable_interrupts(); XTmrCtr_SetHandler( XTmrCtr_SetOptions( XTmrCtr_SetResetValue( XTmrCtr_Start( while(1); return XST_SUCCESS; void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) Xil_Out32(XPAR_LEDS_16BITS_BASEADDR, 1LedBits ); / 产生中
13、断时,输出LED显示值 LedBits +; / 修改显示位置,指向下一个LED灯 if(LedBits=16) / 由于只有 16 位 LED灯,因此位置不能 16,继 续从 bit0 开始循环 LedBits=0; 2延时方式实现走马灯 延时方式的程序,没有中断和计时器部分,通过for 循环来达到延时的 目的。 (1) 程序流程图(2)源代码如下: #include “xparameters.h“ #include “xil_io.h“ int main() u32 Led_16Bits = 0x0001; int i, j; Xil_Out32(XPAR_LEDS_16BITS_BASE
14、ADDR+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接口程序控制方法。