之前玩过ZYNQ7020的板子,现在上手ZCU102;鉴于ZCU102的资料极少,仅可参考的教程只有官方文档,所以想写一系列教程,算是做个笔记,也为后来者提供参考。本章作为入门教程的第一章,偏重于整个工程的搭建,让大家能够快速点亮ZCU102上的流水灯,原理部分不做详解;
开发环境:**Vivado2017.4 VivadoSDK **
step1.启动vivado2017.4,点击Open Example Project选项,然后点击next;
step2. 选择Base ZYNQUS+MPSOC;
step3. 选择工程保存的路径;
step4. 选择板子型号;
step5. 完成之后我们可以看到整个硬件架构图;
step6. 我们对这个硬件图不用做任何修改,同时不用生成输出文件,也不用产生顶层文件。对于硬件工程的修改,我们只用添加管脚约束即可,这里GPIO口输出位宽为8,对应ZCU102上的8个PL端的LED灯。查阅官方文档ug1182,在第81页可以看到8个LED灯的管脚如下:
step7. 点击Add Sources;
step8. 选择第一个;
step9. 创建文件,然后一路点击OK;
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]]
step13. 等整个工程编译生成bit文件后,点击File -> Export -> Export Hardware…
step14. 选择Include bitstream,点击OK;
step15. 选择File -> Launch SDK,至此硬件工程完成,启动SDK软件工程;
step1. 进入SDK中:
step2. 点击File -> New -> Application Project,输入工程名,然后点击Next;
step3. 选择Empty Application,然后finish;
step4. 新建一个文件:
step5. 输入文件名后,点击finish;
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;
step9. 双击红色箭头指的位置:
step10. 勾选相应选项,然后点击Apply、最后点击Run;
step11. 可以看到板子上的PL端8个流水灯,依次点亮熄灭。
从目前的GPIO流水灯实验中看来,ZCU使用起来大体和ZYNQ7020一样,关于整个工程的压缩包,将在评论区分享给大家。