菜鸟初入FPGA之按键消抖(二段式状态机)

来源:本站
导读:目前正在解读《菜鸟初入FPGA之按键消抖(二段式状态机)》的相关信息,《菜鸟初入FPGA之按键消抖(二段式状态机)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《菜鸟初入FPGA之按键消抖(二段式状态机)》的详细说明。
简介:本文章是关于FPGA之按键消抖(二段式状态机)的。

按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开

消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响

结合上节笔记的边沿检测,我们看一下按键消抖例程

代码:

moduleKey_filter(clk,rst_n,key_in,key_flag,key_state);inputclk,rst_n;inputkey_in;outputregkey_state;//按键状态outputregkey_flag;//按键标志输出//localparam//idel=4'b0001,//空闲态//filter0=4'b0010,//抖动滤波//down=4'b0100,//按下稳定态//filter1=4'b1000;////////////////处理外部输入信号////////////////////////regkey_in1,key_in2;////外部输入的异步信号同步化消除亚稳态always@(posedgeclkornegedgerst_n)if(!rst_n)beginkey_in1<=1'b0;key_in2<=1'b0;endelsebeginkey_in1<=key_in;key_in2<=key_in1;endregkey_tmp1,key_tmp2;//使用两级寄存器,边沿检测always@(posedgeclkornegedgerst_n)if(!rst_n)beginkey_tmp1<=1'b0;key_tmp2<=1'b0;endelsebeginkey_tmp1<=key_in2;key_tmp2<=key_tmp1;endwirep_edge,n_edge;//产生跳变沿信号assignn_edge=!key_tmp1&key_tmp2;assignp_edge=key_tmp1&(!key_tmp2);/////////////////计数信号输出//////////////////////reg[3:0]cnt;regen_cnt;//使能计数always@(posedgeclkornegedgerst_n)if(!rst_n)cnt<=4'd0;elseif(en_cnt)cnt<=cnt+1'b1;elseif(!en_cnt)cnt<=4'd0;//计数满标志always@(posedgeclkornegedgerst_n)if(!rst_n)key_flag<=1'd0;elseif(cnt==4'd9)key_flag<=1'b1;elsekey_flag<=1'd0;////////////////状态机模块///////////////////////reg[3:0]state,NS;//两段式状态机always@(posedgeclkornegedgerst_n)if(!rst_n)beginstate<=4'b1;endelsebeginstate<=NS;endalways@(stateorn_edgeorp_edgeorkey_flag)begin//en_cnt<=1'b0;key_state<=1'b1;case(state)4'd1:beginif(n_edge)beginen_cnt<=1'b1;NS<=4'd2;endelseNS<=4'd1;end4'd2:beginif(key_flag)beginNS<=4'd3;en_cnt<=1'b0;endelseNS<=4'd2;end4'd3:beginkey_state<=1'b0;if(p_edge)beginen_cnt<=1'b1;NS<=4'd4;endelseNS<=4'd3;end4'd4:beginif(key_flag)beginen_cnt<=1'b0;key_state<=1'b1;NS<=4'd1;endelseNS<=4'd4;enddefault:beginNS<=4'd1;en_cnt<=1'b0;key_state<=1'b1;endendcaseendendmodule`timescale1ns/1ns`defineclk_period20moduleKey_tb;regclk;regrst_n;regkey_in;wirekey_flag;wirekey_state;Key_filterkey_filter0(.clk(clk),.rst_n(rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));initialclk=1;always#(`clk_period/2)clk=~clk;//always@(posedgeclk)//随机函数使用//begin//#(`clk_period*100);//key_in={$random}%2;//endinitialbeginrst_n=0;key_in=1;#(`clk_period*5);rst_n=1;#(`clk_period+1);press_key;#(`clk_period*200);press_key;#(`clk_period*200);press_key;#(`clk_period*500);$stop;endtaskpress_key;//任务函数的使用begin#500key_in=0;#500key_in=1;#500key_in=0;#500key_in=1;#500key_in=0;#500key_in=1;#500key_in=0;#500key_in=1;#500key_in=0;#500key_in=1;#500key_in=0;#500key_in=1;endendtaskendmodule

仿真波形:

菜鸟初入FPGA之按键消抖(二段式状态机)

提醒:《菜鸟初入FPGA之按键消抖(二段式状态机)》最后刷新时间 2024-03-14 00:55:58,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《菜鸟初入FPGA之按键消抖(二段式状态机)》该内容的真实性请自行鉴别。