【JokerのZYNQ7020】AXI4_Lite_GPIO。

软件环境:vivado 2017.4        硬件平台:XC7Z020 


 今天主要是BB一下基于AXI4_Lite总线slave从端,增加自定义GPIO操作的方法。

先新建个基于AXI4_Lite总线的自定义IP部分。Tools------------> Create and Package New IP。

 然后选择Create a new AXI4 peripheral。

名字什么的最好起的有标志性一点,主要是存放的地方要设置好,以便后面其他工程调用的时候,也能找到。 

接口类型选择Lite,Slave模式。

 选Edit Ip,进入编辑模式。

打开以后就是下图这个样子,图里第一个红框可以认为是顶层文件,做外部接口用的,真正的功能和总线时序实现是在下面红框的文件里。因为模版的代码有点多,所以这里只说明该动的地方在哪,没说明的就是没动过的。

具体AXI4_Lite总线时序这次先不谈,先说这次文件怎么改, 开下面那个红框文件,18行用户接口那里,增加一个4位的LED输出,为什么是四位不是八位,因为我只有四个灯啊,当然你想八位也没什么问题,但是有用的还是只有四位啊。

 接口OK了以后,在400行,加LED控制部分,写到总线上的数据会写到slv_reg0~slv_reg3,这里我们使用slv_reg0,将写到slv_reg0的数据传给LED,来改变LED的状态。

内层实现部分做好了,别忘了修改外层接口,老样子,18行增加外部接口,72行增加传给下层的接口。

都弄好了以后,两个文件分别按保存,然后在Design Sources里,双击这个文件。

 在Ports and interfaces里,看到上面提示,刷新一下模块对外的接口。

 噹 噹 噹 噹~新增加的LED接口就刷出来啦。

最后,在Review and Package里,重新封装一下IP,自定义基于AXI4_Lite的GPIO就搞定了。

 

回到主工程,Create block design后,搜索刚才新建的自定义IP的名字就能找到了。

 搭建好的外部框架是下面这个样子。

然后老套路呀,Generate the output products,Create a HDL wrapper。加入管脚约束文件。产生Bitstream,最后导入SDK。

set_property PACKAGE_PIN J16 [get_ports {LED_o_0[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[0]}]

set_property PACKAGE_PIN K16 [get_ports {LED_o_0[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[1]}]

set_property PACKAGE_PIN G15 [get_ports {LED_o_0[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[2]}]

set_property PACKAGE_PIN H15 [get_ports {LED_o_0[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[3]}]

SDK中new application然后添加如下测试代码,就能看到四个LED轮流闪烁。 

#include <stdio.h>
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"

#define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data)	\
		Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))

#define XPAR_AXI4_LITE_GPIO XPAR_AXI4_LITE_GPIO_0_S00_AXI_BASEADDR
#define AXI4_LITE_GPIO_REG0 0

int main()
{
	u8 i=0;
	XGpio_axi_WriteReg(XPAR_AXI4_LITE_GPIO,AXI4_LITE_GPIO_REG0,0X00);
	while(1)
	{
		for(i=0;i<=3;i++)
		{
		XGpio_axi_WriteReg(XPAR_AXI4_LITE_GPIO,AXI4_LITE_GPIO_REG0,1<<i);
		usleep(500000);
		}
		i=0;
	}
}

接下来对程序中的一些函数做一些解释说明:

首先,最最最最最最最最最最最最最最最最最最最最最最最最常用的Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)),这个函数名和参数已经把意思表达的很清楚了。往BaseAddr+RegOffset里写入Data。

static INLINE void Xil_Out32(UINTPTR Addr, u32 Value)
{
#ifndef ENABLE_SAFETY
	volatile u32 *LocalAddr = (volatile u32 *)Addr;
	*LocalAddr = Value;
#else
	XStl_RegUpdate(Addr, Value);
#endif
}

然后,XPAR_AXI4_LITE_GPIO_0_S00_AXI_BASEADDR这个东西是什么,哪来的。看下面。

之前在vivado里的自建IP,被映射到地址线上了,所以对这个地址的一顿操作,可以说就相当于对自建IP的一顿操作了。记住这个地址0x43C0_0000,然后在xparameters.h里找这个地址,可以看到。

 所以主函数里的XGpio_axi_WriteReg(XPAR_AXI4_LITE_GPIO,AXI4_LITE_GPIO_REG0,1<<i);就相当于在不停的给寄存器0赋值,就相当于在给slv_reg0不停的赋值,自然可以看到灯在轮流点亮了。


 这节没啥好总结的,都是基本操作,修改基于AXI4_Lite线的自定义IP,就不多哔哔了。古德拜~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值