串口控制led亮度

这个小实验和上个实验本质相同,都是通过串口 + 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输出 instr

实验流程

与上个实验类似,自定义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);
   }
}

测试结果

串口调试助手输入数字指令 0

其中led1的参数为999/1000,几乎全亮作为参照

led0的pwm参数逐渐变大,使led0的亮度不断变大

1/1000 0

10/1000 0

100/1000 0

500/1000 0

900/1000 0


本文章使用limfx的vscode插件快速发布