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

 

 

posted @ 2019-09-17 17:29  归零木槿  阅读(1795)  评论(0编辑  收藏  举报