ZYNQ-调用自定义AXI接口呼吸灯IP

学习内容

本节使用前文实现AXI接口的呼吸灯的IP,挂载到AXI总线调用驱动axi呼吸灯IP。

开发环境

vivado 18.3&SDK
PYNQ-Z2开发板

硬件平台搭建

新建工程,创建 block design。添加呼吸灯IP和ZYNQ7,对zynq进行初始化配置,然后进行自动连接。
在这里插入图片描述
完成自动连线后,
在这里插入图片描述
对AXI接口的led管脚进行引脚引出定义
在这里插入图片描述
完整的平台设计图:
在这里插入图片描述
然后我们进行generate output product 然后生成HDL封装。接着就对应引脚进行引脚约束即可(这里的LED是使用的PL资源,PYNQ的粉色开发板可以直接引用这个约束):
set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { led }]; #IO_L6N_T0_VREF_34 Sch=led[0]
完成约束后进行综合布局布线,等待生成bit流文件。bit文件生成后在FILE处,点击导出硬件资源(包含bit流文件),接着launch SDK。

软件部分编写

打开SDK后,新建application project。在hw_platform文件夹下,可以找到系统生成的驱动的实例程序,方便我们进行代码的编写调试。
在这里插入图片描述

#define BREATH_LED_IP_mReadReg(BaseAddress, RegOffset) \
    Xil_In32((BaseAddress) + (RegOffset))
#define BREATH_LED_IP_mWriteReg(BaseAddress, RegOffset, Data) \
  	Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
  	
XStatus BREATH_LED_IP_Reg_SelfTest(void * baseaddr_p);

使用上面的三个函数,我们可以对AXI接口的呼吸灯的IP进行控制。具体的函数的参数数据,数据我们可以在头文件中找到相关说明。
BaseAddress这个参数可以在#include"xparameters.h"中寻到。这里为了方便引用,我们进行了定义#define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR
RegOffset可以在#include"breath_led_ip.h"找到,这里我在代码中进行了定义#define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET
Data这里对于写函数来说就是配置我们的寄存器的值,这里我们也就是完成对呼吸灯IP的开关、频率步进等参数的设置。回看前文我们对功能寄存器的设置,这里我仅仅使用了reg0,完成对呼吸灯IP的配置。
reg0[31]设置呼吸灯频率设置使能信号 reg0[0]设置控制开关 reg0[10:1]设置频率
在这里插入图片描述
贴出完整代码:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include"xparameters.h"
#include"breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"
#define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR
#define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET
int main()
{
	int led_para=0;
    init_platform();
    //自测LED IP功能是否正常
    BREATH_LED_IP_Reg_SelfTest(LED_IP_BASEADDR);
    sleep(1);
    //reg0[31]设置呼吸灯频率设置使能信号   reg0[0]设置控制开关      reg0[10:1]设置频率
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800007FF);
    sleep(3);
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800000AF);
    sleep(3);
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800007FE);
    sleep(3);
    led_para=BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);
    if(led_para==0X800007FE){
    	print("led off\n\r");
    }
    cleanup_platform();
    return 0;
}

代码完成编写后,成功下载到板子中,首先运行自动生成的测试程序,可以看到串口打印信息成功读写。接着看到我们的LED灯,先快速呼吸闪烁,然后慢速呼吸闪烁,最后关闭LED后通过读取函数读到正确的参数配置值,打印led off信息。
在这里插入图片描述

Vuko公众号同步更新~

欢迎大家关注我的公众号。如果需要工程微信后台留言即可~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vuko-wxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值