前言
本文着重总结了使用PYNQ-Z2板子在配置zynq PS ip核的过程,我之前因为此处配置不对出了很多错,比如无法生成bit,下载程序出错等,看了很多博客,这样配置目前是不会出错的。
另外我之前尝试使用emio控制pl的按键和led,按键输入没问题,但是输出有小问题:不接led,就可以正常输出1,接上led就输出就一直是0,没找到原因,所以只能使用axi来实现按键控制led的功能。
本人水平有限,文中有任何不对的地方,欢迎指正!^-^
注意:本文使用的是pynq板文件,如果使用的是芯片文件,配置过程会有所不同,需要注意
实验任务
利用AXI GPIO IP核,实现PS读取PL端的四个按键状态,并输出到PL端的四个led,实现一个按键控制一个led灯
硬件设计
块设计
添加zynq与axi gpio ip核
zynq 配置:
1.常规配置:
开启uart0:
配置DDR,这里pynq电路图里的ddr3型号其实并不包含在这里面,但选用这个也可以正常使用,可能是兼容的,注意需要设置16bit
2.pynq独特配置
在用户手册里可以看到,需要更改时钟为50Mhz
MIO中bank1改为1.8v,也可以在电路图中找到:
zynq 配置结束
axi gpio ip核配置如下,因为用的板文件,这里直接按提示选择led和按键就行:
自动连接IP核:
这里会自动添加两个ip核,一个是AXI互联,一个是提供复位信号的,这里可以不过多了解
验证之后就可以生成顶层 HDL 了
管脚定义
由于前面自动选择了led与按键,可以看到这里系统已经自动配置好了管脚:
导出硬件
生产bit流并导出到SDK
软件设计
主函数代码如下:
#include "xil_printf.h"
#include "xil_io.h"
#include "xgpio.h"
#include "xparameters.h"
int main()
{
print("Hello World\n\r");
//实例变量
XGpio led_key;
//初始化器件驱动
XGpio_Initialize(&led_key,XPAR_AXI_GPIO_0_DEVICE_ID);
//设置io方向 Bits set to 0 are output and bits set to 1 are input.
XGpio_SetDataDirection(&led_key,1,0b0000);
XGpio_SetDataDirection(&led_key,2,0b1111);
XGpio_DiscreteWrite(&led_key,1,0b0000);
while(1)
{
int a=XGpio_DiscreteRead(&led_key,2);
XGpio_DiscreteWrite(&led_key,1,a);
}
return 0;
}
实验现象