当前位置:   article > 正文

用FPGA设计呼吸灯_fpga呼吸灯bram

fpga呼吸灯bram

呼吸灯介绍:

呼吸灯是指灯能够像人的呼吸一样,实现由暗到亮或由亮到暗的变化,通常用于消息提示功能,或者作为系统正在运行的提示。

呼吸灯原理:

通过脉冲宽度调制(PWM)实现,即通过调节占空比来对模拟信号电平进行数字编码,进而控制高电平时间

 实验目的:用一个按键可以开关控制呼吸灯的呼吸与停止

模块框图:

breath_led 模块代码  (该代码参考了野火的呼吸灯代码)

链接:16. 呼吸灯 — [野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开发板 文档 (embedfire.com)

  1. module breath_led
  2. (
  3. input wire clk_50mhz , //系统时钟50Mhz
  4. input wire rst_n , //全局复位
  5. input wire led_flag , //输入信号,一个高电平周期
  6. output reg led_out //输出信号,控制led灯
  7. );
  8. parameter CNT_1US_MAX = 6'd49 ;
  9. parameter CNT_1MS_MAX = 10'd999 ;
  10. parameter CNT_1S_MAX = 10'd999 ;
  11. reg [5:0] cnt_1us ;
  12. reg [9:0] cnt_1ms ;
  13. reg [9:0] cnt_1s ;
  14. reg cnt_1s_en ;
  15. reg led_flag_h ;
  16. //把输入信号led_flag处理为电平反转信号
  17. always@( posedge clk_50mhz or negedge rst_n) begin
  18. if (rst_n==1'b0) begin
  19. led_flag_h <= 1'b0;
  20. end
  21. else if (led_flag == 1'b1) begin
  22. led_flag_h <= ~led_flag_h;
  23. end
  24. else begin
  25. led_flag_h <= led_flag_h;
  26. end
  27. end
  28. //cnt_1us:1us计数器
  29. always@(posedge clk_50mhz or negedge rst_n) begin
  30. if(rst_n == 1'b0) begin
  31. cnt_1us <= 6'b0;
  32. end
  33. else if(cnt_1us == CNT_1US_MAX) begin
  34. cnt_1us <= 6'b0;
  35. end
  36. else begin
  37. cnt_1us <= cnt_1us + 1'b1;
  38. end
  39. end
  40. //cnt_1ms:1ms计数器
  41. always@(posedge clk_50mhz or negedge rst_n) begin
  42. if(rst_n == 1'b0) begin
  43. cnt_1ms <= 10'b0;
  44. end
  45. else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX) begin
  46. cnt_1ms <= 10'b0;
  47. end
  48. else if(cnt_1us == CNT_1US_MAX) begin
  49. cnt_1ms <= cnt_1ms + 1'b1;
  50. end
  51. end
  52. //cnt_1s:1s计数器
  53. always@(posedge clk_50mhz or negedge rst_n) begin
  54. if(rst_n == 1'b0) begin
  55. cnt_1s <= 10'b0;
  56. end
  57. else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX
  58. && cnt_1us == CNT_1US_MAX) begin
  59. cnt_1s <= 10'b0;
  60. end
  61. else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX) begin
  62. cnt_1s <= cnt_1s + 1'b1;
  63. end
  64. end
  65. //cnt_1s_en:1s计数器使能信号
  66. always@(posedge clk_50mhz or negedge rst_n) begin
  67. if(rst_n == 1'b0) begin
  68. cnt_1s_en <= 1'b0;
  69. end
  70. else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX
  71. && cnt_1us == CNT_1US_MAX) begin
  72. cnt_1s_en <= ~cnt_1s_en;
  73. end
  74. end
  75. //led_out:输出信号连接到外部的led灯
  76. always@(posedge clk_50mhz or negedge rst_n) begin
  77. if(rst_n == 1'b0) begin
  78. led_out <= 1'b0;
  79. end
  80. else if(led_flag_h == 1'b1) begin
  81. led_out <= 1'b0;
  82. end
  83. else if((cnt_1s_en == 1'b1 && cnt_1ms < cnt_1s) ||
  84. (cnt_1s_en == 1'b0 && cnt_1ms > cnt_1s)) begin
  85. led_out <= 1'b0;
  86. end
  87. else begin
  88. led_out <= 1'b1;
  89. end
  90. end
  91. endmodule

key_filter模块代码,见我的这一篇文章 :用FPGA设计软件按键消抖-CSDN博客

key_breath_led 模块代码

  1. module key_breath_led (
  2. input wire clk_50mhz , //系统时钟50Mhz
  3. input wire rst_n , //全局复位
  4. input wire key_in , //按键输入信号
  5. output wire led_out //输出信号,控制led灯
  6. );
  7. wire key_flag;
  8. key_filter key_filter_inst
  9. (
  10. .clk_50mhz (clk_50mhz) , //系统时钟50Mhz
  11. .rst_n (rst_n ) , //全局复位
  12. .key_in (key_in ) , //按键输入信号
  13. .key_flag (key_flag ) //key_flag为1时表示消抖后检测到按键被按下
  14. //key_flag为0时表示没有检测到按键被按下
  15. );
  16. breath_led breath_led_inst
  17. (
  18. .clk_50mhz (clk_50mhz) , //系统时钟50Mhz
  19. .rst_n (rst_n ) , //全局复位
  20. .led_flag (key_flag ) , //输入信号,一个高电平周期
  21. .led_out (led_out ) //输出信号,控制led灯
  22. );
  23. endmodule //key_breath_led

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

闽ICP备14008679号