中国城乡建设部官网,佛山市企业网站seo联系方式,怎么做切片网站,wordpress开发工具#x1f389;欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒#x1f379; ✨博客主页#xff1a;小夏与酒的博客 #x1f388;该系列文章专栏#xff1a;FPGA学习之旅 文章作者技术和水平有限#xff0c;如果文中出现错误#xff0c;希望大… 欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒 ✨博客主页小夏与酒的博客 该系列文章专栏FPGA学习之旅 文章作者技术和水平有限如果文中出现错误希望大家能指正 欢迎大家关注 ❤️ 目录-按键消抖模块设计与验证 一、效果演示二、模块设计三、仿真测试3.1 常规编写3.2 task编写 四、仿真模型 一、效果演示
模块设计 按键消抖模块的完整代码可直接使用
//
//模块按键消抖模块
//key_state输出消抖之后按键的状态
//key_flag按键消抖结束时产生一个时钟周期的高电平脉冲
/
module KeyFilter(input Clk,input Rst_n,input key_in,output reg key_flag,output reg key_state
);//按键的四个状态localparamIDLE 4b0001,FILTER1 4b0010,DOWN 4b0100,FILTER2 4b1000;//状态寄存器reg [3:0] curr_st;//边沿检测输出上升沿或下降沿wire pedge;wire nedge;//计数寄存器reg [19:0]cnt;//使能计数寄存器reg en_cnt;//计数满标志信号reg cnt_full;//计数满寄存器//------边沿检测电路的实现------//边沿检测电路寄存器reg key_tmp0;reg key_tmp1;//边沿检测always(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginkey_tmp0 1b0;key_tmp1 1b0;endelse beginkey_tmp0 key_in;key_tmp1 key_tmp0;end endassign nedge (!key_tmp0) (key_tmp1);assign pedge (key_tmp0) (!key_tmp1);//------状态机主程序------ //状态机主程序always(posedge Clk or negedge Rst_n)beginif(!Rst_n)begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endelse begincase(curr_st)IDLE:beginkey_flag 1b0;if(nedge)begincurr_st FILTER1;en_cnt 1b1;endelsecurr_st IDLE;endFILTER1:beginif(cnt_full)beginkey_flag 1b1;key_state 1b0;curr_st DOWN;en_cnt 1b0;end else if(pedge)begincurr_st IDLE;en_cnt 1b0;endelsecurr_st FILTER1;endDOWN:beginkey_flag 1b0;if(pedge)begincurr_st FILTER2;en_cnt 1b1;endelsecurr_st DOWN;endFILTER2:beginif(cnt_full)beginkey_flag 1b1;key_state 1b1;curr_st IDLE;en_cnt 1b0;end else if(nedge)begincurr_st DOWN;en_cnt 1b0;endelsecurr_st FILTER2;enddefault:begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endendcaseendend//------20ms计数器------ //20ms计数器//Clk 50_000_000Hz//一个时钟周期为20ns//需要计数20_000_000 / 20 1_000_000次always(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt 20d0;else if(en_cnt)cnt cnt 1b1;elsecnt 20d0;endalways(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt_full 1b0;else if(cnt 999_999)cnt_full 1b1;elsecnt_full 1b0;endendmodule RTL视图 状态转移 仿真结果 二、模块设计
模块设计
信号作用clk时钟信号输入rst_n复位信号输入key_in按键信号输入key_flag消抖结束之后的标志位key_state消抖结束之后按键的状态 上升沿检测电路 下降沿检测电路 边沿检测电路的实现 检测到下降沿nedge输出高电平检测到上升沿pedge输出高电平。
//------边沿检测电路的实现------
//边沿检测电路寄存器
reg key_tmp0;
reg key_tmp1;//边沿检测
always(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginkey_tmp0 1b0;key_tmp1 1b0;endelse beginkey_tmp0 key_in;key_tmp1 key_tmp0;end
endassign nedge (!key_tmp0) (key_tmp1);//检测到下降沿nedge输出高电平
assign pedge (key_tmp0) (!key_tmp1);//检测到上升沿pedge输出高电平一段式状态机设计 按键的四种状态
//按键的四个状态
localparamIDLE 4b0001,FILTER1 4b0010,DOWN 4b0100,FILTER2 4b1000;计数器
//------20ms计数器------
//20ms计数器
//Clk 50_000_000Hz
//一个时钟周期为20ns
//需要计数20_000_000 / 20 1_000_000次//计数寄存器
reg [19:0]cnt;//使能计数寄存器
reg en_cnt;//计数满标志信号
reg cnt_full;//计数满寄存器always(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt 20d0;else if(en_cnt)cnt cnt 1b1;elsecnt 20d0;
endalways(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt_full 1b0;else if(cnt 999_999)cnt_full 1b1;elsecnt_full 1b0;
end状态机主程序
//------状态机主程序------
//状态机主程序
always(posedge Clk or negedge Rst_n)beginif(!Rst_n)begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endelse begincase(curr_st)IDLE:beginkey_flag 1b0;if(nedge)begincurr_st FILTER1;en_cnt 1b1;endelsecurr_st IDLE;endFILTER1:beginif(cnt_full)beginkey_flag 1b1;key_state 1b0;curr_st DOWN;en_cnt 1b0;end else if(pedge)begincurr_st IDLE;en_cnt 1b0;endelsecurr_st FILTER1;endDOWN:beginkey_flag 1b0;if(pedge)begincurr_st FILTER2;en_cnt 1b1;endelsecurr_st DOWN;endFILTER2:beginif(cnt_full)beginkey_flag 1b1;key_state 1b1;curr_st IDLE;en_cnt 1b0;end else if(nedge)begincurr_st DOWN;en_cnt 1b0;endelsecurr_st FILTER2;enddefault:begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endendcaseend
end三、仿真测试
3.1 常规编写
timescale 1ns/1ns
define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;reg key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));initial Clk 1;always#(clock_period/2) Clk ~Clk;initial beginRst_n 1b0;key_in 1b1;#(clock_period*10);Rst_n 1b1;#(clock_period*10 1);key_in 0;#1000;key_in 1;#2000;key_in 0;#1400;key_in 1;#2600;key_in 0;#1300;key_in 1;#200;key_in 0;#20000100;#50000000;key_in 1;#2600;key_in 0;#1000;key_in 1;#2000;key_in 0;#1400;key_in 1;#2600;key_in 0;#1300;key_in 1;#200;key_in 1;#20000100;#50000000;$stop;endendmodule
仿真结果 3.2 task编写
timescale 1ns/1ns
define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;reg key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));initial Clk 1;always#(clock_period/2) Clk ~Clk;initial beginRst_n 1b0;key_in 1b1;#(clock_period*10);Rst_n 1b1;#(clock_period*10 1);#30000;PressKey; #10000;PressKey; #10000;PressKey; #10000;$stop;endreg [15:0]myrand;task PressKey;begin//50次随机时间按下抖动repeat(50)beginmyrand {$random}%65536;//0~65535#myrand key_in ~key_in;endkey_in 0;#50_000_000;//按下稳定//50次随机时间释放抖动repeat(50)beginmyrand {$random}%65536;//0~65535#myrand key_in ~key_in;endkey_in 1;#50_000_000;//释放稳定endendtaskendmodule
注意$random随机函数的用法 $random这一系统函数可以产生一个有符号的32bit随机整数。一般的用法是 $random%b其中 b0。这样就会生成一个范围在(-b1):(b-1)中的随机数。如果只得到正数的随机数可采用{$random}%b 来产生。 myrand {$random}%65536;//0~65535上述语句的作用即是产生了0~65535之间的随机数。
通过repeat语句循环50次就产生了50次不同的延时效果
repeat(50)beginmyrand {$random}%65536;//0~65535#myrand key_in ~key_in;
end仿真结果 四、仿真模型
编写key_model并添加到测试激励文件中
timescale 1ns/1nsmodule key_model(key);output reg key;reg [15:0]myrand;initial beginkey 1b1;PressKey; #10000;PressKey; #10000;PressKey; #10000;$stop;endtask PressKey;begin//50次随机时间按下抖动repeat(50)beginmyrand {$random}%65536;//0~65535#myrand key ~key;endkey 0;#50_000_000;//按下稳定//50次随机时间释放抖动repeat(50)beginmyrand {$random}%65536;//0~65535#myrand key ~key;endkey 1;#50_000_000;//释放稳定endendtask endmodule
修改KeyFilter_tb
timescale 1ns/1ns
define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;wire key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));key_model key_model0(.key(key_in));initial Clk 1;always#(clock_period/2) Clk ~Clk;initial beginRst_n 1b0;#(clock_period*10);Rst_n 1b1;#(clock_period*10 1);endendmodule
整个激励文件的内部结构 仿真结果 结尾 ❤️ 感谢您的支持和鼓励 您可能感兴趣的内容【FPGA】串口通信讲解-状态机判断数据值【Python】串口通信-与FPGA、蓝牙模块实现串口通信PythonFPGA 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
文章转载自: http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn http://www.morning.wgrm.cn.gov.cn.wgrm.cn http://www.morning.bbxbh.cn.gov.cn.bbxbh.cn http://www.morning.mjgxl.cn.gov.cn.mjgxl.cn http://www.morning.jcrlx.cn.gov.cn.jcrlx.cn http://www.morning.qsy36.cn.gov.cn.qsy36.cn http://www.morning.nytqy.cn.gov.cn.nytqy.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.rttkl.cn.gov.cn.rttkl.cn http://www.morning.qgtbx.cn.gov.cn.qgtbx.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.wiitw.com.gov.cn.wiitw.com http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.yrgb.cn.gov.cn.yrgb.cn http://www.morning.lmhh.cn.gov.cn.lmhh.cn http://www.morning.sfyqs.cn.gov.cn.sfyqs.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.wqfzx.cn.gov.cn.wqfzx.cn http://www.morning.mhnb.cn.gov.cn.mhnb.cn http://www.morning.ddtdy.cn.gov.cn.ddtdy.cn http://www.morning.tllws.cn.gov.cn.tllws.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.pylpd.cn.gov.cn.pylpd.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.rkck.cn.gov.cn.rkck.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.rfpxq.cn.gov.cn.rfpxq.cn http://www.morning.kxltf.cn.gov.cn.kxltf.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.bztzm.cn.gov.cn.bztzm.cn http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.ghwdm.cn.gov.cn.ghwdm.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.wsrcy.cn.gov.cn.wsrcy.cn http://www.morning.qhrlb.cn.gov.cn.qhrlb.cn http://www.morning.xflwq.cn.gov.cn.xflwq.cn http://www.morning.dysgr.cn.gov.cn.dysgr.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.ymyhg.cn.gov.cn.ymyhg.cn http://www.morning.8yitong.com.gov.cn.8yitong.com http://www.morning.wynnb.cn.gov.cn.wynnb.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.fksxs.cn.gov.cn.fksxs.cn http://www.morning.brjq.cn.gov.cn.brjq.cn http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn http://www.morning.cfynn.cn.gov.cn.cfynn.cn http://www.morning.c7513.cn.gov.cn.c7513.cn http://www.morning.tckxl.cn.gov.cn.tckxl.cn http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.hctgn.cn.gov.cn.hctgn.cn http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.zlfxp.cn.gov.cn.zlfxp.cn http://www.morning.lqklf.cn.gov.cn.lqklf.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.jpjxb.cn.gov.cn.jpjxb.cn http://www.morning.kzyr.cn.gov.cn.kzyr.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.xdjsx.cn.gov.cn.xdjsx.cn http://www.morning.gswfs.cn.gov.cn.gswfs.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.csgwd.cn.gov.cn.csgwd.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.dhyqg.cn.gov.cn.dhyqg.cn http://www.morning.qjsxf.cn.gov.cn.qjsxf.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn http://www.morning.skfkx.cn.gov.cn.skfkx.cn