开发板:Zedboard
开发环境:Xilinx Vivado + SDK -2018.3+W10
AXI_GPIO实际是PL端的IO管脚挂载在AXI GP总线上,通过PS端来控制的接口,使用时需要消耗PL端资源。
next –》next –》next –》next ,到default part, 搜索栏输入zed就会出来zedboard的这个包,这个是安装Vivado的时候自动安装的,直接选择点击next,完成工程创建。
创建block design
在Diagram种点击加号添加IP核,选择ZYNQ7,双击添加
点击Run Block Automation,继续添加axi_gpio ip核
双击AXI GPIO,在board interface里选择leds 8bits
看一下Ip configuration,因为这里连到led上的,已经默认配置为输出
总共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时是输出,因为上面已经默认全部输出,所以也不用修改。
接下来添加第二个axi_gpio ip核,和上面的一样,双击选择sws 8bits,点击ok,之后改名为btns_gpio
点击Run Block Automation,全选点击OK完成连线
点击图中按钮完成布线优化
接着点击Create HDL Wrapper生成顶层文件
点击Open Elaborated Design
点击I/O Ports查看管脚分配,可以看到这里都已经分配好对应管脚了,约束文件也已创建好,如果之前没有下载zedborad的包,可以自己对照原理图进行分配,保存文件
接下去生成Bitstream
导出硬件配置
打开SDK后,正常情况下可以看到我们刚才导出的硬件配置,点击左上角File->New->Application Project
接着按下图配置输入,点击next
这里我们选择Hello World模板,然后点Finish
Project Explorer里出现axi_gpio和axi_gpio_bsp,双击打开axi_gpio > src下的helloworld.c
将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;
}
连接好jtag线,按照zynq 7000的datasheet将板子设置在jtag模式
给板子上电后,因为有用到PL部分,所以要烧写配置FPGA,点击图中按钮
接下来选中axi_gpio工程,右击点击Run As->Launch on Hardware(System Debugger),等待程序烧写完成。
之后调试验证开关控制LED灯的亮灭,把led3、led4拨下去,其余开关拨上,可以看到拨上的led灯亮,拨下的灭,至此,功能验证完成,达到预期目的。