这个小实验和上个实验本质相同,都是通过串口 + AXI_lite对寄存器读写来控制led
上个实验:https://www.limfx.pro/ReadArticle/3648/chuan-kou-kong-zhi-led-shan-shuo-ke-tiao-pin-lv
项目gitlab地址:http://120.55.75.228:23080/zhdyz/axi_pwm_led
电脑端串口调试助手发送指令到PS端串口,PS端根据指令控制PL端LED灯的亮暗状态(PWM输出)
PL端led灯分别为led0,led1,控制指令如下所示,可通过指令调整频PWM输出
与上个实验类似,自定义IP核中关于pwm控制led的部分
//pwm_ip_v1_0_S00_AXI.v
//省略上面内容
pwm_led led0(
.clk(S_AXI_ACLK),
.rstn(S_AXI_ARESETN),
.freq_set(slv_reg0),
.wave_set(slv_reg1),
.led(led[0])
);
pwm_led led1(
.clk(S_AXI_ACLK),
.rstn(S_AXI_ARESETN),
.freq_set(slv_reg2),
.wave_set(slv_reg3),
.led(led[1])
);
//pwm_led.v
module pwm_led(
input clk,
input rstn,
input [31:0]freq_set,
input [31:0]wave_set,
output led
);
reg [31:0] freq_cnt;
always@(posedge clk) begin
if(rstn==1'b0) begin
freq_cnt<=32'd0;
end
else begin
if(freq_cnt<freq_set) begin
freq_cnt<=freq_cnt+1;
end
else begin
freq_cnt<=32'd0;
end
end
end
assign led=(wave_set>freq_cnt);
endmodule
Vitis部分代码
#include "stdio.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "pwm_ip.h"
#include "xil_io.h"
#include "sleep.h"
#define LED_IP_BASEADDR XPAR_PWM_IP_0_S00_AXI_BASEADDR //LED IP基地址
#define LED_IP_REG0 PWM_IP_S00_AXI_SLV_REG0_OFFSET //LED IP寄存器地址0
#define LED_IP_REG1 PWM_IP_S00_AXI_SLV_REG1_OFFSET //LED IP寄存器地址1
#define LED_IP_REG2 PWM_IP_S00_AXI_SLV_REG2_OFFSET //LED IP寄存器地址2
#define LED_IP_REG3 PWM_IP_S00_AXI_SLV_REG3_OFFSET //LED IP寄存器地址3
#define PWM_IP_mWriteReg(BaseAddress, RegOffset, Data) \
Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
//main函数
int main()
{
//led0的占空比参数
int freq0=99;
int wave0=1;
//led1的占空比参数
int freq1=99;
int wave1=98;
xil_printf("LED PWM IP Test!\r\n");
while(1){
xil_printf("input 4 number to control led\r\n");
scanf("%d %d %d %d",&freq0,&wave0,&freq1,&wave1);
xil_printf("you input:%d %d %d %d\r\n",freq0,wave0,freq1,wave1);//输入参数回显
//写入参数
PWM_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,freq1);
PWM_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,wave1);
PWM_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG2,freq0);
PWM_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG3,wave0);
}
}
串口调试助手输入数字指令
其中led1的参数为999/1000,几乎全亮作为参照
led0的pwm参数逐渐变大,使led0的亮度不断变大
1/1000
10/1000
100/1000
500/1000
900/1000
本文章使用limfx的vscode插件快速发布