ZYNQ学习笔记——6_自定义IP_led实验

6_自定义IP_led实验

实验现象:快闪5s,关闭1s,慢闪5s,关闭1s

为了将模块或者代码能够重复使用,可以自定义IP核将这些模块集成到vivado中的IP库中。

本实验创建一个带有AXI接口的IP核,该IP核通过AXI协议实现PS和PL的数据通信。

在这里插入图片描述

框图中的 UART 用于打印信息,Breath LED IP 核为自定义的 IP 核,PS 通过 AXI 接口为 LED IP 模块 发送配置数据,从而来控制PL LED 灯。

实验过程

见正点原子视频和资料

约束文件:

set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { led }]; #IO_L6N_T0_VREF_34 Sch=led[0]

代码

代码1,直接改变LED状态

#include "stdio.h"
#include "xparameters.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"

//实验现象:快闪5s,关闭1s,慢闪5s,关闭1s

#define LED_IP_BASEADDR		XPAR_BREATH_LED_IP_0_S01_AXI_BASEADDR
#define LED_IP_REG0			BREATH_LED_IP_S01_AXI_SLV_REG0_OFFSET
#define LED_IP_REG1			BREATH_LED_IP_S01_AXI_SLV_REG1_OFFSET

int main()
{
	int freq_flag = 1;
	printf("LED USER IP TEST !\n");

	while(1)
	{
		if(freq_flag == 1)
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x800000ef);//快闪
			freq_flag = 0;
		}
		else
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x8000002f);//慢闪
			freq_flag = 1;
		}

		BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,1);//打开呼吸灯开关
		printf("Breath LED ON!\n");
		usleep(5000000);//延迟5s,用us更精确

		BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0);//打开呼吸灯开关
		printf("Breath LED OFF!\n");
		usleep(1000000);

	}
	return 0;
}

代码2,读取寄存器的值来改变LED状态

#include "stdio.h"
#include "xparameters.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"

//实验现象:快闪5s,关闭1s,慢闪5s,关闭1s

#define LED_IP_BASEADDR		XPAR_BREATH_LED_IP_0_S01_AXI_BASEADDR
#define LED_IP_REG0			BREATH_LED_IP_S01_AXI_SLV_REG0_OFFSET
#define LED_IP_REG1			BREATH_LED_IP_S01_AXI_SLV_REG1_OFFSET

int main()
{

	int freq_flag = 1;
	int led_status = 1;
	printf("LED USER IP TEST !\n");

	while(1)
	{
		//转变呼吸频率
		if(freq_flag == 1)
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x800000ef);//快闪
			freq_flag = 0;
		}
		else
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x80000030);//慢闪
			freq_flag = 1;
		}


		//转变LED状态
		led_status = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//读取LED状态
		if(led_status == 0)	//如果LED	关闭,就打开LED。
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,1);//打开呼吸灯开关
			printf("Breath LED ON!\n");
		}
		usleep(5000000);//延迟5s,用us更精确

		led_status = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//读取LED状态
		if(led_status == 1)	//如果LED	打开,就关闭LED。
		{
			BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0);//打开呼吸灯开关
			printf("Breath LED OFF!\n");
		}
		usleep(1000000);//延迟1s,用us更精确

	}

	return 0;

}

两块代码功能相同

补充

视频最后补充了如何更改已经定义好的IP核。

较为重要

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
xilinx_zynq7020 自定义 IP 开发文档是一份描述如何开发和使用自定义 IP(Intelligent Property)的技术文档。Zynq-7020 是 Xilinx 公司生产的一款可编程逻辑器件,搭载了 ARM 处理器和 FPGA 芯片,能够同时实现软件和硬件设计,为嵌入式系统开发提供一种更灵活的解决方案。 在自定义 IP 开发文档中,我们将了解如何使用 Vivado 设计套件来开发自己的 IP。首先,我们需要对 IP 的功能和硬件架构进行规划和设计。可以选择将已有的硬件模块集成为 IP 核,也可以通过硬件描述语言(HDL)从零开始编写 IP 核。然后,我们将详细说明如何使用 Vivado 的 IP Integrator 工具集成 IP 核到我们的设计中,并进行连接和配置。 在自定义 IP 开发文档中,我们还将了解如何为 IP 核创建适当的接口,包括输入输出端口和控制寄存器等。可以通过使用 AXI 或者其他总线协议来定义接口。此外,我们还将学习如何为 IP 核编写相应的测试代码,并在仿真和实际硬件中进行验证和调试。 除了基础的 IP 开发知识,这份文档还提供了一些高级话题,如如何优化 IP 核的性能,如何编写可重用的 IP 代码等。另外,文档还包含了一些实际案例,以帮助读者更好地理解和应用这些知识。 总之,xilinx_zynq7020 自定义 IP 开发文档详细介绍了如何使用 Vivado 设计套件开发和使用自定义 IP 核。通过学习这份文档,读者可以了解到 IP 开发的基础知识,掌握相关工具的使用方法,并具备开发和优化 IP 核的能力,从而更好地应用于各种嵌入式系统开发中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值