PWM可以实现波形周期和占空比的可调,有着广泛的应用。
下面是实现的具体思路:设计一个计数器,该计数器从0开始计数,一直计数到pwm_cnt-1后,又回到0,这里,pwm_cnt其实就是分频数,用于调节输出波形的周期,此外,当计数器的值小于pwm_duty时,波形输出为1,否则为0(倒过来也可),可以看出,通过pwm_duty的调节,我们可以控制输出波形的占空比。

代码

module pwm(
    input logic clk,
    input logic rst,
    input logic [7:0] pwm_cnt,
    input logic [7:0] pwm_duty,
    output logic pwm_out
);

logic [7:0] cnt;
always@(posedge clk,posedge rst)
if(rst)
    cnt<=0;
else if(cnt==pwm_cnt-1)
    cnt<=0;
else 
    cnt<=cnt+1;
//
always_ff@(posedge clk,posedge rst)
if(rst)
    pwm_out<=0;
else if(cnt<pwm_duty)                                        //low 
    pwm_out<=0;
else 
    pwm_out<=1;

endmodule

测试平台文件:

module test;

logic clk;
logic rst;
logic [7:0] pwm_cnt;
logic [7:0] pwm_duty;
logic pwm_out;
initial begin
    clk=0;
    forever begin
        #5 clk=~clk;
    end
end

initial
begin
    rst=1;
    #50
    rst=0;
end

initial
begin
    pwm_cnt=128;
    pwm_duty=32;
end

initial begin
   $fsdbDumpfile("./pwm.fsdb");
   $fsdbDumpvars(0);
end

initial
begin
    #100000
    $stop;
end

pwm U(
.clk(clk),
.rst(rst),
.pwm_cnt(pwm_cnt),
.pwm_duty(pwm_duty),
.pwm_out(pwm_out));

endmodule

仿真波形

在这里插入图片描述