这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 基于FPGA的按键控制LED灯亮灭

共8条 1/1 1 跳转至

基于FPGA的按键控制LED灯亮灭

高工
2019-09-24 23:53:12     打赏

按键是常用的一种控制器件。生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电、数码产品、玩具等方面有广泛的应用。

本实验我们将介绍如何使用按键控制多个LED的亮灭。

1. 按键简介

按键开关是一种电子开关,属于电子元器件类。

我们的开发板上有两种按键开关:

第一种是本实验所使用的轻触式按键开关(如下图1),简称轻触开关。

使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;

第二种是自锁按键(如下图2),自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来。

开发板上的电源键就是第一种开关。

基于FPGA的按键控制LED灯亮灭

图1 轻触式按键


2. 实验任务

使用开发板上的四个按键控制四个LED灯。不同按键按下时,四个LED灯显示不同效果。(由于按键1被复位键占用,故本实验中使用按键2、按键3、按键4控制LED灯显示四种状态)

当按下按键2时,4个LED灯显示从右向左流水灯效果。

当按下按键3时,4个LED灯显示从左向右流水灯效果。

当按下按键4时,4个LED灯闪烁

3.代码

/***********************************************************************
Filename     : key_led.v
Author       :
Company      :
M
ail         :
Device       :
Altera
Envi
roment   : Win10,Quartus16.1,modelsim 10.4
Crea
ted date :
Ve
rsion      : V1.0
Descrip
tion  :
Sim          :
Mod
ified by  :
Modified date:
Version      :
Descrip
TIon  :
************************************************************************/
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计数
寄存器 */
pa
rameter 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




工程师
2019-10-06 22:10:20     打赏
2楼

学习一下


工程师
2019-10-14 18:18:52     打赏
3楼

正好需要


工程师
2019-11-01 22:17:22     打赏
4楼

很通俗易懂,VHDL语言~

谢谢分享!


工程师
2019-11-01 22:25:07     打赏
5楼

以前学过些FPGA,现在好久没用了,又复习了一遍~

谢谢楼主的“雪中送炭”


工程师
2019-11-01 22:27:53     打赏
6楼

好像很简单的样子,看来我有学FPGA的潜力了!改天也学学看看


工程师
2019-11-01 22:32:27     打赏
7楼

哪种FPGA芯片,性价比最高呢? 有经验的说说呗!


高工
2020-04-01 16:22:24     打赏
8楼

谢谢分享


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]