找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1539|回复: 0
收起左侧

FPGA控制呼吸灯

[复制链接]
ID:832896 发表于 2021-3-26 22:13 | 显示全部楼层 |阅读模式
  1. //`timescale 1ns / 1ps
  2. ////////////////////////////////////////////////////////////////////////////////////
  3. //// Company:
  4. //// Engineer:
  5. ////
  6. //// Create Date: 2020/12/14 19:22:24
  7. //// Design Name:
  8. //// Module Name: led_breath
  9. //// Project Name:
  10. //// Target Devices:
  11. //// Tool Versions:
  12. //// Description:
  13. ////
  14. //// Dependencies:
  15. ////
  16. //// Revision:
  17. //// Revision 0.01 - File Created
  18. //// Additional Comments:
  19. ////
  20. ////////////////////////////////////////////////////////////////////////////////////


  21. //module led_breath(
  22. //        input        i_sys_clk,             //输入时钟
  23. //        input        i_sys_rst_n,
  24. //        output  [3:0] o_led
  25. //    );
  26.    
  27.    
  28. //    /* 计数器r_cnt_2us循环计数,计到99为2us */    //计数r_cnt_2us 计数器
  29. //    parameter p_cnt_2us_max = 7'd100 - 1'b1;
  30. //    reg [7:0] r_cnt_2us = 7'b0;
  31. //    always @(posedge i_sys_clk or negedge i_sys_rst_n)
  32. //    begin
  33. //          if (i_sys_rst_n == 1'b0)
  34. //            r_cnt_2us <= 7'd0;
  35. //          else if(r_cnt_2us == p_cnt_2us_max)
  36. //            r_cnt_2us <= 7'd0;
  37. //          else
  38. //            r_cnt_2us <= r_cnt_2us + 1'b1;
  39. //    end
  40.    
  41.    
  42. //    /* 计数器r_cnt_2ms,每2us加一,计到999为2ms */  //计数r_cnt_2ms
  43. //    parameter p_cnt_2ms_max = 10'd1000 - 1'b1;
  44. //    reg [9:0] r_cnt_2ms = 10'b0;
  45.    
  46. //    always @(posedge i_sys_clk or negedge i_sys_rst_n)
  47. //    begin
  48. //      if (i_sys_rst_n == 1'b0)
  49. //        r_cnt_2ms <= 10'd0;
  50. //      else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
  51. //        r_cnt_2ms <= 10'd0;
  52. //      else if(r_cnt_2us == p_cnt_2us_max)
  53. //        r_cnt_2ms <= r_cnt_2ms + 1'b1;
  54. //      else
  55. //        r_cnt_2ms = r_cnt_2ms;
  56. //    end
  57.    
  58.    
  59. //    /* 计数器r_cnt_2s,每2ms加一,计到999为2s */        //计数r_cnt_2s 计数
  60. //    parameter p_cnt_2s_max = 10'd1000 - 1'b1;
  61. //    reg [9:0] r_cnt_2s = 10'b0;
  62. //    reg [3:0] r_led = 4'b0;
  63. //    always @(posedge i_sys_clk or negedge i_sys_rst_n)
  64. //    begin
  65. //          if (i_sys_rst_n == 1'b0)
  66. //            r_cnt_2s <= 10'd0;
  67. //          else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
  68. //            r_cnt_2s <= 10'd0;
  69. //          else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
  70. //            r_cnt_2s <= r_cnt_2s + 1'b1;
  71. //          else
  72. //            r_cnt_2s <= r_cnt_2s;
  73. //    end
  74.    
  75.    
  76. //    /* r_flag标志 */
  77. //    reg r_flag = 1'b0;
  78. //    always @(posedge i_sys_clk or negedge i_sys_rst_n)
  79. //    begin
  80. //      if (i_sys_rst_n == 1'b0)
  81. //        r_flag <= 1'b0;
  82. //      else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
  83. //        r_flag <= ~r_flag;
  84. //      else
  85. //        r_flag <= r_flag;
  86. //    end
  87.    
  88.    
  89.    
  90. //    /* control */
  91. //    always @(posedge i_sys_clk or negedge i_sys_rst_n)
  92. //    begin
  93. //      if (~i_sys_rst_n)
  94. //        r_led <= 4'b0000;                                         
  95. //      else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b0)         //2s>两毫秒,0
  96. //        r_led <= 4'b1111;
  97. //      else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b0)          //2s<2ms,0
  98. //        r_led <= 4'b0000;
  99. //      else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b1)         // 2s>2ms, 1
  100. //        r_led <= 4'b0000;
  101. //      else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b1)          // 2s<2ms, 1
  102. //        r_led <= 4'b1111;
  103. //      else
  104. //        r_led <= 4'b0000;
  105. //    end
  106.    
  107. //    /* 信号输出 */
  108. //    assign o_led = r_led;
  109.    
  110. //    endmodule
  111. `timescale 1ns/1ps

  112. module led_breath(
  113. clk,led,rst

  114. );
  115. input clk;
  116. input rst;
  117. output reg[3:0] led;
  118. parameter p_2us_max=32'd100-32'd1;
  119. parameter p_2ms_max=32'd1000-32'd1;
  120. parameter p_2s_max=32'd1000-32'd1;



  121. reg [32:1]cnt_2us;//2us计数器计数计到99次,2ms计数器加1
  122. always@(posedge clk or negedge rst)

  123. begin
  124.     if(rst!=1)
  125.     cnt_2us<=32'd0;
  126.     else if(cnt_2us==p_2us_max)
  127.     cnt_2us<=32'd0;
  128.     else
  129.     cnt_2us<=cnt_2us+32'd1;
  130. end


  131. reg[32:1] cnt_2ms;  //2ms 计数器计数计到999次,2s计数器加1
  132. always@(posedge clk or negedge rst)
  133. begin
  134.     if(rst!=1)
  135.     cnt_2ms<=32'd0;
  136.     else if(cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
  137.     cnt_2ms<=32'd0;
  138.     else if(cnt_2us==p_2us_max)
  139.     cnt_2ms<=cnt_2ms+32'd1;
  140.    
  141.     else
  142.     cnt_2ms<=cnt_2ms;

  143. end

  144. reg[32:1]  cnt_2s;    //2s计数器计计到999次,清零,重新计数
  145. always@(posedge clk or negedge rst)
  146. begin
  147.     if(rst!=1)
  148.     cnt_2s<=32'd0;
  149.     else if(cnt_2s==p_2s_max&&cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
  150.     cnt_2s<=32'd0;
  151.     else if(cnt_2us==p_2us_max&&cnt_2ms==p_2ms_max)
  152.     cnt_2s<=32'd1+cnt_2s;
  153.     else
  154.     cnt_2s<=cnt_2s;
  155. end

  156. //always@(posedge clk or negedge rst)
  157. //begin
  158. //if(rst!=1)
  159. // led<=4'b0000;
  160. //else if(cnt_2s>=cnt_2ms)
  161. //led<=4'b1111;
  162. //else if(cnt_2s<cnt_2ms)
  163. //led<=4'b0000;
  164. //else
  165. //led<=4'b0000;

  166. //end

  167. reg flag;// 定义标志位   
  168. always@(posedge clk or negedge rst)
  169. begin
  170.     if(rst!=1)
  171.     flag<=1'b0;
  172.     else if(cnt_2s==p_2s_max&&cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
  173.     flag<=~flag;
  174.     else
  175.     flag<=flag;
  176. end
  177. //led由亮变暗的过程
  178. //always@(posedge clk or negedge rst)
  179. //begin
  180. //if(rst!=1)
  181. //led<=4'b0000;
  182. //else if(cnt_2s>=cnt_2ms)
  183. //led<=4'b1111;
  184. //else if(cnt_2s<cnt_2ms)   //灭到亮的过程
  185. //led<=4'b0000;
  186. //else
  187. //led<=4'b0000;


  188. //end

  189. //利用标志位来判断亮暗的过程
  190. always@(posedge clk or negedge rst)
  191. begin
  192.     if(rst!=1)
  193.     led<=4'b0000;
  194.     else if(cnt_2s>=cnt_2ms&&flag==1'b0)
  195.     led<=4'b1111;
  196.     else if(cnt_2s<cnt_2ms&&flag==1'b0)
  197.     led<=4'b0000;
  198.     else if(cnt_2s>=cnt_2ms&&flag==1'b1)
  199.     led<=4'b0000;
  200.     else if(cnt_2s<cnt_2ms&&flag==1'b1)
  201.     led<=4'b1111;
  202. end



  203. endmodule



复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表