单片机点灯小能手 · 2020年07月09日

Verilog实现产生任意占空比的PWM波

作者:王超
首发:电子电路开发学习

实现思路

实现方法很简单,使用一个计数器一直计数,然后和两个值进行比较,一个值是高电平时间h\_time,一个值是周期period,在小于h\_time期间,输出高电平;大于h\_time期间,输出低电平,到达周期period时,计数器清零。

端口说明

  • clk:时钟信号
  • nreset:复位信号,低电平复位,输出为0
  • en:使能信号,高电平使能输出,低电平输出为0,
  • period:PWM的周期,如主时钟96M,产生4MHz的波形,则period = 96/4 = 24
  • h\_time:高电平的时间,如主时钟96M,产生4MHz,占空比25%的波形,则h\_time = 24 * 0.25 = 6
  • pwm:PWM波输出

源程序

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
    end
end

endmodule

实际应用

可产生任意占空的PWM波,若主时钟为96MHz。

  • 产生4MHz,50%占空比:period = 24,h\_time = 12;
  • 产生3KHz,50%占空比:period = 32000,h\_time = 16000;
  • 产生宽度10us,间隔100us的脉冲信号:period = 10560,h\_time = 960;



推荐阅读

欢迎关注公众号:电子电路开发学习,id:mcu149
更多电子电路、单片机、嵌入式、物联网等技术文章欢迎关注电子电路开发学习专栏。
推荐阅读
关注数
3062
内容数
83
电子电路、单片机、嵌入式、物联网等技术文章分享。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息