MiS603开发板 第五章 按钮去抖实验

作者:MiS603开发团队

日期:20150911

公司:南京米联电子科技有限公司

论坛:www.osrc.cn

网址:www.milinker.com

网店:http://osrc.taobao.com

EAT博客:http://blog.chinaaet.com/whilebreak

博客园:http://www.cnblogs.com/milinker/

MiS603开发板 第五章 按钮去抖实验

按键的消抖,是指按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性,降低响应灵敏度。因此,必须对抖动进行处理,即消除抖动的影响。实际工程中,有很多消抖方案,如RS触发器消抖,电容充放电消抖,软件消抖。本章利用FPGA内部来设计消抖,即采取软件消抖。

按键的机械特性,决定着按键的抖动时间,一般抖动时间在5ms~10ms。消抖,也意味着,每次在按键闭合或松开期间,跳过这段抖动时间,再检测按键的状态。只要通过简单的延时就可实现按键的消抖动。

5.1硬件分析

Mis603底板中配套5个独立按键与FPGA相连,具体请参见Misfun原理图。由于各个按键独立,消抖过程是一样的,故本节就用板子上的一个按键SW4来模拟实际环境。按键每按一次,对应的LED灯反转一次。即检测按键是否有闭合和断开的过程,如果有,第一次则LED灯点亮,第二次,则LED灯熄灭。

5.2时序设计

由于按键固有的特性,在每次闭合和断开时,经过抖动-稳定-抖动-稳定的过程。因此,检测按键是否有按下的过程,则要进行两次消抖处理。通过检测按键输入的值,当检测到BTNC为低电平时,启动计数器,做10ms延时,再检测一次,若BTNC依然为低,则说明,BTNC被按下,设置按键按下标志位。再次检测BTNC,若BTNC为高电平,做10ms延时,第二次检测,若依然为高电平,则说明BTNC已断开,设置BTNC断开标志位,通过两个标志位,可以判断,BTNC已经完成了一次闭合到断开的过程,则led灯反转一次。消抖基本流程如下图所示。

采用状态机来实现上面的流程是非常方便的。通过状态机的切换,按键每次由闭合到断开的过程中,分别产生low_flag和high_flag,当这两个同时为高电平时,led灯实现一次翻转。即第一次按键led高亮,第二次按键led熄灭,第三次led高亮……

5.3程序源码


