找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5318|回复: 0
收起左侧

vhdl实现按键扫描+消抖+led指示

[复制链接]
ID:57234 发表于 2013-12-7 03:16 | 显示全部楼层 |阅读模式
*********************************************
功能:按键扫描+led显
by:lsy512
当有按键按下时,由于按键的物理性质会造成
按键输出电平抖动,因此需要延时20ms,检测按
键思路是:当有按键按下时,延时20ms,然后再
检测是否有键按下,若是,则有按键按下,若无
则可能是不确定因素造成按键端有信号输入,
在这里用了key_rst;key_rst_r;low_sw;
low_sw_r;几个寄存器来辅助检测是否有键按下,
**********************************************
module key_check(key_one,clk,rst,led_l);
input   wire [7:0] key_one;
input   wire       clk;
input   wire       rst;
output  wire  [7:0] led_l;
reg [7:0] key_rst;
always@(posedge clk or negedge rst)
begin
if(!rst) key_rst <= 8'b11111111;
else key_rst <= key_one;
end
reg [7:0] key_rst_r;
always@(posedge clk or negedge rst)
begin
if(!rst) key_rst_r <= 8'd11111111;
else key_rst_r <= key_rst;
end
wire [7:0] key_an = key_rst & (~key_rst_r);
**************************************************
实现本次检测到的按键信息与上一次的按键信息进行与运算
如果按键电平有变化,也就是说有抖动,key_an变不会为0,
会一直在下面这个ALWAYS中一直清0,从而达到抖动延时的
作用
**************************************************
reg [19:0] cnt;
always@(posedge clk or negedge rst)
begin
if(!rst) cnt <= 20'd0;
else if(key_an) cnt <= 20'd0;
else cnt <= cnt + 1'b1;
end

reg [7:0] low_sw;
always@(posedge clk or negedge rst)
begin
if(!rst) low_sw <= 8'b11_11_11_11;
else if(cnt == 20'hfffff)
  low_sw <= key_one;
end

reg [7:0] low_sw_r;
always@(posedge clk or negedge rst)
begin
if(!rst) low_sw_r <= 8'b11_11_11_11;
else low_sw_r <= low_sw;
end
wire [7:0] led  = low_sw_r[7:0] & (~low_sw[7:0]);
*************************************************
以上原理与按键延时相同,
*************************************************
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
        下为LED显示代码作为按键验证
reg [7:0] d;

always@(posedge clk or negedge rst)
begin
if(!rst)
  d<=8'b11_11_11_11;
else
begin
  if( led[0] ) d[0] <= ~d[0];
  if( led[1] ) d[1] <= ~d[1];
  if( led[2] ) d[2] <= ~d[2];
  if( led[3] ) d[3] <= ~d[3];
  if( led[4] ) d[4] <= ~d[4];
  if( led[5] ) d[5] <= ~d[5];
  if( led[6] ) d[6] <= ~d[6];
  if( led[7] ) d[7] <= ~d[7];
end

end
assign led_l[0] = d[0] ? 1'b1 : 1'b0;
assign led_l[1] = d[1] ? 1'b1 : 1'b0;
assign led_l[2] = d[2] ? 1'b1 : 1'b0;
assign led_l[3] = d[3] ? 1'b1 : 1'b0;
assign led_l[4] = d[4] ? 1'b1 : 1'b0;
assign led_l[5] = d[5] ? 1'b1 : 1'b0;
assign led_l[6] = d[6] ? 1'b1 : 1'b0;
assign led_l[7] = d[7] ? 1'b1 : 1'b0;

endmodule


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表