查看原文
其他

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

wcc149 电子电路开发学习 2021-01-31

实现思路

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

端口说明

  • clk:时钟信号

  • nreset:复位信号,低电平复位,输出为0

  • en:使能信号,高电平使能输出,低电平输出为0,

  • period:PWM的周期,如主时钟96M,产生4MHz的波形,则period = 96/4 = 24

  • htime:高电平的时间,如主时钟96M,产生4MHz,占空比25%的波形,则htime = 24 * 0.25 = 6

  • pwm:PWM波输出

源程序

pwm_gen.v

  1. module pwm_gen(


  2. input nreset,

  3. input clk,

  4. input en,


  5. input [15:0] period,

  6. input [15:0] h_time,


  7. output reg pwm


  8. );


  9. reg [31:0] CNT;


  10. always @ (posedge clk)

  11. begin

  12. if(!nreset)

  13. CNT <= 0;

  14. else if(CNT >= period - 1 )

  15. CNT <= 0;

  16. else

  17. CNT <= CNT + 1;

  18. end


  19. always @ (posedge clk)

  20. begin

  21. if(!nreset)

  22. pwm <= 0;

  23. else //nreset = 1

  24. begin

  25. if(en == 0)

  26. pwm <= 0;

  27. else //en = 1

  28. begin

  29. if(CNT <= h_time - 1)

  30. pwm <= 1;

  31. else

  32. pwm <= 0;

  33. end

  34. end

  35. end


  36. endmodule

实际应用

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

  • 产生4MHz,50%占空比:period = 24,h_time = 12;

  • 产生3KHz,50%占空比:period = 32000,h_time = 16000;

  • 产生宽度10us,间隔100us的脉冲信号:period = 10560,h_time = 960;

历史精选


欢迎关注我的个人博客:

www.wangchaochao.top

或微信扫码关注我的公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存