前言
使用AXI Interface封装IP,并使用AXI Interface实现对IP内部寄存器进行读写实现控制LED的demo,这个demo是非常必要的,因为在前面的笔记中基本都需哟PS端与PL端就行通信互相交互,在PL端可以通过中断的形式来告知PS端一些事情,或者PS端时刻盯着某个寄存器等着PL端告诉他一些事情,但是这个这个过程比较独占CPU资源的,一般使用中断的方式;但是PS端比较方便的就是通过读写寄存器的方式控制PL端的操作,而且是要通过AXI接口,因此这个demo比较重要
目的
- 使用AXI 总线协议封住IP
- 回顾AXI 协议
- 回顾创建和打包IP
- 软硬件协同设计
创建和打包IP
参考笔记5-1 创建和打包AXI Interface IP
使用寄存器控制LED
- 并将GPIO_LED信号引入到顶层,进行引脚约束
BD设计
引脚约束
set_property PACKAGE_PIN AL11 [get_ports GPIO_LED]
set_property IOSTANDARD LVCMOS18 [get_ports GPIO_LED]set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
修改自定义AXI-IP的Makefile
- drivers\axi_user_gpio_v1_0\src目录下
生成bit流,导出xsa文件
SDK设计
/** name: main.c* description: write user regiter to control the LED GPIO*/#include "xparameters.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "sleep.h"#define GPIO_BASEADDR XPAR_AXI_USER_GPIO_0_S00_AXI_BASEADDR
#define GPIO_DATA_OFFSET 0x0#define printf xil_printfint main()
{Xil_Out32(GPIO_BASEADDR + GPIO_DATA_OFFSET, 0x0); // turn off all LEDswhile (1){sleep(1);Xil_Out32(GPIO_BASEADDR + GPIO_DATA_OFFSET, 0x1); // turn on LED0sleep(1);Xil_Out32(GPIO_BASEADDR + GPIO_DATA_OFFSET, 0x0); // turn off all LEDs}return XST_SUCCESS;
}
- 关于XPAR_AXI_USER_GPIO_0_S00_AXI_BASEADDR
- 这个地址就是在BD设计中对应接口分配的基地址
- 关于Xil_Out32函数
- 这个函数就是写32bit位宽的寄存器函数,传入的参数为地址和需要写入数据
- 对应的Xil_In32函数
- 这个函数就是读32bit位宽的寄存器函数,只需要传入地址