电子商务网站建设主要内容,长春城投建设投资有限公司网站,做网站需要写代码,临沂企业建站系统状态机实现N位按键消抖 
1、原理 
利用状态机实现按键的消抖#xff0c;具体的原理可参考 
(50条消息) 基于FPGA的按键消抖_fpga 按键消抖_辣子鸡味的橘子的博客-CSDN博客 
状态机简介#xff1a; 
状态机分类可以主要分为两类#xff1a;moore和mealy 
根据三段式状态机最后…状态机实现N位按键消抖 
1、原理 
利用状态机实现按键的消抖具体的原理可参考 
(50条消息) 基于FPGA的按键消抖_fpga 按键消抖_辣子鸡味的橘子的博客-CSDN博客 
状态机简介 
状态机分类可以主要分为两类moore和mealy 
根据三段式状态机最后一段的组合逻辑根据状态机的输出是否与输出条件有关可以用来区分moore状态机和mealy状态机 
若输出只与当前状态机有关则为moore状态机 always *beginif(current_state  s4) dout  1;else dout  0;end 
Moore状态机仅仅和当前状态有关 Mealy状态机输出不仅取决于当前状态还和输入有关 
同样是三段式描述最后的输出为 
always (*)beginif(reset) dout  1b0;else if( (current_state  s3)(din  1b1) ) dout  1b1;else dout  1b0;end 可见输出不仅和当前状态和输入都有关系。 
最后Moore状态机和Mealy状态机可以相互转换。上述两个状态转移图实际上实现的是同一个功能就是检测序列1101. 
状态机按照段式分类可分为一段式、二段式、三段式 
可参考 
(50条消息) 状态机详解一段式、二段式、三段式_状态机一段式二段式三段式_CuteBaBaKiller的博客-CSDN博客 2、代码 
module fsm_key_n#(parameter N  4,parameter TIME_20MS  1000_000)(input wire clk,input wire rst_n,input wire[N-1:0] key_in,output wire[N-1:0] key_out
);
reg[3:0] key_out_r;//中间信号
reg[24:0] cnt_20ms;//20ms计数器
//状态空间
parameter IDLE  4b0001,FILTER_DOWN  4b0010,DOWN  4b0100,FILTER_UP  4b1000;reg[3:0] cstate;//现态
reg[3:0] nstate;//次态
reg[N-1:0] key_r0,key_r1,key_r2;//按键延时
reg flag;//检测下降沿和上升沿寄存
//****************************************************************
//--状态转移条件定义
//****************************************************************
wire idle2filter_down;
wire filter_down2down;
wire down2filter_up;
wire filter_up2idle;
//****************************************************************
//--计时开始结束条件
//****************************************************************
wire add_cnt_20ms;
wire end_cnt_20ms;//****************************************************************
//--下降沿上升沿检测
//****************************************************************
assign nedge  |(~key_r1key_r2);
assign podge  |(key_r1key_r2);
//****************************************************************
//--状态转移条件约束
//****************************************************************
assign idle2filter_down  nedge  cstate  IDLE;
assign filter_down2down  end_cnt_20ms  cstate  FILTER_DOWN;
assign down2filter_up  podge  cstate  DOWN;
assign filter_up2idle  end_cnt_20ms  cstate  FILTER_UP;//****************************************************************
//--信号延时
//****************************************************************
always (posedge clk or negedge rst_n) beginif(~rst_n)beginkey_r0  {N{1b1}};key_r1  {N{1b1}};key_r2  {N{1b1}};endelse beginkey_r0key_in;key_r1key_r0;key_r2key_r1;end
end//****************************************************************
//--flag信号约束
//****************************************************************
always (posedge clk or negedge rst_n) beginif(~rst_n)beginflag1b0;endelse if(nedge || podge)beginflag1;endelse if(end_cnt_20ms)beginflag0;endelse beginflagflag;end
end
//****************************************************************
//--20ms计数
//****************************************************************
always (posedge clk or negedge rst_n) beginif(~rst_n) begincnt_20msd0;endelse if(add_cnt_20ms)beginif(end_cnt_20ms)begincnt_20ms d0;endelse if(nedge)begincnt_20ms  0;endelse begincnt_20ms  cnt_20ms  1b1;endendelse begincnt_20mscnt_20ms;end
end
//****************************************************************
//--20ms计数条件约束
//****************************************************************
assign add_cnt_20ms  flag;
assign end_cnt_20ms  add_cnt_20ms  cnt_20ms  TIME_20MS - 1;//****************************************************************
//--三段式状态机第一段时序逻辑
//****************************************************************
always (posedge clk or negedge rst_n) beginif(!rst_n)begincstateIDLE;//初始当前状态为空闲endelse begincstatenstate;//次态赋值给现态end
end//****************************************************************
//--三段式状态机第二段组合逻辑,状态转移
//****************************************************************
always (*) begincase(cstate)IDLE:beginif(idle2filter_down)beginnstate  FILTER_DOWN;endelse beginnstate  cstate;endendFILTER_DOWN:beginif(filter_down2down)beginnstate  DOWN;		endelse beginnstate  cstate;	end    endDOWN:beginif(down2filter_up)beginnstate  FILTER_UP;	endelse beginnstate  cstate;		endendFILTER_UP:beginif(filter_up2idle)beginnstate  IDLE;		endelse beginnstate  cstate;		endenddefault:nstate  cstate;endcase
end//****************************************************************
//--有限状态机第三段时序逻辑
//****************************************************************
always (posedge clk or negedge rst_n) beginif(~rst_n) beginkey_out_r{N{1b0}};endelse if(filter_down2down)beginkey_out_r~key_r1;endelse beginkey_out_r{N{1b0}};end
end
assign key_out  key_out_r;endmodule3、仿真代码 
timescale 1ns/1ns
module fsm_key_tb();reg clk;
reg rst_n;
reg[3:0] key;
reg[3:0] delay;wire[3:0] key_r;
parameter SYS_CLK  20;
parameter TIME_20MS  10;
parameter N  4;
always #(SYS_CLK/2) clk  ~clk;task task_init;beginclk1b0;rst_n1b0;#(2*SYS_CLK);rst_n1b1;key  4b1111;#(2*SYS_CLK);end
endtasktask task_key;input[3:0] key_in;output[3:0] key_out;beginkey_out[0]  ~key_in[0];key_out[2]  ~key_in[2];key_out[3]  key_in[3];key_out[1]  key_in[1];end
endtaskinitial begintask_init();repeat(10)beginrepeat (20) begintask_key(key,key);// key[0]  ~key[0];// key[2]  ~key[2];delay  {$random()}%4;#(SYS_CLK*delay);endtask_key(key,key);// key[0]  ~key[0];// key[2]  ~key[2];//wait(inst_fsm_key.end_cnt_20ms);#(30*SYS_CLK);end$stop;
endfsm_key_n #(.N(N),.TIME_20MS(TIME_20MS)) inst_fsm_key (.clk     (clk),.rst_n   (rst_n),.key_in  (key),.key_out (key_r));endmodule 
4、仿真结果 5、总结 
使用状态机进行按键消抖可以经消抖分为四个部分空闲状态、下降沿状态、按下状态、上升沿状态这几个状态使用状态机进行按键消抖可以更好的理解消抖的原理和过程。状态机的规范编写也是提升自己理解时序理解逻辑的好的方式 文章转载自: http://www.morning.kjsft.cn.gov.cn.kjsft.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.wjlrw.cn.gov.cn.wjlrw.cn http://www.morning.wplbs.cn.gov.cn.wplbs.cn http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn http://www.morning.pamdeer.com.gov.cn.pamdeer.com http://www.morning.wbnsf.cn.gov.cn.wbnsf.cn http://www.morning.pcngq.cn.gov.cn.pcngq.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn http://www.morning.qbwmz.cn.gov.cn.qbwmz.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.rjmb.cn.gov.cn.rjmb.cn http://www.morning.zkjqj.cn.gov.cn.zkjqj.cn http://www.morning.ngqty.cn.gov.cn.ngqty.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn http://www.morning.bntfy.cn.gov.cn.bntfy.cn http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn http://www.morning.tssmk.cn.gov.cn.tssmk.cn http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn http://www.morning.rbbgh.cn.gov.cn.rbbgh.cn http://www.morning.krtky.cn.gov.cn.krtky.cn http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn http://www.morning.yqgbw.cn.gov.cn.yqgbw.cn http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.twmp.cn.gov.cn.twmp.cn http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.csznh.cn.gov.cn.csznh.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.bpmfz.cn.gov.cn.bpmfz.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.rsjng.cn.gov.cn.rsjng.cn http://www.morning.gwdkg.cn.gov.cn.gwdkg.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn http://www.morning.tzpqc.cn.gov.cn.tzpqc.cn http://www.morning.tznlz.cn.gov.cn.tznlz.cn http://www.morning.ydrfl.cn.gov.cn.ydrfl.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.hsdhr.cn.gov.cn.hsdhr.cn http://www.morning.glcgy.cn.gov.cn.glcgy.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.wrdpj.cn.gov.cn.wrdpj.cn http://www.morning.fyglg.cn.gov.cn.fyglg.cn http://www.morning.xfrqf.cn.gov.cn.xfrqf.cn http://www.morning.gagapp.cn.gov.cn.gagapp.cn http://www.morning.qphdp.cn.gov.cn.qphdp.cn http://www.morning.kstlm.cn.gov.cn.kstlm.cn http://www.morning.wpmqq.cn.gov.cn.wpmqq.cn http://www.morning.krxzl.cn.gov.cn.krxzl.cn http://www.morning.skrww.cn.gov.cn.skrww.cn http://www.morning.nsmyj.cn.gov.cn.nsmyj.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn http://www.morning.gsrh.cn.gov.cn.gsrh.cn http://www.morning.ldqzz.cn.gov.cn.ldqzz.cn http://www.morning.c7498.cn.gov.cn.c7498.cn http://www.morning.gsjfn.cn.gov.cn.gsjfn.cn http://www.morning.smnxr.cn.gov.cn.smnxr.cn http://www.morning.kpgbz.cn.gov.cn.kpgbz.cn http://www.morning.njhyk.cn.gov.cn.njhyk.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.tscsd.cn.gov.cn.tscsd.cn http://www.morning.zzfjh.cn.gov.cn.zzfjh.cn http://www.morning.junmap.com.gov.cn.junmap.com http://www.morning.nkdmd.cn.gov.cn.nkdmd.cn http://www.morning.qbtj.cn.gov.cn.qbtj.cn http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.trnl.cn.gov.cn.trnl.cn http://www.morning.jgnst.cn.gov.cn.jgnst.cn http://www.morning.wlxfj.cn.gov.cn.wlxfj.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn