ZYNQ-自定义呼吸灯IP核以及PS-PL数据发送接收
试验任务:
1. 自定义一个LED IP核,控制PL LED呈现呼吸灯的效果
2.PS可以通过AXI接口来控制呼吸灯的开关和呼吸的频率
3.中途在底层修改自定义IP核,新增一个数据发送接收功能的寄存器接口
4.实现PS-PL之间的数据发送接收功能(32bit)
IP核例化:
breath_led #(
.START_FREQ_STEP(START_FREQ_STEP)
) )
u_breath_led( (
.sys_clk (S_AXI_ACLK ),
.sys_rst_n (S_AXI_ARESETN ),
.sw_ctrl (slv_reg0[ [0 ]),
.set_en (slv_reg1[ [31 ]),
.set_freq_step (slv_reg1[ [9: :0 ]),
.led (led) )
);
代码中的 slv_reg0 和 slv_reg1 是寄存器地址 0 和寄存器地址 1 对应的数据,通过寄存器地址 0 对应的数据来控制呼吸灯的使能(sw_ctrl),寄存器地址 1 对应数据的最高位控制呼吸灯频率的设置有效信号(set_en),寄存器地址 1 对应数据的低 10 位控制呼吸灯频率的步长(set_freq_step)。
VITIS代码:
#include "xparameters.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "stdio.h"
#include "sleep.h"
//reg0控制开关reg1控制频率reg2发送接受数据
#define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR
#define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET
#define LED_IP_REG1 BREATH_LED_IP_S0_AXI_SLV_REG1_OFFSET //
#define LED_IP_REG2 BREATH_LED_IP_S0_AXI_SLV_REG2_OFFSETint main(){int freq_flag = 0; //定义频率标志位,用户循环切换呼吸灯的频率int led_status = 0;int data_in = 0;printf("LED USER IP TEST\n");while(1){if(freq_flag == 0){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x800000ef);freq_flag = 1;}else {BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x8000002f);freq_flag = 0;}//打开呼吸灯开关led_status = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR, LED_IP_REG0);if(led_status == 0){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0x00000001);printf("BREATH ON\n");}sleep(5);//关闭呼吸灯开关led_status = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR, LED_IP_REG0);if(led_status == 1){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0x00000000);printf("BREATH OFF\n");}sleep(1);data_in = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR, LED_IP_REG2);printf("data_in = %d\n",data_in);}return 0;}
实现打印窗口:(板级验证LED呼吸可变闪烁图不好上传就不放了)
在对工程进行debug的时候系统会莫名其妙的产生错误,导入这个头文件报错:
#include "xparameters.h"
报错信息如下:
fatal error:xparameters.h:no such file or directory
报错原因暂时不管,参照网上这位博主可以解决:
Vitis2021.1报错:fatal error: xparameters.h: No such file or directory-CSDN博客