华科电信并行IO接口走马灯实验报告.docx
《华科电信并行IO接口走马灯实验报告.docx》由会员分享,可在线阅读,更多相关《华科电信并行IO接口走马灯实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
华科电信并行IO接口走马灯实验报告
电子信息与通信学院
实验报告
实验名称:
微机原理实验
课程名称:
并行IO接口设计
班级:
姓名:
学号:
教师:
一、实验目的
1.掌握GPIOIP核的工作原理和使用方法
2.掌握中断控制方式的IO接口设计原理
3.掌握中断程序设计方法
4.掌握IO接口程序控制方法
-------查询方式
-------延时方式
二、实验任务
写一个Led走马灯输出的程序,并下载到FPGA板子上,用延时、中断两种方式实现。
三、实验原理
硬件实现框图如图所示:
四、硬件实现步骤
1.使用XPS创建一个基于AXI总线的最小计算机系统。
File–>NewBSBProject,如图:
2.修改时钟设置:
将时钟产生器的时钟输入信号进行修改,修改为单一时钟源。
修改后的结果如图:
3.添加GPIOIP核,设置LEDs_8Bits配置:
a.在IPCatalog标签中,双击下面图标创建GPIOIP核:
b.添加GPIOIP核后,将名字改为LED_16Bits,如图:
c.更改LED_16Bits配置窗口的属性,如图:
4.添加AXIInterruptControllerIP核:
a.在IPCatalog标签中,双击下面图标创建INTCIP核:
b.添加axi_intc_0的中断源,如图:
c.将microblaze_0实例的INTERRUPT引脚选择axi_intc_0_INTERRUPT,如图:
5.产生外部GPIO连接:
a.选中LEDs_16Bits中的GPIO_IO_O,选择makeexternal,生成外部连接端口;选中GPIO_IO,设置为“Noconnection”,取消其外部连接端口。
结果如图:
b.在ports标签下,展开ExternalPorts项,可看到LEDs_16Bits生成的LEDs_16Bits_GPIO_IO_PIN端口,如图:
6.添加timerIP核:
a.选择如图的IP核并双击,添加到工程:
b.中断信号的连接结果如图所示:
7.配置UCF文件:
在UCF文件中修改如下所示配置,配置LED连接电路约束:
NET"CLK"TNM_NET=sys_clk_pin;
TIMESPECTS_sys_clk_pin=PERIODsys_clk_pin100000kHz;
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<0>"LOC="T8"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<1>"LOC="V9"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<2>"LOC="R8"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<3>"LOC="T6"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<4>"LOC="T5"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<5>"LOC="T4"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<6>"LOC="U7"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<7>"LOC="U6"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<8>"LOC="V4"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<9>"LOC="U3"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<10>"LOC="V1"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<11>"LOC="R1"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<12>"LOC="P5"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<13>"LOC="U1"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<14>"LOC="R2"|IOSTANDARD="LVCMOS33";
NET"LEDs_16Bits_GPIO_IO_pin<15>"LOC="P2"|IOSTANDARD="LVCMOS33";
8.创建工程过程完成后,
a.在主界面下选择Hardware->GenerateNetlist;
b.在主界面下选择Hardware->GenerateBitstream;
c.单击GraphicalDesignView,可以看到系统的连接图,如下:
五、软件设计
1.中断方式实现走马灯
用户应用程序的设计包括定时器配置、启动中断系统、设计中断服务程序。
中断服务程序:
要求每产生一次中断led灯亮的位置向高位移动1位。
完整的程序代码如下,其中:
main为主程序,timerCounterHandler为中断服务程序。
该程序设置定时器初始值为0x5f5e100,表示计数100M个时钟脉冲,由于时钟为100MHz,因此1秒钟产生一次中断。
设置定时器的工作方式为允许中断、自动装载、减计数模式。
(1)程序流程图:
(2)源代码:
#include"xparameters.h"
#include"xtmrctr.h"
#include"xintc.h"
#include"xil_exception.h"
#defineTMRCTR_DEVICE_IDXPAR_TMRCTR_0_DEVICE_ID
#defineTMRCTR_INTERRUPT_IDXPAR_INTC_0_TMRCTR_0_VEC_ID
#defineINTC_DEVICE_IDXPAR_INTC_0_DEVICE_ID
#defineTIMER_CNTR_00
#defineRESET_VALUE0X5F5E100
voidTimerCounterHandler(void*CallBackRef,u8TmrCtrNumber);
XIntcInterruptController;
XTmrCtrTimerCounterInst;
u32LedBits;
intmain(void){
intStatus;
LedBits=0;
Xil_Out32(XPAR_LEDS_16BITS_BASEADDR+0x04,0x0);
Status=XTmrCtr_Initialize(&TimerCounterInst,TMRCTR_DEVICE_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);
microblaze_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_DOWN_COUNT_OPTION);
XTmrCtr_SetResetValue(&TimerCounterInst,TIMER_CNTR_0,RESET_VALUE);
XTmrCtr_Start(&TimerCounterInst,TIMER_CNTR_0);
while
(1);
returnXST_SUCCESS;
}
voidTimerCounterHandler(void*CallBackRef,u8TmrCtrNumber){
Xil_Out32(XPAR_LEDS_16BITS_BASEADDR,1<//产生中断时,输出LED显示值
LedBits++;
//修改显示位置,指向下一个LED灯
if(LedBits==16)//由于只有16位LED灯,因此位置不能≧16,继续从bit0开始循环
LedBits=0;
}
2.延时方式实现走马灯
延时方式的程序,没有中断和计时器部分,通过for循环来达到延时的目的。
(1)程序流程图
(2)源代码如下:
#include"xparameters.h"
#include"xil_io.h"
intmain()
{
u32Led_16Bits=0x0001;
inti,j;
Xil_Out32(XPAR_LEDS_16BITS_BASEADDR+0x4,0x0);
while
(1){
for(i=0;i<16;i++){
Xil_Out32(XPAR_LEDS_16BITS_BASEADDR,Led_16Bits);
//输出LED显示值
for(j=0;j<0xa5e100;j++);//延时
Led_16Bits=Led_16Bits<<1;//指向下一个LED灯
}
Led_16Bits=0x0001;
}
return0;
}
六、心得体会
通过用两种方式实现走马灯的实验,我掌握了GPIOIP核的工作原理和使用方法,同时也明白了中断控制方式的IO接口设计原理,在这基础上,又进一步学习到了中断程序设计方法以及IO接口程序控制方法。