原创 自己常用的按键消抖程序。。。。分享

2012-5-20 23:18 4176 15 16 分类: FPGA/CPLD

/********************************************************************
* Module Name  : key_debounce    
* Engineer  : wan xin
* Target Device : EP2C35F672C8
* Tool versions : Quartus II 7.0
* Revision  : W1.0
//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;
//  再次按下后,LED熄灭,按键控制LED亮灭
*********************************************************************/
module key_debounce(clock,key,dout,rst_n);
input clock;       //系统时钟(50MHz)
input rst_n;
input [2:0] key;       //按键输入(KEY1~KEY3)
output [2:0] dout;
  
//内部寄存器
reg[17:0]count;       //时钟分频计数器
reg [2:0] dout1,dout2,dout3;    //消抖寄存器
reg [2:0] buff;       //边沿检测寄存器

reg  [2:0] d; 
wire div_clk;       //分频时钟
wire [2:0] key_edge;

assign dout =d;

//时钟分频部分
always @(posedge clock or negedge rst_n)
begin
   if(!rst_n)
       count<=18'd0;
   else begin
 if (div_clk)
      count <= 18'd0;
  else
      count <= count + 1'b1;
      end
end
assign div_clk = (count > 18'd250000);//5ms

//按键消抖部分
always @(posedge clock or negedge rst_n)
begin
   if(!rst_n)
       {dout1,dout2,dout3}<=9'b111_111_111;
   else begin
  dout1 <= key;
  dout2 <= dout1;
  dout3 <= dout2;
 end 
end

//按键边沿检测部分
always @(posedge clock or negedge rst_n)
begin
   if(!rst_n)
    buff <=3'b111;
   else
 buff <= dout1 | dout2 | dout3;
end

assign key_edge = ~(dout1 | dout2 | dout3) & buff;//延时15毫秒(3个时钟)后边沿检测从0变为1


always @(posedge clock or negedge rst_n)   //上升沿检测
begin
    if (!rst_n) begin
        d[0] <= 1'b0;
        d[1]<= 1'b0;
        d[2]<= 1'b0;
     end
    else begin
 if(key_edge[0])  d[0]<=~d[0];
 if(key_edge[1])     d[1]<=~d[1];
 if(key_edge[2])     d[2]<=~d[2] ;
  end
end

endmodule

按键部分的延时时间和按键数大家可以灵活更改!

 

文章评论1条评论)

登录后参与讨论

用户416031 2012-6-28 11:18

不错哦

相关推荐阅读
用户421530 2013-12-01 13:16
基于Altera FPGA的千兆以太网实现方案
  1 引言   在系统设备不断向小型化、集成化、网络化发展的今天,嵌入式开发成为新技术发展的最前沿,改变着系统的整体结构。FPGA由于其自身特点,成为嵌入式开发的最佳平台。Altera公司结合其最新...
用户421530 2013-07-26 22:58
不在执迷于过去,只为不断突破,寻找奋斗的归宿&价值
    好久好久,没有来到自己的博客,一切是陌生的亲切,这里面呼喊自己的回归,是奋斗与自信 ,是价值与积淀的回归,今天不是起点,只是一个开始,从大学的校园走出来,面对工作,我的选择也许不是自己的想...
用户421530 2012-08-27 22:56
常用电平标准汇编版(1)
现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等,还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。...
用户421530 2012-07-17 00:26
于细微中见区别(1)---阻塞&非阻塞赋值(Verliog HDL)
阻塞赋值——“=” <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 非阻塞赋值——...
用户421530 2012-06-20 00:41
SOPC之软件编程学习--系统时钟API函数应用
利用sys/alt_alarm.h系统时钟服务头文件中的alt_alarm_start ()API 函数以及时钟回调函数进行精确定时。我的设计在现有源程序的基础上,添加三个时钟服务程序,分别利用不...
用户421530 2012-06-19 15:18
SOPC之软件编程学习---头文件(1)
在Altera FPGA里面的SOPC学习过程中,软件编程中遇到的第一个编程,往往是LED灯的控制,这几天断断续续的学习了些,总算了入了NIOS II 学习的门槛,开始我对FPG**上系统的探索。在软...
我要评论
1
15
关闭 站长推荐上一条 /2 下一条