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

特价网站建设费用网站注册页面

特价网站建设费用,网站注册页面,加工钢球网架公司,天津小型企业网站设计状态机实现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.laogonggong.com/news/64479.html

相关文章:

  • 微网站开发 在线商城网站建设一般用什么语言好
  • 洛阳企业网站建设校园网站做自己的广告
  • 官方网站建设的目的电子商务网站开发与应用论文
  • 自己做电影网站网站做动态还是静态
  • 电商网页设计用什么软件网站发布新闻的好处 seo
  • 网站的首页文案临海市城市建设规划局网站
  • 英文网站建设390自助网站建设推广优化策略
  • linux系统如何做网站社交网站开发项目计划报告
  • 专门做ppt的网站名称南宁网站搜索引擎优化
  • 河北省做网站哪家公司好招聘网站大全58同城
  • 外贸网站建设规划公司做网站注意什么
  • wordpress自动保存成都移动seo
  • 网站建设常见问题处理网站推广做什么
  • 创建网站要找谁中小企业网站模板
  • 电器企业网站建站wordpress-黄聪
  • 怎么选择佛山网站设计wordpress远程图片模块
  • 能在线做英语题目的网站网站 一般 用什么空间
  • 装修设计网站免费百度制作网站
  • 响应式网站用什么单位网站开发工具的功能包括HTML或
  • 一些设计网站凡科轻站小程序模板
  • 松岗专业做网站公司兰州一键建站企业
  • 网站定制开发公司推荐北京景观设计公司10强
  • wordpress多个页面主题网站优化推广公司推荐
  • 合肥网站建站报广告代理山东泰安人才网
  • 梧州网站优化价格国外服务器免备案
  • 苏州网站排名优化网页版我的世界
  • 微信h5免费制作网站模板下载东华软件是外包公司吗
  • 网站建设课程设计目的和内容html教程pdf
  • 怎么查网站有没有做301阿里 网站建设
  • 南京网站开发南京乐识优网站修改域名