当前位置: 首页 > news >正文

中山建网站最好的公司最新域名8xgmvxyz

中山建网站最好的公司,最新域名8xgmvxyz,济南企业网站开发,广东深圳龙岗区疫情最新消息状态机实现N位按键消抖 1、原理 利用状态机实现按键的消抖,具体的原理可参考 (50条消息) 基于FPGA的按键消抖_fpga 按键消抖_辣子鸡味的橘子的博客-CSDN博客 状态机简介: 状态机分类可以主要分为两类: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状态机仅仅和当前状态有关

img

Mealy状态机:输出不仅取决于当前状态,还和输入有关;

同样是三段式描述,最后的输出为:

always @(*)beginif(reset) dout = 1'b0;else if( (current_state == s3)&&(din == 1'b1) ) dout = 1'b1;else dout = 1'b0;end

img

可见,输出不仅和当前状态和输入都有关系。

最后,Moore状态机和Mealy状态机可以相互转换。上述两个状态转移图实际上实现的是同一个功能,就是检测序列1101.

状态机按照段式分类,可分为:一段式、二段式、三段式

可参考:

(50条消息) 状态机详解(一段式、二段式、三段式)_状态机一段式二段式三段式_CuteBaBaKiller的博客-CSDN博客

image-20230727171608721

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 = 4'b0001,FILTER_DOWN = 4'b0010,DOWN = 4'b0100,FILTER_UP = 4'b1000;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_r1&key_r2);
assign podge = |(key_r1&key_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{1'b1}};key_r1 <= {N{1'b1}};key_r2 <= {N{1'b1}};endelse beginkey_r0<=key_in;key_r1<=key_r0;key_r2<=key_r1;end
end//****************************************************************
//--"flag信号约束
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(~rst_n)beginflag<=1'b0;endelse if(nedge || podge)beginflag<=1;endelse if(end_cnt_20ms)beginflag<=0;endelse beginflag<=flag;end
end
//****************************************************************
//--"20ms计数
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(~rst_n) begincnt_20ms<='d0;endelse if(add_cnt_20ms)beginif(end_cnt_20ms)begincnt_20ms <='d0;endelse if(nedge)begincnt_20ms <= 0;endelse begincnt_20ms <= cnt_20ms + 1'b1;endendelse begincnt_20ms<=cnt_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)begincstate<=IDLE;//初始当前状态为空闲endelse begincstate<=nstate;//次态赋值给现态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{1'b0}};endelse if(filter_down2down)beginkey_out_r<=~key_r1;endelse beginkey_out_r<={N{1'b0}};end
end
assign key_out = key_out_r;endmodule

3、仿真代码

`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;beginclk=1'b0;rst_n=1'b0;#(2*SYS_CLK);rst_n=1'b1;key = 4'b1111;#(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、仿真结果

image-20230727171418129

5、总结

使用状态机进行按键消抖,可以经消抖分为四个部分,空闲状态、下降沿状态、按下状态、上升沿状态,这几个状态使用状态机进行按键消抖,可以更好的理解消抖的原理和过程。状态机的规范编写也是提升自己理解时序,理解逻辑的好的方式

http://www.hengruixuexiao.com/news/7256.html

相关文章:

  • 湛江招聘网最新招聘白云百度seo公司
  • 自己怎么做拼单网站市场调研报告范文
  • 如何做网站的seo短视频平台推广方案
  • 图片做视频网站有哪些东莞网站制作
  • 百家号如何给网站做推广百度公司官网招聘
  • 澳门赌网站怎么做代理自建站
  • 成都建设路小学网站合肥建站公司seo
  • 株洲住房和城乡建设委员会网站百度直播
  • 重庆建站网站免费长春免费网上推广
  • 商城网站建设哪个比较好站长之家新网址
  • 网站品牌高端定制营销方式和渠道有哪些
  • meet wordpressseo站长
  • 现在做个app多少钱app软件下载站seo教程
  • 泰州网站建设电话湖北seo整站优化
  • 网站首页幻灯片不显示给网站做seo的价格
  • 绵阳住房和城乡建设厅网站女教师遭网课入侵直播录屏曝光8
  • 大学网站开发专业怎么样百度一下你就知道移动首页
  • 做网站用什么网最好免费建站系统哪个好用吗
  • 福州晋安区建设局网站整站seo排名
  • asp网站建设 win7seo网站排名
  • 中英文切换的网站怎么做的网站优化网站优化
  • 动漫网站首页设计电商营销策略
  • asp.net网站维护网络营销课程培训
  • 那些网站平台可以做3d建模建站abc
  • 织梦映像网站优化网络推广seo
  • 网站显示百度众测是怎么做的自媒体服务平台
  • 网站用户体验方案关键词排名规则
  • 装修网站排名整站优化包年
  • 免费ppt下载济南网站优化
  • 做电影下载网站需要什么百度指数搜索