XU.J.P

第三章 流水灯实验

1
阅读(1786)

不管如何,流水灯实验在哪都跑不掉。从本章开始我们实验都将在前章实验的基础上添加新的IP,不再建立新的工程。新建一个文件夹作为本章工程文件夹,复制上一章工程到本章。启动ISE后,启动XPS进行配置。

◎添加AXI GPIO,即通用接口IP。

clip_image002

◎添加后弹出的对话框中,将IP命名为LED,修改数据位宽为8位,保持和mis603上LED灯个数一致。

clip_image004

◎点击OK后,将IP连接到MB上。

clip_image006

◎从Ports中可以看出,添加的LED,端口已经输出,且数据位宽为8bit。

clip_image008

◎在LED的IP中,下拉列表中选择GPIO_IO_O为连接到外部输出,GPIO_IO选择为No Connection。

clip_image010

◎在mhs文件中同样可以看到对应的硬件信息。

clip_image012

◎在UCF文件中添加LED的信号约束。这样LED灯的硬件平台就构建结束,使用Generate Netlist产生对应的网表。

clip_image014

◎在ISE中产生顶层文件,并编译该工程。待编译完成后,通过XPS打开SDK,路径设置为MB_SDK。

◎在SDK里,我们可以看到上次测试用的DDR3_Test工程,这里不在用到这个工程了,可以不用理会。

clip_image016

◎在system.xml里面查看,各个IP的版本号是否都在,如果不在,重启SDK。

clip_image018

◎在SDK中新建一个空的项目,命名为Water_LED。

clip_image020clip_image022

◎在src路径下新建个water_led.c文件。

clip_image024

◎添加LED灯闪烁的源代码

/ * Water_LED.c

* Created on: 2016-01-10

* Author: Milinker XU

*/

#include "xparameters.h"

#include "xgpio.h"

#include "stdio.h"

#include "xil_types.h"

void delay_ms(u16 tnms)//不精确的延迟

{

u16 n1,n2;

for(n1=0; n1<2500; n1++)

for(n2=0;n2<tnms;n2++);

}

int main()

{

u8 i=0;

u32 led;

led=0x0000;

XGpio_Out32(XPAR_LED_BASEADDR,led);

delay_ms(500);

led=0xffff;

XGpio_Out32(XPAR_LED_BASEADDR,led);

delay_ms(500);

while(1)

{

i=0;

led=0xFE;

while(i<8)

{

XGpio_Out32(XPAR_LED_BASEADDR,led);

led<<=1;

i++;

delay_ms(100);

}

}

return 0;

}

◎将Bit文件下载到mis603,再运行上面程序,可以看到LED此时欢快地跑起来了。

◎下面简单谈谈MB系统中,通用IO的使用。由于MB类似于一个单片机系统,因此,其配置的IO口,与单片机的并口相类似。Xilinx在SDK开发环境中提供的BSP,里面有完成开发所需的头文件和源文件等。如下图所示,BSP文件包中对于开发者而言,提高了太多的效率。使得MB系统就如同普通单片机一样简单。

clip_image026

◎打开gpio_v3_01_a文件下,查看底层的源文件和文件。Xilinx对每个IP的开发,都有详细的介绍和对应的开发例程序。然而很多人并不知道,很多人在开发的过程中,各种查阅自己,却不知道,ISE和SDK在安装的时候就已经有该部分的文档了。打开安装路径下的..\ISE\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers,可以看到SDK开发过程中的每个IP。

clip_image028

◎如我们现所使用的gpio,其对应的文件就包括下图所示。有了这些,开发将会变的极其轻松。但是请注意,最好将XilinxProcessorIPLib整个文件夹拷贝一份到别处使用,防止我们对底层文件修改,导致SDK中编译无法通过。对于具体的寄存器的使用,这里不在一一介绍,请大家根据自身需求完成开发。

clip_image030