zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯

开发板:Zedboard

开发环境:Xilinx Vivado + SDK -2018.3+W10

AXI_GPIO实际是PL端的IO管脚挂载在AXI GP总线上,通过PS端来控制的接口,使用时需要消耗PL端资源。

1.创建Vivado工程

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第1张图片

next –》next  –》next –》next ,到default part, 搜索栏输入zed就会出来zedboard的这个包,这个是安装Vivado的时候自动安装的,直接选择点击next,完成工程创建。

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第2张图片

创建block design

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第3张图片

在Diagram种点击加号添加IP核,选择ZYNQ7,双击添加

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第4张图片

点击Run Block Automation,继续添加axi_gpio ip核

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第5张图片

双击AXI GPIO,在board interface里选择leds 8bits

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第6张图片
看一下Ip configuration,因为这里连到led上的,已经默认配置为输出

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第7张图片

总共8个led,gpio width已经默认设置成8,三太值为0xFFFFFFFF,这里看下axi_gpio的文档,https://china.xilinx.com/support/documentation/ip_documentation/axi_gpio/v2_0/pg144-axi-gpio.pdf,三态值为0时是输出,因为上面已经默认全部输出,所以也不用修改。

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第8张图片

改名为led_gpiozynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第9张图片

接下来添加第二个axi_gpio ip核,和上面的一样,双击选择sws 8bits,点击ok,之后改名为btns_gpio

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第10张图片

点击Run Block Automation,全选点击OK完成连线

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第11张图片

点击图中按钮完成布线优化

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第12张图片

接着点击Create HDL Wrapper生成顶层文件

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第13张图片

点击Open Elaborated Design

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第14张图片

点击I/O Ports查看管脚分配,可以看到这里都已经分配好对应管脚了,约束文件也已创建好,如果之前没有下载zedborad的包,可以自己对照原理图进行分配,保存文件

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第15张图片

接下去生成Bitstream

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第16张图片

导出硬件配置

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第17张图片

 

2.输出到SDK

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第18张图片

打开SDK后,正常情况下可以看到我们刚才导出的硬件配置,点击左上角File->New->Application Project

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第19张图片

接着按下图配置输入,点击next

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第20张图片

这里我们选择Hello World模板,然后点Finish

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第21张图片

Project Explorer里出现axi_gpio和axi_gpio_bsp,双击打开axi_gpio > src下的helloworld.c

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第22张图片

将helloworld.c的内容换成如下内容,保存文件后会自动编译工程

#include 
#include "platform.h"
#include "xparameters.h"
#include "xgpio.h"  //axi_gpio
#include "sleep.h"
#include "platform.h"
#include "xil_types.h"
#include "xgpiops.h" //mio/emio


#define XPAR_LEDS_ID XPAR_LED_GPIO_BASEADDR  //led_gpio
#define XPAR_SWS_ID XPAR_BTNS_GPIO_BASEADDR   // btns_gpio
#define LED_CHANNEL 1
#define BTNS_CHANNEL 1
int main()
{
     static XGpio LED_Ptr;//定义GPIO指针
     static XGpio SWS_Ptr;
     int XStatus;
     int num = 0;
    
     XStatus = XGpio_Initialize(&LED_Ptr,XPAR_LED_GPIO_DEVICE_ID);  //初始化 LED
     if(XST_SUCCESS != XStatus)
             print("GPIO INIT FAILED\n\r");
     XGpio_SetDataDirection(&LED_Ptr, LED_CHANNEL,0x00);//通道1;设置方向 0 输出 1输入, 0x00表示8位都是输出
     XGpio_DiscreteWrite(&LED_Ptr, LED_CHANNEL,0x00);  //led8位全部写入0

     XStatus = XGpio_Initialize(&SWS_Ptr,XPAR_BTNS_GPIO_DEVICE_ID); //初始化 开关
     if(XST_SUCCESS != XStatus)
             print("GPIO INIT FAILED\n\r");
     XGpio_SetDataDirection(&SWS_Ptr, BTNS_CHANNEL,0xFF);//通道1;设置方向 0 输出 1输入 0xFF表示8位都是输入



     while(1){
         num = XGpio_DiscreteRead(&SWS_Ptr, BTNS_CHANNEL);  //从开关处 读数据
         printf("Numb %d\n\r", num);
         XGpio_DiscreteWrite(&LED_Ptr, LED_CHANNEL,num);   //直接写入 led
         usleep(1000);      //delay 1ms
     }

     printf("end\n\r \n\r");
     return 0;
 }

3.仿真调试

连接好jtag线,按照zynq 7000的datasheet将板子设置在jtag模式

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第23张图片

给板子上电后,因为有用到PL部分,所以要烧写配置FPGA,点击图中按钮

zynq 7000 zedboard通过AXI_GPIO IP核使用按键控制led灯_第24张图片

接下来选中axi_gpio工程,右击点击Run As->Launch on Hardware(System Debugger),等待程序烧写完成。

之后调试验证开关控制LED灯的亮灭,把led3、led4拨下去,其余开关拨上,可以看到拨上的led灯亮,拨下的灭,至此,功能验证完成,达到预期目的。

 

你可能感兴趣的:(zynq)