第一个ZYNQ的实验,用于熟悉开发环境和板卡,通过GPIO控制LED,由于P2在ps端没有LED,所以需要通过axi总线控制PL端LED。
1、参考设计
参考的是黑金的《PL 端和 PS 端的协同设计流水灯实验 》。
2、新建工程
新建一个工程,选择zynq的FPGA,然后Create Block Design,然后右击Add ip,输入zynq,如下图所示:
然后更改里面配置,首先将时钟设置为50M,如下图所示:
为了使用SDK中的hellow world例程,需要选择一路串口,U0和U1都可以,P2使用的是U0, ZEDBOARD使用的是U1打印。
再添加GPIO
步骤就是RunBlockAutomation-->GenerateOutputProducts-->GenerateOutputProducts
最后添加约束文件xdc
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[3]}]
set_property PACKAGE_PIN R14 [get_ports {gpio_rtl_tri_o[0]}]
set_property PACKAGE_PIN P14 [get_ports {gpio_rtl_tri_o[1]}]
set_property PACKAGE_PIN N16 [get_ports {gpio_rtl_tri_o[2]}]
set_property PACKAGE_PIN M14 [get_ports {gpio_rtl_tri_o[3]}]
生成bit文件,然后export,同时export bit文件,最后launch SDK。
3、SDK端设计
SDK的界面类似于eclipse,新建APP。
然后输入随意的名称,选择hello world的工程。
修改main文件如下所示:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"
XGpio GpioOutput;
int main()
{
u32 Delay;
u32 Ledwidth;
init_platform();
XGpio_Initialize(&GpioOutput,XPAR_AXI_GPIO_0_DEVICE_ID);
XGpio_SetDataDirection(&GpioOutput, 1, 0x0);
XGpio_DiscreteWrite(&GpioOutput, 1, 0x0);
while (1)
{
for(Ledwidth =0x0;Ledwidth < 4; Ledwidth++)
{
XGpio_DiscreteWrite(&GpioOutput,1,1<< Ledwidth);
for(Delay = 0; Delay < 8000000; Delay++);
XGpio_DiscreteClear(&GpioOutput,1, 1 <<Ledwidth);
}
}
cleanup_platform();
return 0;
}
首先下载bit,然后运行软件,流水灯就亮了。
4、问题解决
一开始SDK一直提示无法停止after reset,需要将SD卡取下来,并按SRST,就可以了。