Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯

0.前言—永远的流水灯

之前玩过ZYNQ7020的板子,现在上手ZCU102;鉴于ZCU102的资料极少,仅可参考的教程只有官方文档,所以想写一系列教程,算是做个笔记,也为后来者提供参考。本章作为入门教程的第一章,偏重于整个工程的搭建,让大家能够快速点亮ZCU102上的流水灯,原理部分不做详解;
开发环境:**Vivado2017.4 VivadoSDK **

1.硬件环境搭建

step1.启动vivado2017.4,点击Open Example Project选项,然后点击next;Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第1张图片
step2. 选择Base ZYNQUS+MPSOC;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第2张图片
step3. 选择工程保存的路径;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第3张图片
step4. 选择板子型号;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第4张图片
step5. 完成之后我们可以看到整个硬件架构图;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第5张图片
step6. 我们对这个硬件图不用做任何修改,同时不用生成输出文件,也不用产生顶层文件。对于硬件工程的修改,我们只用添加管脚约束即可,这里GPIO口输出位宽为8,对应ZCU102上的8个PL端的LED灯。查阅官方文档ug1182,在第81页可以看到8个LED灯的管脚如下:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第6张图片
step7. 点击Add Sources;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第7张图片
step8. 选择第一个;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第8张图片
step9. 创建文件,然后一路点击OK;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第9张图片

step10. 创建好文件之后,打开管脚约束文件:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第10张图片

step11. 根据官方文档给出的管脚号,编写管脚约束代码:

set_property PACKAGE_PIN AG14 [get_ports led_8bits_tri_o[0]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[0]]

set_property PACKAGE_PIN AF13 [get_ports led_8bits_tri_o[1]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[1]]

set_property PACKAGE_PIN AE13 [get_ports led_8bits_tri_o[2]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[2]]

set_property PACKAGE_PIN AJ14 [get_ports led_8bits_tri_o[3]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[3]]

set_property PACKAGE_PIN AJ15 [get_ports led_8bits_tri_o[4]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[4]]

set_property PACKAGE_PIN AH13 [get_ports led_8bits_tri_o[5]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[5]]

set_property PACKAGE_PIN AH14 [get_ports led_8bits_tri_o[6]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[6]]

set_property PACKAGE_PIN AL12 [get_ports led_8bits_tri_o[7]]
set_property IOSTANDARD LVCMOS33 [get_ports led_8bits_tri_o[7]]

step12. 保存好文件后直接点击生成bit流文件:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第11张图片

step13. 等整个工程编译生成bit文件后,点击File -> Export -> Export Hardware…

step14. 选择Include bitstream,点击OK;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第12张图片
step15. 选择File -> Launch SDK,至此硬件工程完成,启动SDK软件工程;

2.软件工程

step1. 进入SDK中:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第13张图片
step2. 点击File -> New -> Application Project,输入工程名,然后点击Next;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第14张图片
step3. 选择Empty Application,然后finish;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第15张图片
step4. 新建一个文件:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第16张图片
step5. 输入文件名后,点击finish;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第17张图片
step6. 打开main.c文件后,复制下面代码到文件里,这里的代码是参考米联客ZYNQ教程

#include "xparameters.h"
#include "xgpio.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xil_types.h"
#include "xil_io.h"
#include 

#define LED 0x01   /* Assumes bit 0 of GPIO is connected to an LED  */
#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
#define LED_DELAY     10000000
#define LED_CHANNEL 1
		
XGpio Gpio; /* The Instance of the GPIO Driver */

#define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data)	\
		Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))
#define XPAR_GPIO_LITE_ML_0 XPAR_AXI_GPIO_0_BASEADDR   //XPAR_AXI_GPIO_0_BASEADDR
#define GPIO_LITE_ML_REG0 0

int main()
{
	u8 i=0;
	XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,0X00);
	while(1)
	{
		for(i=0;i<=7;i++)
		{
		XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,1<<i);
		usleep(500000);
		}
		i=0;
	}
}

step7. 这里稍作说明下,XPAR_GPIO_0_DEVICE_ID和XPAR_AXI_GPIO_0_BASEADDR 分别代表GPIO的设备号以及基地址,这两个参数在xparameter.h中可以找到;XPAR_AXI_GPIO_0_BASEADDR 这个地址是我们在vivado硬件工程里分配的地址,一般系统都会自动分配,也可以自定义;

step8. 点击Run Configuration;
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第18张图片
step9. 双击红色箭头指的位置:
Zynq UltraScale+ ZCU102入门教程01-GPIO流水灯_第19张图片
step10. 勾选相应选项,然后点击Apply、最后点击Run;

step11. 可以看到板子上的PL端8个流水灯,依次点亮熄灭。

总结

从目前的GPIO流水灯实验中看来,ZCU使用起来大体和ZYNQ7020一样,关于整个工程的压缩包,将在评论区分享给大家。

你可能感兴趣的:(ZYNQ,UltraScale+,ZCU102)