基于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
创明新能源“竹藤”电池发布
什么是C-3/C3 system (Command、Cont
英伟达再下一程 为台湾国研院自动驾驶研究提供仿真程序/计算机/模型
基于CMOS工艺适用于WLAN IEEE802.11a标准的双模前置分频器设计
旧格局瓦解 三大运营商博弈移动互联网
基于FPGA的按键控制LED灯亮灭
智能制造技术不断发展和普及,看各国都在先进制造业领域怎么做
瑞萨电子的R-Car H3片上系统已被Parrot Faurecia Automotive公司采用
简单认识JTAG接口
高级封装技术:创建接近单片互连性能的封装上互连
“THE顶会”接收的论文竟然名不副实?你说该不该撤稿?
u盘主控芯片坏了如何数据恢复 u盘主控芯片坏了要修多少钱
如何去实现一个输入滤波器的简单设计呢
巴航工业的E195-E2喷气商用飞机将再次在中国演示飞行
AR500C高原型无人直升机在江西成功首飞
台积电在先进制程上一直领跑业界,奠定了Foundry一哥地位
区块链可以改变汽车行业使其实现真正的业务价值
RyanMqtt移植指南
窥视美国2017年物联网和VR发展现状
大直径测径仪在橡胶阀座生产中起着重要作用