基于ZYNQ7000的SOC点灯实验2--使用AXI_GPIO接口实现PS和PL的交互,PS端点亮PL端的LED

创作目的:熟悉ALINX的XC7Z100开发板,熟悉ARM架构,理解ZYNQ的ARM+FPGA即PS+PL结构,熟练掌握vivado端的硬件设计以及sdk端的软件设计,实现软硬件协同工作测试板卡的功能。

1、准备工作

硬件环境:vivado 2017.4

软件环境:xilinx sdk 2017.4

2、硬件设计

创建工程,选择型号,创建block design,添加zynq的ps模块就不赘述了,可参见之前博客。

点击添加AXI GPIO接口IP核

点击进入配置界面,这里使用到4位led,全输出,配置如下

点击Run Connection Automation

  

 点击regenerate layout 刷新图标,将GPIO输出引脚修改名称为led,由自动完成的布局布线可知,我们使用的时钟都是100MHz的FCLK输出的,如果需要使用其他频率的时钟可以添加时钟模块,修改布线。

按F6验证设计的有效性并保存

 老样子,Generate Output Products,Create HDL Wrapper,添加引脚约束,生成比特流文件

这些步骤不再赘述,参考之前博客或者其他博客。下面是我的板卡对应的四个led灯的约束,不同板卡根据自己的原理图找到对应引脚,注意端口名称,我将GPIO输出名称改为了led这里就是led_tri_o,读者可打开顶层文件验证端口名称是否相同。

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[0]}]
set_property PACKAGE_PIN AJ16 [get_ports {led_tri_o[0]}]
set_property PACKAGE_PIN AK16 [get_ports {led_tri_o[1]}]
set_property PACKAGE_PIN AE16 [get_ports {led_tri_o[2]}]
set_property PACKAGE_PIN AE15 [get_ports {led_tri_o[3]}]

 

至此,硬件设计部分已经完成。导出硬件包含比特流文件,打开SDK,进入软件设计部分。

3、软件设计 

同样新建APP工程,可参照前文。在新建的工程中添加C文件

导入示例程序作为参考

 设计自己的程序

#include "xgpio.h"

XGpio Gpio;

#define LED_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID

int main(void){
	int Status;

	/* Initialize the GPIO driver */
	Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
	if (Status != XST_SUCCESS) {
		xil_printf("Gpio Initialization Failed\r\n");
		return XST_FAILURE;
	}


	XGpio_SetDataDirection(&Gpio,1,0); 	//	设置通道1,输出模式
	XGpio_DiscreteWrite(&Gpio,1,0xf);    //   使用通道1 点亮四个led灯
}

烧写程序到板卡上,右键app工程,run as configuration 选择全局复位,Program FPGA 。得到预期现象,验证了我们的设计正常,包括硬件设计和软件设计。

最后补充一下其他测试案例:

1、闪烁

2、流水灯

#include "xgpio.h"

XGpio Gpio;

#define LED_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID

#define LED_DELAY 50000000

int main(void){
	int Status;
	int delay;
	/* Initialize the GPIO driver */
	Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
	if (Status != XST_SUCCESS) {
		xil_printf("Gpio Initialization Failed\r\n");
		return XST_FAILURE;
	}


	XGpio_SetDataDirection(&Gpio,1,0); 	//	设置通道1,输出模式

	//	LED闪烁 	周期1s亮灭一次
	/*
	while (1) {
		XGpio_DiscreteWrite(&Gpio,1,0xf);
		for (delay=0;delay<LED_DELAY;delay++);
		XGpio_DiscreteWrite(&Gpio,1,0x0);
		for (delay=0;delay<LED_DELAY;delay++);
	}*/

	//	LED流水灯,0.5s流动一次
	while (1) {
		XGpio_DiscreteWrite(&Gpio,1,0x1);
		for (delay=0;delay<LED_DELAY;delay++);
		XGpio_DiscreteWrite(&Gpio,1,0x2);
		for (delay=0;delay<LED_DELAY;delay++);
		XGpio_DiscreteWrite(&Gpio,1,0x4);
		for (delay=0;delay<LED_DELAY;delay++);
		XGpio_DiscreteWrite(&Gpio,1,0x8);
		for (delay=0;delay<LED_DELAY;delay++);
	}

}

最后的最后,必须得总结一下了。这两个电灯实验虽然简单,但是还是有必要区分一下的,这对于理解ZYNQ的内部资源很有必要。首先是上个实验中的使用PS端的EMIO点亮LED灯实验,可以看到上文中的硬件设计中LED灯的引脚是直接链接在PS端的,通过PS内部的EMIO直接映射到PL端的LED,而本实验的LED引脚是间接链接在PS端的,通过AXI_GPIO这个IP核链接,相当于通过AXI_GPIO实现了PS端到PL端的交互。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值