FPGA實現呼吸燈功能實驗


 

硬件環境以及具體要求:

  1.系統時鍾為50MHz, 2.從滅到亮和從亮到滅的時間均為2s。

要求和基本原理都已經知道了,下面就可以來開始我們的設計。

  既然要求我們從滅到亮的時間是2s,我們就可以把這2s分成1000段,然后在這個1000段里邊,依次讓燈亮的時間增加。又因為我們的燈亮時間是依次遞增的,所以我們可以使在后一個2/1000s的燈亮時間與前一個2/1000s的燈亮時間增加2/1000s的1/1000,也就是依次增加2us.即在第一個2/1000s中亮0s,第二個2/1000s中亮2us,第三個2/1000s亮4us,依次遞增,第1000個2/1000s亮999*2us。這是我們從滅到亮的一個過程,從亮到滅就是一個逆過程。

根據上邊的分析知道,我們的設計中至少需要3個計數器,一個2us計數,一個2ms(2/1000s)計數,一個2s計數。

代碼如下:

 1 module breathing_led_top  2 (  3   input i_sys_clk,  4   input i_sys_rst_n,  5   output [3:0] o_led  6 );  7 /* 計數器r_cnt_2us循環計數,計到99為2us */
 8 parameter p_cnt_2us_max = 7'd100 - 1'b1;  9 reg [7:0] r_cnt_2us = 7'b0;
10 always @(posedge i_sys_clk or negedge i_sys_rst_n) 11 begin
12   if (i_sys_rst_n == 1'b0)
13     r_cnt_2us <= 7'd0;
14   else if(r_cnt_2us == p_cnt_2us_max) 15     r_cnt_2us <= 7'd0;
16   else
17     r_cnt_2us <= r_cnt_2us + 1'b1;
18 end
19 /* 計數器r_cnt_2ms,每2us加一,計到999為2ms */
20 parameter p_cnt_2ms_max = 10'd1000 - 1'b1; 21 reg [9:0] r_cnt_2ms = 10'b0;
22 always @(posedge i_sys_clk or negedge i_sys_rst_n) 23 begin
24   if (i_sys_rst_n == 1'b0)
25     r_cnt_2ms <= 10'd0;
26   else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max) 27     r_cnt_2ms <= 10'd0;
28   else if(r_cnt_2us == p_cnt_2us_max) 29     r_cnt_2ms <= r_cnt_2ms + 1'b1;
30   else 
31     r_cnt_2ms = r_cnt_2ms; 32 end
33 /* 計數器r_cnt_2s,每2ms加一,計到999為2s */
34 parameter p_cnt_2s_max = 10'd1000 - 1'b1; 35 reg [9:0] r_cnt_2s = 10'b0;
36 reg [3:0] r_led = 4'b0;
37 always @(posedge i_sys_clk or negedge i_sys_rst_n) 38 begin
39   if (i_sys_rst_n == 1'b0)
40     r_cnt_2s <= 10'd0;
41   else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max) 42     r_cnt_2s <= 10'd0;
43   else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max) 44     r_cnt_2s <= r_cnt_2s + 1'b1;
45   else
46     r_cnt_2s <= r_cnt_2s; 47 end
48 /* r_flag標志 */
49 reg r_flag = 1'b0;
50 always @(posedge i_sys_clk or negedge i_sys_rst_n) 51 begin
52   if (i_sys_rst_n == 1'b0)
53     r_flag <= 1'b0;
54   else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max) 55     r_flag <= ~r_flag; 56   else
57     r_flag <= r_flag; 58 end
59 /* control */
60 always @(posedge i_sys_clk or negedge i_sys_rst_n) 61 begin
62   if (~i_sys_rst_n) 63     r_led <= 4'b0000;
64   else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b0)
65     r_led <= 4'b1111;
66   else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b0)
67     r_led <= 4'b0000;
68   else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b1)
69     r_led <= 4'b0000;
70   else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b1)
71     r_led <= 4'b1111;
72   else
73     r_led <= 4'b0000;
74 end
75 
76 /* 信號輸出 */
77 assign o_led = r_led; 78 
79 endmodule

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM