小梅哥FPGA设计思想与验证方法视频教程之基于状态机的独立按键消抖
大家好,今天,小梅哥继续连载本人精心录制和编辑的FPGA学习系列教程——《小梅哥FPGA设计思想与验证方法视频教程》。教程充分考虑0基础朋友的实际情况,手把手带领学习者分析思路、编写代码、仿真验证、板级调试。教语法,学仿真,一步一步,直到最后设计若干较为综合的逻辑系统。
教程以我们自主开发的芯航线FPGA学习板为实验平台,通过若干基础和综合的系统设计讲解,一步一步掌握FPGA设计与验证的思想和方法,希望了解芯航线FPGA学习板的,请点击这里:
http://z.elecfans.com/1?ck=snow
今天是视频第八讲,主要通过独立按键消抖这样一个实验,来进一步举例讲解状态机的设计思想,独立按键消抖有多种方式可以实现,这里采用状态机的方式,既能方便大家理解按键消抖的整个过程,又能进一步领会状态机的设计思想。
接下来,大家请看视频教程,由于视频中有部分网络的链接,因此上传优酷会被屏蔽,这里就直接分享在百度云盘中了。欢迎大家转载观看。(1280*720分辨率,MP4格式,用手机观看效果非常爽哦,建议大家下载了再观看)
好消息:
从此再也不需要一个一个回复才能看下载地址了
全部开源视频下载地址:
http://pan.baidu.com/s/1kUs0vkF
视频教程中配套源码下载地址:
http://pan.baidu.com/s/1qX5hz9y
觉得好的,记得回来帮忙顶个帖哦
?欢迎加入芯航线FPGA技术支持群:472607506
小梅哥
2015年9月28日星期一
芯航线电子工作室
顶!
用这个练习状态机不错,尤其是testbench写得佷威武
我按照视频的思想,写了个三段式的状态机,请梅总指点:
Step1. 接口设计
- //按键消抖实验
- //每次按下按键led翻转
- module key_filter(
- clk_50M,
- rst_n,
- key_in, //按键输入
- key_out, //滤波后的按键信号
- led //led灯,0亮,1灭
- );
- input clk_50M;
- input rst_n;
- input key_in;
- output key_out;
- output led;
- endmodule
编译,只有警告
Step2. 三段式状态机的前两段
- parameter
- IDLE = 4'b0001,
- FILTER0 = 4'b0010,
- DOWN = 4'b0100,
- FILTER1 = 4'b1000;
- reg[3:0] cur_state;
- reg[3:0] next_state;
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- cur_state <= IDLE;
- end
- else begin
- cur_state <= next_state;
- end
- end
- always @(*)begin
- case( cur_state )
- IDLE:
- if( nedge ) next_state = FILTER0;
- else next_state = IDLE;
- FILTER0:
- if( down_20ms ) next_state = DOWN;
- else if( pedge || nedge ) next_state = IDLE;
- else next_state = FILTER0;
- DOWN:
- if( pedge ) next_state = FILTER1;
- else next_state = DOWN;
- FILTER1:
- if( down_20ms ) next_state = IDLE;
- else if( pedge || nedge ) next_state = DOWN;
- else next_state = FILTER1;
- default: next_state = IDLE;
- endcase
- end
编译,nedge,pedge,down_20ms没有定义,下面逐个定义它们。
Step3. pedge和nedge
- reg key_in0;//key_in打两拍
- reg key_in1;
- wire pedge; //key_in上升沿检测
- wire nedge; //key_in下降沿检测
- //边沿检测得到pedge和nedge
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- key_in0 <= 1'd1;
- key_in1 <= 1'd1;
- end
- else begin
- key_in0 <= key_in;
- key_in1 <= key_in0;
- end
- end
- assign pedge = key_in0 & ~key_in1;
- assign nedge = ~key_in0 & key_in1;
Step4. down_20ms
- parameter
- TOP_20MS = 20'd1_000_000;
- reg[19:0] cnt;//20ms计数器
- wire down_20ms;
- //计数器计数得到down_20ms信号
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- cnt <= 20'd0;
- end
- else begin
- if( cur_state == FILTER0 || cur_state == FILTER1 ) begin
- if( pedge || nedge ) cnt <= 20'd0;
- else if( cnt < TOP_20MS-1 ) cnt <= cnt + 1'd1;
- else;
- end
- else cnt <= 20'd0;
- end
- end
- assign down_20ms = ( cnt == TOP_20MS-1 );
Step5. 第三段状态机,处理输出信号
- reg key_out_r;
- reg led;
- //输出信号处理
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- key_out_r <= 1'd1;
- end
- else begin
- key_out_r <= ~( cur_state == DOWN );
- end
- end
- assign key_out = key_out_r;
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- led <= 1'd0;
- end
- else begin
- if( cur_state == FILTER0 && next_state == DOWN )
- led <= ~led;
- end
- end
整个文件
- //按键消抖实验
- //每次按下按键led翻转
- module key_filter(
- clk_50M,
- rst_n,
- key_in, //按键输入
- key_out, //滤波后的按键信号
- led //led灯,0亮,1灭
- );
- input clk_50M;
- input rst_n;
- input key_in;
- output key_out;
- output led;
- parameter
- IDLE = 4'b0001,
- FILTER0 = 4'b0010,
- DOWN = 4'b0100,
- FILTER1 = 4'b1000;
- parameter
- TOP_20MS = 20'd1_000_000;
- reg[3:0] cur_state;
- reg[3:0] next_state;
- reg key_in0;//key_in打两拍
- reg key_in1;
- wire pedge; //key_in上升沿检测
- wire nedge; //key_in下降沿检测
- reg[19:0] cnt;//20ms计数器
- wire down_20ms;
- reg key_out_r;
- reg led;
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- cur_state <= IDLE;
- end
- else begin
- cur_state <= next_state;
- end
- end
- always @(*)begin
- case( cur_state )
- IDLE:
- if( nedge ) next_state = FILTER0;
- else next_state = IDLE;
- FILTER0:
- if( down_20ms ) next_state = DOWN;
- else if( pedge || nedge ) next_state = IDLE;
- else next_state = FILTER0;
- DOWN:
- if( pedge ) next_state = FILTER1;
- else next_state = DOWN;
- FILTER1:
- if( down_20ms ) next_state = IDLE;
- else next_state = FILTER1;
- default: next_state = IDLE;
- endcase
- end
- //边沿检测得到pedge和nedge
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- key_in0 <= 1'd1;
- key_in1 <= 1'd1;
- end
- else begin
- key_in0 <= key_in;
- key_in1 <= key_in0;
- end
- end
- assign pedge = key_in0 & ~key_in1;
- assign nedge = ~key_in0 & key_in1;
- //计数器计数得到down_20ms信号
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- cnt <= 20'd0;
- end
- else begin
- if( cur_state == FILTER0 || cur_state == FILTER1 ) begin
- if( pedge || nedge ) cnt <= 20'd0;
- else if( cnt < TOP_20MS-1 ) cnt <= cnt + 1'd1;
- else;
- end
- else cnt <= 20'd0;
- end
- end
- assign down_20ms = ( cnt == TOP_20MS-1 );
- //输出信号处理
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- key_out_r <= 1'd1;
- end
- else begin
- key_out_r <= ~( cur_state == DOWN );
- end
- end
- assign key_out = key_out_r;
- always @(posedge clk_50M or negedge rst_n)begin
- if(rst_n==1'b0)begin
- led <= 1'd0;
- end
- else begin
- if( cur_state == FILTER0 && next_state == DOWN )
- led <= ~led;
- end
- end
- endmodule
感觉输出led和key_out没对齐,led似乎还应该再打一拍才对齐。
贴上仿真结果。远看看不见key_in的抖动。但近看。确实是有抖那么两三下的。
尝试将抖动次数加多,就能看到了吧
支持!感觉小梅哥讲的视频把老师一学期讲的课给概括了!点赞!
小梅哥FPGA设计思想与验证方法视频教程
支持梅哥,好好学习,谢谢
好好好好好好好好好好好好好好好好好好好好
bucuo 支持
好好好好好好好好好好好好好好好好好好好好
顶 ,用这个练习状态机不错,学习中
希望观看视频学习
小梅哥FPGA设计思想与验证方法视频教程之高性能计数器IP核使用
下载了,不错的视频
顶
大力支持小梅哥
拉大无聊的卡我打我电话干的哈1
看一看,学习了。哈哈
好。。
谢谢小编分享,
謝謝
学习
小梅哥FPGA设计思想与验证方法视频教程之UART串口发送模块设计与验证
Good
把小梅哥的视频都保存了
回帖试试
用这个练习状态机不错,尤其是testbench写得佷威武
小梅哥FPGA设计思想与验证方法视频教程
顶!d=====( ̄▽ ̄*)b~感谢分享!
顶顶顶。
dggdfgsdfsfsdfsdfsdfsf
谢谢分享~~~~~~~~~~~~
支持!感觉小梅哥讲的视频把老师一学期讲的课给概括了!点赞!
支持!感觉小梅哥讲的视频把老师一学期讲的课给概括了!点赞!
讲的蛮好的,很实用。
继续学习第九弹
支持小梅哥的教学视频
小梅哥讲得不错哦。
谢小梅哥 无私奉献啊
谢谢分享,持续关注中!
谢谢梅哥的无私分享......
持续关注小梅哥的视频中。
小编真好,小编好人啊啊 啊啊
接下来,大家请看视频教程,
这个很好、、、、、、、、、、、、、、、
按键消抖应用非常广泛,跟着学吧!
好好,非常感谢
111111111111111111111111111111111111111111111111111111111111111111111111111111
支持一下,顶!
,不错期待后续视频
不错期待后续视频;请问小梅哥有没有usb,以太网这样的教程呢
非常不错哦~~~~~~~~~~~~~
按键消抖 相关文章: