实现方法很简单,使用一个计数器一直计数,然后和两个值进行比较,一个值是高电平时间htime,一个值是周期period,在小于htime期间,输出高电平;大于h_time期间,输出低电平,到达周期period时,计数器清零。
pwm_gen.v
module pwm_gen(
input nreset,input clk,input en,
input [15:0] period,input [15:0] h_time,
output reg pwm
);
reg [31:0] CNT;
always @ (posedge clk)begin if(!nreset) CNT <= 0; else if(CNT >= period - 1 ) CNT <= 0; else CNT <= CNT + 1;end
always @ (posedge clk)begin if(!nreset) pwm <= 0; else //nreset = 1 begin if(en == 0) pwm <= 0; else //en = 1 begin if(CNT <= h_time - 1) pwm <= 1; else pwm <= 0; end endend
endmodule
可产生任意占空的PWM波,若主时钟为96MHz。