module pwm_gen(
input clk, //连接到10M
input pwm_en, //连接到sys_on,使能信号,高电平使能输出,低电平输出为0
input rst_n,
input [23:0] pwm_freq, //输入波形的时钟频率
input [7:0] pwm_pct, //输入波形的占空比
output pwm_out //产生的PWM输出 最大时钟频率为100MHz,最大占空比为100%
);
reg [23:0] pwm_cnt;
reg [23:0] pwm_freq_para; //要产生波形的时钟频率
reg [7:0] pwm_pct_para; //要产生波形的占空比
wire [31:0] pwm_period; //PWM的周期,若主时钟96MHz,产生4MHz的波形,则period = 96/4
wire [31:0] pwm_pct_period; //高电平的时间,如主时钟96M,产生4MHz,占空比25%的波形,则h_time=24*0.25 = 6
assign pwm_period = 10_000_000/pwm_freq_para; //unit 0.1us
assign pwm_pct_period = 100_000*pwm_pct_para/pwm_freq_para;//unit 0.1us 占空比是按百分比算的,所以应该除以100,正好!!!
//make sure pwm frequecy max 100khz
always@(*)begin
if(pwm_freq > 24'd100_000) //确保PWM的最大时钟频率为100KHz
pwm_freq_para <= 24'd100_000;
else
pwm_freq_para <= pwm_freq;
end
//make sure pwm high percent max 100%
always@(*)begin
if(pwm_pct > 8'd100) //确保PWM的最大占空比为100%
pwm_pct_para <= 8'd100;
else
pwm_pct_para <= pwm_pct;
end
//pwm count from 0 to pwm period
always@(posedge clk or negedge rst_n)begin //单纯的计数器
if(!rst_n)
pwm_cnt<=24'b0;
else if(pwm_en)begin
if(pwm_cnt>=(pwm_period-1))
pwm_cnt<=24'b0;
else
pwm_cnt<=pwm_cnt+24'd1;
end
else
pwm_cnt<=24'b0;
end
//pwm out signal generate
reg pwm_sig;
assign pwm_out = pwm_sig;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
pwm_sig<=1'b0;
else if(pwm_en)begin
if(pwm_cnt<pwm_pct_period)
pwm_sig<=1'b1;
else
pwm_sig<=1'b0;
end
else
pwm_sig<=1'b0;
end
endmodule
PWM任意频率,任意占空比波形
于 2022-03-15 10:05:37 首次发布