键盘消抖--特权同学代码

转载 2013年12月02日 09:10:23
    首先将按键值保存两次,以检验按键值的变化。当按键值变后将计数器置0,否则继续加1。当计数器值等于fffff的时候,说明按键是正常按下的,接着保存两次,检测值的变化。若相应位有变化,则将相应的led控制取反。(好像新的代码中键值只检验了一次,不过找不到新代码了。)
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:         特权
//
// Create Date:  
// Design Name:    
// Module Name:
// Project Name:   
// Target Device:  
// Tool versions:  
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 欢迎加入EDN的FPGA/CPLD助学小组一起讨论:http://group.ednchina.com/1375/
////////////////////////////////////////////////////////////////////////////////

//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;
//        再次按下后,LED熄灭,按键控制LED亮灭

module sw_debounce(
            clk,rst_n,
            sw1_n,sw2_n,sw3_n,
               led_d1,led_d2,led_d3
            );

input   clk;    //主时钟信号,50MHz
input   rst_n;    //复位信号,低有效
input   sw1_n,sw2_n,sw3_n;     //三个独立按键,低表示按下
output  led_d1,led_d2,led_d3;    //发光二极管,分别由按键控制

//---------------------------------------------------------------------------
reg[2:0] key_rst;  

always @(posedge clk  or negedge rst_n)
    if (!rst_n) key_rst <= 3'b111;
    else key_rst <= {sw3_n,sw2_n,sw1_n};

reg[2:0] key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) key_rst_r <= 3'b111;
    else key_rst_r <= key_rst;
   
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期
wire[2:0] key_an = key_rst_r & ( ~key_rst);

//---------------------------------------------------------------------------
reg[19:0]  cnt;    //计数寄存器

always @ (posedge clk  or negedge rst_n)
    if (!rst_n) cnt <= 20'd0;    //异步复位
    else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;
 
reg[2:0] low_sw;

always @(posedge clk  or negedge rst_n)
    if (!rst_n) low_sw <= 3'b111;
    else if (cnt == 20'hfffff)     //满20ms,将按键值锁存到寄存器low_sw中     cnt == 20'hfffff
      low_sw <= {sw3_n,sw2_n,sw1_n};
      
//---------------------------------------------------------------------------
reg  [2:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) low_sw_r <= 3'b111;
    else low_sw_r <= low_sw;
   
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);

reg d1;
reg d2;
reg d3;
 
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
        d1 <= 1'b0;
        d2 <= 1'b0;
        d3 <= 1'b0;
      end
    else begin        //某个按键值变化时,LED将做亮灭翻转
        if ( led_ctrl[0] ) d1 <= ~d1;    
        if ( led_ctrl[1] ) d2 <= ~d2;
        if ( led_ctrl[2] ) d3 <= ~d3;
      end

assign led_d3 = d1 ? 1'b1 : 1'b0;        //LED翻转输出
assign led_d2 = d2 ? 1'b1 : 1'b0;
assign led_d1 = d3 ? 1'b1 : 1'b0;
 
endmodule

学习特权同学按键消抖实验课程的一点看法

最近看了特权同学09年录的FPGA视频学习课程,其中讲到第9课——按键消抖实验课程,有些体会、迷茫和感受,记录一下。首先,特权同学介绍了边沿检测法,我也总结学习一下;其次,对特权同学课程中的例子谈一下...
  • joygo007
  • joygo007
  • 2017年05月01日 21:44
  • 402

51单片机 矩阵按键的扫描、消抖、动作分离

#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = ...
  • u013287817
  • u013287817
  • 2014年10月15日 13:19
  • 829

基于verilog按键消抖设计

关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。这两篇博文都是ednchina的博客...
  • a8039974
  • a8039974
  • 2014年05月25日 07:50
  • 4077

C51单片机矩阵键盘扫描去抖程序,新手必读

C51单片机矩阵键盘扫描去抖程序   最近有一个C51的项目,用的是新华龙的C51 F020单片机。项目中要实现4*5的矩阵键盘。矩阵电路图如下如示   其中,四条列线接在F020...
  • u011037149
  • u011037149
  • 2014年06月13日 22:16
  • 1887

按键原理和软硬件按键消抖动

系统的信号输入中,键盘因其结构简单而被广泛使用。因此,对键盘的输入(逻辑0或1)进行准确采样,避免错误输入是非常有必要的。理想的键盘输入特性如图1所示:按键没有按下时,输入为逻辑1,一旦按下则输入立刻...
  • shenlei314
  • shenlei314
  • 2015年08月19日 19:19
  • 6046

特权同学的FPGA/CPLD设计学习笔记

题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢。这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一...
  • Tony_MPF
  • Tony_MPF
  • 2015年11月21日 13:24
  • 1163

linux字符驱动之定时器去抖动按键驱动

上一节里,实现同一时刻只能有一个进程使用同一个设备,例如:只能有一个进程,在同一时刻里使用/dev/buttons这个设备。 上一节文章链接:http://blog.csdn.net/lwj10386...
  • lwj103862095
  • lwj103862095
  • 2013年12月26日 19:35
  • 5306

状态机按键消抖

状态机按键消抖 一般的按键输入软件接口程序非常简单,在程序中一旦检测到按键输入口为低电平(有时可能为高),便采用软件延时的方法来进行消抖,然后再次检测按键输入,如果再次确认为低电平则表示有按键按...
  • baidu_23287903
  • baidu_23287903
  • 2015年08月21日 09:30
  • 1377

单片机按键消抖程序

通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如...
  • delphi308
  • delphi308
  • 2014年09月15日 12:27
  • 12792

简单的使用定时器实现按键消抖,写得不好,望大家给指点一二。多谢了。

/******************************** 按独立按键使数码管加1 ********************************/ #include #defi...
  • u012780337
  • u012780337
  • 2016年08月05日 07:18
  • 2207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:键盘消抖--特权同学代码
举报原因:
原因补充:

(最多只允许输入30个字)