FPGA實現按鍵控制LED燈實驗


  按鍵是常用的一種控制器件。生活中我們可以見到各種形式的按鍵,由於其結構簡單,成本低廉等特點,在家電、數碼產品、玩具等方面有廣泛的應用。

本實驗我們將介紹如何使用按鍵控制多個LED的亮滅。

1. 按鍵簡介

  按鍵開關是一種電子開關,屬於電子元器件類。

我們的開發板上有兩種按鍵開關:

  第一種是本實驗所使用的輕觸式按鍵開關(如下圖1),簡稱輕觸開關。

    使用時以向開關的操作方向施加壓力使內部電路閉合接通,當撤銷壓力時開關斷開,其內部結構是靠金屬彈片受力后發生形變來實現通斷的;

  第二種是自鎖按鍵(如下圖2),自鎖按鍵第一次按下后保持接通,即自鎖,第二次按下后,開關斷開,同時開關按鈕彈出來。

開發板上的電源鍵就是第一種開關。

圖1 輕觸式按鍵

 

圖2 自鎖式按鍵

2. 實驗任務

   使用開發板上的四個按鍵控制四個LED燈。不同按鍵按下時,四個LED燈顯示不同效果。(由於按鍵1被復位鍵占用,故本實驗中使用按鍵2、按鍵3、按鍵4控制LED燈顯示四種狀態)

    當按下按鍵2時,4個LED燈顯示從右向左流水燈效果。

    當按下按鍵3時,4個LED燈顯示從左向右流水燈效果。

    當按下按鍵4時,4個LED燈閃爍

3. 硬件設計

  本實驗中,系統時鍾、復位按鍵、按鍵和LED燈的管腳如下表所示。

 

 

 按鍵控制LED管腳分配圖

 4. 程序設計

 

 

系統框圖

運行代碼:

/***********************************************************************
Filename     : key_led.v
Author       : 
Company      : 
Mail         : 
Device       : Altera
Enviroment   : Win10,Quartus16.1,modelsim 10.4
Created date : 
Version      : V1.0
Description  : 
Sim          :
Modified by  :
Modified date:
Version      :
Description  :
************************************************************************/
module key_led (
  input i_sys_clk,/* 系統時鍾信號50MHz */
  input i_sys_rst_n,/* 系統復位信號,低有效 */
  input [2:0] i_key,/* 按鍵輸入信號 */
  output [3:0] o_led/* LED輸出信號 */
);
/* 定義0.2s計數寄存器 */
parameter p_0_2s_counter = 10_000_000;
reg [23:0] r_0_2s_counter = 24'd0;
always @ (posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (~i_sys_rst_n)
    r_0_2s_counter <= 24'd0;
  else if (r_0_2s_counter == (p_0_2s_counter - 1'b1))
    r_0_2s_counter <= 24'd0;
  else
    r_0_2s_counter <= r_0_2s_counter + 1'b1;
end
/* 定義LED狀態轉換寄存器 */
reg [1:0] r_led_state_switch = 2'd0;
always @ (posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (~i_sys_rst_n)
    r_led_state_switch <= 2'b00;
  else if (r_0_2s_counter == (p_0_2s_counter - 1'b1))
    r_led_state_switch <= r_led_state_switch + 1'b1;
  else
    r_led_state_switch <= r_led_state_switch;
end
/* 識別按鍵,切換顯示模式 */
reg [3:0] r_led;
always @ (posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (~i_sys_rst_n)
    r_led <= 4'b0000;
  /* 按鍵2按下時,從右向左流水燈效果 */
  else if (i_key[0] == 1'b0)
    case (r_led_state_switch)
      2'b00 : r_led <= 4'b1000;
      2'b01 : r_led <= 4'b0100;
      2'b10 : r_led <= 4'b0010;
      2'b11 : r_led <= 4'b0001;
      default : r_led <= 4'b0000;
    endcase
  /* 按鍵3按下時,從左向右流水燈效果 */
  else if (i_key[1] == 1'b0)
  case (r_led_state_switch)
    2'b00 : r_led <= 4'b0001;
    2'b01 : r_led <= 4'b0010;
    2'b10 : r_led <= 4'b0100;
    2'b11 : r_led <= 4'b1000;
    default : r_led <= 4'b0000;
  endcase
  /* 按鍵4按下時,LED閃爍 */
  else if (i_key[2] == 1'b0)
  case (r_led_state_switch)
    2'b00 : r_led <= 4'b1111;
    2'b01 : r_led <= 4'b0000;
    2'b10 : r_led <= 4'b1111;
    2'b11 : r_led <= 4'b0000;
    default : r_led <= 4'b0000;
  endcase
  /* 無按鍵按下時,LED熄滅 */
  else
    r_led <= 4'b0000;
end
assign o_led = r_led;
endmodule

 

 

 

 

 


免責聲明!

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



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