`timescale 1ns / 1ps

//-----------------------------------------------------------------------------------------------------

/*

* 文件名字:Key_Jitter.v

* 程序描述:

* 作 者:

* 修改日期:

* 版 本 号:

* 版权所有:南京米联电子科技有限公司

*/

//-----------------------------------------------------------------------------------------------------

module Key_Jitter(

input clk_i,

input rst_n_i,

input key_i,

output [3:0] led_o,

output [18:0] div_cnt_tb,

output [2:0] key_state_tb

);

localparam DELAY_Param=19‘d499_999;//for project

//localparam DELAY_Param=19‘d1500; //for simulation

//localparam DELAY_Param=19‘d10; //No filter jitter

reg [3:0] led_o_r;

(*KEEP = "TRUE" *)reg [18:0] div_cnt;//10ms去抖时间计数器

[email protected](posedge clk_i or negedge rst_n_i)

begin

if(!rst_n_i)

div_cnt<=19‘d0;

else if(div_cnt<DELAY_Param)

div_cnt<=div_cnt+1‘b1;

else

div_cnt<=0;

end

wire delay_10ms=(div_cnt==DELAY_Param) ? 1‘b1:1‘b0;

//按键检测状态机

localparam DETECTER1=3‘b000;

localparam DETECTER2=3‘b001;

localparam DETECTER3=3‘b010;

localparam DETECTER4=3‘b011;

localparam LED_DIS =3‘b100;

reg low_flag;

reg high_flag;

reg [2:0] key_state;

[email protected](posedge clk_i or negedge rst_n_i)

begin

if(!rst_n_i)

begin

key_state<=DETECTER1;

low_flag<=0;

high_flag<=0;

led_o_r<=4‘b1111;

end

else if(delay_10ms) //每10ms检测一次,每次检测按键闭合和断开过程,led灯翻转一次

begin

case(key_state)

DETECTER1 :

begin

if(key_i!=1‘b1)

key_state<=DETECTER2;

else

key_state<=DETECTER1;

end

DETECTER2 :

begin

if(key_i!=1‘b1)

begin

low_flag<=1‘b1;

key_state<=DETECTER3;

end

else

begin

key_state<=DETECTER1;

low_flag<=low_flag;

end

end

DETECTER3 :

begin

if(key_i==1‘b1)

key_state<=DETECTER4;

else

key_state<=DETECTER3;

end

DETECTER4 :

begin

if(key_i==1‘b1)

begin

high_flag<=1‘b1;

key_state<=LED_DIS;

end

else

begin

high_flag<=high_flag;

key_state<=DETECTER3;

end

end

LED_DIS :

begin

if(high_flag & low_flag)

begin

key_state<=DETECTER1;

led_o_r<=~led_o_r;

high_flag<=1‘b0;

low_flag<=1‘b0;

end

else

begin

led_o_r<=led_o_r;

key_state<=key_state;

high_flag<=high_flag;

low_flag<=low_flag;

end

end

default:

begin

key_state<=DETECTER1;

led_o_r<=0;

high_flag<=0;

low_flag<=0;

end

endcase

end

else

begin

key_state<=key_state;

led_o_r<=led_o_r;

high_flag<=high_flag;

low_flag<=low_flag;

end

end

assign led_o=led_o_r;

assign div_cnt_tb=div_cnt;

assign key_state_tb=key_state;

endmodule

5.4程序分析

? 程序中定义了div_cnt计数器,实现10ms消抖延时操作;

? 程序中定义了key_state一段式状态机,该状态机包括5个状态。其中前4个为按键闭合与断开检测与消抖状态,在完成前4个状态后,通过led灯的翻转来表现按键的闭合与断开;

? 程序中定义了两个标志位,分别为low_flag和high_flag。low_flag表示检测到按键按下,即按键闭合,high_flag表示检测到按键弹起,即按键断开。当着两个标志为同时为1时,表示按键完成一次闭合与断开;

? 程序中,对状态机做了循环,来回不停检测按键状态,且每次状态的切换时间是10ms,状态的切换时间,也是按键消抖检测过程。

5.5综合布线前仿真时序

为清晰地表达程序工作流程,在源代码中,添加了div_cnt_tb,div_start_tb,key_state_tb这些信号。且程序中将有意将计数器另外设置一个较小的值,这是为了减少仿真等待的时间。其仿真图如下所示。

5.6 Chipscope在线逻辑分析仪仿真

对于消抖试验而言,逻辑分析仪不能很直观表现整个设计流程,故该节将放弃使用,直接观察按键按下,LED灯能否正确熄灭和点亮作为试验结果。

5.7输出结果

按键SW4每按一次,LED灯很好地熄灭和点亮。LED灯响应无差错。为清晰的表示消抖的效果,可将延时参数设置很小,可以发现,按键有时候明明已经按下去了,LED却无响应。

5.8小结

按键消抖,是轻触开关必须进行的一项操作。否则,按键将无法使用。在一个工作系统当中,由于按键未消抖,甚至可能直接使系统崩溃。从上面的几个例子也可以看出,无论是按键消抖,还是跑马灯等,设计的前提是要熟练掌握verilog语法。后续章节中,将不在局限于单个文件。在代码量逐渐增加的基础上,将分模块分文件来实现整个系统的功能。

串行通信接口作为一种最普遍的通信方式,广泛为工业所应用。其优点在于通信线路简单,只需要2根线即可实现数据的接收与发送,且通信协议简单、可靠。本节将重点利用FPGA来实现串行通信,通过串口调试助手与Mis603底板实现通信。

时间: 2024-10-11 06:29:20

MiS603开发板 第五章 按钮去抖实验的相关文章

MiS603开发板 第三章 多路分频器设计

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第三章 多路分频器设计 设计思想:利用FPGA内部的逻辑单元对FPGA输入的50MHZ高频时钟信号进行计数分频,得到

MiS603开发板 第四章 流水灯实验

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第四章 流水灯实验 关于流水灯,网上有太多的例子了.其实只要掌握上面分频计数的技巧,设计流水灯是件极其简单的事情.从

MiS603开发板 第十七章 图像之HDMI接口测试输入日志标题

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十七章 图像之HDMI接口测试 17.1 HDMI概述 HDMI是High Definition Multimed

MiS603开发板 第十一章 CY7C68013A Slave FIFO回传输

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十一章 CY7C68013A Slave FIFO回传输 CY7C68013A提供了强大和灵活的外部接口通信方式,

MiS603开发板 第十三章 千兆网RGMII PHY测试

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十三章 千兆网RGMII PHY测试 13.1 RGMII 简介 RGMII(Reduced Gigabit Me

MiS603开发板 第七章 IP-CORE DCM

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ DCM时钟管理器是XILINX FPGA中一项非常重要也是非常珍贵的资源.通过DCM时钟管理器,可以实现时钟的倍频.分频.相移等. 7.

MiS603开发板 第十五章 MCB DDR3内存测试

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十五章 MCB DDR3内存测试 15.1 DDR3存储器模块及其测试 图像算法硬件最关键的一部分就是内存,内存保

MiS603开发板 第十四章 UDP协议网络传输

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十四章 UDP协议网络传输 本实验将实现FPGA 芯片和PC 之间进行千兆以太网数据通信, 通信协议采用Ether

MiS603开发板 第九章 IP-CORE BRAM

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第九章 IP-CORE BRAM 上一章节笔者讲解了FIFO的简单使用,那么FPGA的Block RAM(BRAM)