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核。
较为重要