当前位置:   article > 正文

Verilog实现呼吸灯效果_verilog呼吸灯

verilog呼吸灯

呼吸灯的效果采用PWM调波的形式,即快速的改变每个周期的占空比(一个周期内高电平时间占一个周期时间的比值)来实现点亮到熄灭的效果。示意如下图

而关于整个波形图,用50MHz的晶振,从0开始计数到49则为1us。

而1ms是1us的1000倍,以1us为基准,从0开始计数到999则为1ms。

同理,以1ms为基准,从0开始计数到999则为1s。

cnt_en为使能信号,当其为0的时候,实现【完全熄灭】——【完全点亮】过程

当cen_en为1的时候,实现【完全点亮】——【完全熄灭】过程

下图实现的是以2s为周期,前1s实现【完全熄灭】——【完全点亮】,后1s实现【完全点亮】——【完全熄灭】。

 Verilog代码为

  1. module breath_led
  2. #(
  3. parameter CNT_1US_MAX=6'd49,
  4. parameter CNT_1MS_MAX=10'd999,
  5. parameter CNT_1S_MAX=10'd999
  6. )
  7. (
  8. input wire sys_clk,
  9. input wire sys_rst_n,
  10. output reg led_out
  11. );
  12. reg [5:0]cnt_1us;
  13. reg [9:0]cnt_1ms;
  14. reg [9:0]cnt_1s;
  15. reg cnt_en;
  16. always@(posedge sys_clk or negedge sys_rst_n)//1us计数器的波形变化过程
  17. if(sys_rst_n==1'b0)
  18. cnt_1us<=6'd0;
  19. else if(cnt_1us==CNT_1US_MAX)
  20. cnt_1us<=6'd0;
  21. else
  22. cnt_1us<=cnt_1us+6'd1;
  23. always@(posedge sys_clk or negedge sys_rst_n)//1ms计数器的波形变化过程
  24. if(sys_rst_n==1'b0)
  25. cnt_1ms<=10'd0;
  26. else if((cnt_1ms==CNT_1MS_MAX)&&(cnt_1us==CNT_1US_MAX))
  27. cnt_1ms<=10'd0;
  28. else if((cnt_1us==CNT_1US_MAX))
  29. cnt_1ms<=cnt_1ms+10'd1;
  30. else
  31. cnt_1ms<=cnt_1ms;
  32. always@(posedge sys_clk or negedge sys_rst_n)//1s计数器的波形变化过程
  33. if(sys_rst_n==1'b0)
  34. cnt_1s<=10'd0;
  35. else if((cnt_1ms==CNT_1MS_MAX)&&(cnt_1us==CNT_1US_MAX)&&(cnt_1s==CNT_1S_MAX))
  36. cnt_1s<=10'd0;
  37. else if((cnt_1ms==CNT_1MS_MAX)&&(cnt_1us==CNT_1US_MAX))
  38. cnt_1s<=cnt_1s+10'd1;
  39. else
  40. cnt_1s<=cnt_1s;
  41. always@(posedge sys_clk or negedge sys_rst_n)//呼吸灯的两个状态
  42. if(sys_rst_n==1'b0)
  43. cnt_en<=1'b0;
  44. else if((cnt_1ms==CNT_1MS_MAX)&&(cnt_1us==CNT_1US_MAX)&&(cnt_1s==CNT_1S_MAX))
  45. cnt_en<=~cnt_en;
  46. else
  47. cnt_en<=cnt_en;
  48. always@(posedge sys_clk or negedge sys_rst_n)//LED灯的效果
  49. if(sys_rst_n==1'b0)
  50. led_out<=1'b1;
  51. else if((cnt_en==0)&&(cnt_1ms<=cnt_1s)||(cnt_en==1)&&(cnt_1ms>cnt_1s))
  52. led_out<=1'b0;
  53. else
  54. led_out<=1'b1;
  55. endmodule

 仿真测试代码如下

  1. `timescale 1ns / 1ns
  2. module tb_breath_led();
  3. reg sys_clk;
  4. reg sys_rst_n;
  5. wire led_out;
  6. initial
  7. begin
  8. sys_clk=1'b1;
  9. sys_rst_n<=1'b0;
  10. #20
  11. sys_rst_n<=1'b1;
  12. end
  13. always #10 sys_clk=~sys_clk;
  14. breath_led
  15. #(
  16. .CNT_1US_MAX(6'd4),
  17. .CNT_1MS_MAX(10'd9),
  18. .CNT_1S_MAX(10'd9)//仿真测试的过程中将初值设置小一点
  19. )
  20. breath_led_inst(
  21. .sys_clk(sys_clk),
  22. .sys_rst_n(sys_rst_n),
  23. .led_out(led_out)
  24. );
  25. endmodule

vivado仿真波形图

三个计数器的计数波形 

使能端和呼吸效果

注:LED灯为低电平点亮,高电平熄灭。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/791173
推荐阅读
相关标签
  

闽ICP备14008679号