按键消抖设计代码
// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// Module: Debounce
//
// Author: Step
//
// Description: Debounce for button with FPGA/CPLD
//
// Web: www.ecbcamp.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2015/11/11 |Initial ver
// --------------------------------------------------------------------
module Debounce(clk,rst_n,key_n,key_pulse,key_state);
input clk; //system clock
input rst_n; //system reset
input key_n; //button input
output key_pulse; //Debounce pulse output
output reg key_state; //Debounce state output
reg key_rst;
//Register key_rst, lock key_n to next clk
always @(posedge clk or negedge rst_n)
if (!rst_n) key_rst <= 1'b1;
else key_rst <=key_n;
//Detect the edge of key_n
wire key_an = (key_rst==key_n)? 0:1;
reg[18:0] cnt;
//Count the number of clk when a edge of key_n is occured
always @ (posedge clk or negedge rst_n)
if (!rst_n) cnt <= 19'd0;
else if(key_an) cnt <=19'd0;
else cnt <= cnt + 1'b1;
reg low_sw;
//Lock the status to register low_sw when cnt count to 19'd500000
always @(posedge clk or negedge rst_n)
if (!rst_n) low_sw <= 1'b1;
else if (cnt == 19'd500000)
low_sw <= key_n;
reg low_sw_r;
//Register low_sw_r, lock low_sw to next clk
always @ ( posedge clk or negedge rst_n )
if (!rst_n) low_sw_r <= 1'b1;
else low_sw_r <= low_sw;
wire key_pulse;
//Detect the negedge of low_sw, generate pulse
assign key_pulse= low_sw_r & ( ~low_sw);
//Detect the negedge of low_sw, generate state
always @(posedge clk or negedge rst_n)
if (!rst_n) key_state <= 1'b1;
else if(key_pulse) key_state <= ~key_state;
else key_state <= key_state;
endmodule