FPGA實現呼吸燈功能實驗

 

硬件環境以及具體要求:spa

  1.系統時鐘爲50MHz, 2.從滅到亮和從亮到滅的時間均爲2s。設計

要求和基本原理都已經知道了,下面就能夠來開始咱們的設計。code

  既然要求咱們從滅到亮的時間是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。這是咱們從滅到亮的一個過程,從亮到滅就是一個逆過程。blog

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

代碼以下:class

 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
相關文章
相關標籤/搜索