【Verilog HDL 训练】第 10 天(PWM 呼吸灯)

举报
李锐博恩 发表于 2021/07/15 04:14:28 2021/07/15
【摘要】 5月8日 PWM 用verilog实现PWM控制呼吸灯。呼吸周期2秒:1秒逐渐变亮,1秒逐渐变暗。系统时钟24MHz,pwm周期1ms,精度1us。 今天的题目我是第一次见,答案借鉴大神的:Verilog没有葵花宝典打卡day10.md 简述PWM PWM——脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路...

5月8日

PWM

用verilog实现PWM控制呼吸灯。呼吸周期2秒:1秒逐渐变亮,1秒逐渐变暗。系统时钟24MHz,pwm周期1ms,精度1us。


今天的题目我是第一次见,答案借鉴大神的:Verilog没有葵花宝典打卡day10.md

简述PWM

PWM——脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变化等许多领域。

LED特效呼吸灯原理

采用pwm的方式,在固定的频率下,采用占空比的方式来实现LED亮度的变化。占空比为0,LED灯不亮,占空比为100%,则LED灯最亮。所以将占空比从0到100%,再从100%到0不断变化,就可以实现LED灯实现特效呼吸。

下面是Verilog描述:

注:上硬件测试时,参数DELAY1000 还是要改为1000,下面代码中的DELAY1000 = 10是愿作者为了仿真方便定的值。


  
  1. module Breath_LED(
  2. input clk, //24Mhz
  3. input rst_n,
  4. output led_out
  5. );
  6. parameter DELAY24 = 24;
  7. //parameter DELAY1000 = 1000;
  8. parameter DELAY1000 = 10;//just test
  9. wire delay_1us;
  10. wire delay_1ms;
  11. wire delay_1s;
  12. reg pwm;
  13. reg [7:0] cnt1;
  14. reg [10:0] cnt2;
  15. reg [10:0] cnt3;
  16. reg display_state;
  17. //延时1us
  18. always @(posedge clk or negedge rst_n)begin
  19. if(!rst_n)
  20. cnt1 <= 6'b0;
  21. else if(cnt1 == DELAY24 - 1'b1)
  22. cnt1 <= 6'b0;
  23. else
  24. cnt1 <= cnt1 + 1'b1;
  25. end
  26. assign delay_1us = (cnt1 == DELAY24 - 1'b1)? 1'b1:1'b0;
  27. //延时1ms
  28. always @(posedge clk or negedge rst_n)begin
  29. if(!rst_n)
  30. cnt2 <= 10'b0;
  31. else if(delay_1us == 1'b1)begin
  32. if(cnt2 == DELAY1000 - 1'b1)
  33. cnt2 <= 10'b0;
  34. else
  35. cnt2 <= cnt2 + 1'b1;
  36. end
  37. else
  38. cnt2 <= cnt2;
  39. end
  40. assign delay_1ms = ((delay_1us == 1'b1) && (cnt2 == DELAY1000 - 1'b1))? 1'b1:1'b0;
  41. //延时1s
  42. always @(posedge clk or negedge rst_n)begin
  43. if(!rst_n)
  44. cnt3 <= 10'b0;
  45. else if(delay_1ms)
  46. begin
  47. if(cnt3 == DELAY1000 - 1'b1)
  48. cnt3 <= 10'b0;
  49. else
  50. cnt3 <= cnt3 + 1'b1;
  51. end
  52. else
  53. cnt3 <= cnt3;
  54. end
  55. assign delay_1s = ((delay_1ms == 1'b1) && (cnt3 == DELAY1000 - 1'b1))? 1'b1:1'b0;
  56. //state change
  57. always @(posedge clk or negedge rst_n)begin
  58. if(!rst_n)
  59. display_state <= 1'b0;
  60. else if(delay_1s)//每一秒切换一次led灯显示状态
  61. display_state <= ~display_state;
  62. else
  63. display_state <= display_state;
  64. end
  65. //pwm信号的产生
  66. always @(posedge clk or negedge rst_n)begin
  67. if(!rst_n)
  68. pwm <= 1'b0;
  69. else
  70. case(display_state)
  71. 1'b0: pwm <= (cnt2 < cnt3)? 1'b1:1'b0;
  72. 1'b1: pwm <= (cnt2 < cnt3)? 1'b0:1'b1;
  73. default: pwm <= pwm;
  74. endcase
  75. end
  76. assign led_out = pwm;
  77. endmodule

我给出测试代码:


  
  1. module Breath_LED_tb(
  2. );
  3. reg clk;
  4. reg rst_n;
  5. wire led_out;
  6. //generate clock
  7. initial begin
  8. clk = 0;
  9. forever
  10. #20 clk = ~clk;
  11. end
  12. //initialization
  13. initial begin
  14. rst_n = 0;
  15. #10000
  16. rst_n = 1;
  17. end
  18. //instantiation
  19. Breath_LED u_led(
  20. .clk(clk),
  21. .rst_n(rst_n),
  22. .led_out(led_out)
  23. );
  24. endmodule

行为仿真时序图:

参考链接:http://www.cnblogs.com/ninghechuan/p/6291499.html

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/89971953

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。