按键的使用方法(三)-------verilog
按键的使用方法三:一键三用: 点击、长击和双击、
代码:
/********************************Copyright**************************************
001 **----------------------------File information--------------------------
002 ** File name :key_function_3.v
003 ** CreateDate :2015.03
004 ** Funtions :按键的用法(三):一个按键完成单击,长击,双击的作用。
005 ** Operate on :M5C06N3L114C7
006 ** Copyright :All rights reserved.
007 ** Version :V1.0
008 **---------------------------Modify the file information----------------
009 ** Modified by :
010 ** Modified data :
011 ** Modify Content:
012 *******************************************************************************/ module key_function_3 (
clk,
rst_n, key_6, led_S,
led_L,
led_D );
input clk;
input rst_n; input key_6; output led_S;
output led_L;
output led_D; //--------------------------------------------
/* 定时:100ms,2s */
reg count_en;
localparam t_1s = 'd23999999;
localparam t_100ms = 'd2399999; // localparam t_1s = 25'd2399; /* //测试使用 */
// localparam t_100ms = 22'd239; /* //测试使用 */ localparam t_2s = 'd2; reg [:] count;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
count <= ;
end
else if(count_en)
begin
if(count == t_1s)
count <= ;
else
count <= count + ;
end
else
count <= ;
end reg [:] count1;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
count1 <= ;
end
else if(count_en)
begin
if(count1 == t_2s)
count1 <= 'd2;
else if(count == t_1s)
count1 <= count1 + ;
end
else
count1 <= ;
end //-------------------------------
/* 取key_6的上升沿和下降沿 */
reg [:] key_6_reg;
wire key_6_pos;
wire key_6_neg;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
key_6_reg <= 'b111;
end
else
begin
key_6_reg <= {key_6_reg[:],key_6};
end
end
assign key_6_pos = (key_6_reg[:] == 'b01);
assign key_6_neg = (key_6_reg[:] == 'b10); //------------------------------
/* 状态机 */
reg [:] state;
reg key_S;
reg key_L;
reg key_D;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
state <= 'd0;
count_en <= ;
key_S <= ;
key_L <= ;
key_D <= ;
end
else
begin
case(state)
'd0:
begin
count_en <= ;
key_S <= ;
key_L <= ;
key_D <= ;
if(key_6_neg) /* 按键按下 */
state <= 'd1;
else
state <= 'd0;
end
'd1:
begin
if(key_6_pos) /* 按键释放 */
begin
count_en <= ;
state <= 'd3;
end
else if((key_6_reg == 'b000)&&(count1 == t_2s)) /* 按键长击 */
begin
count_en <= ;
state <= 'd2;
key_L <= ;
end
else
count_en <= ;
end
'd2:
begin
key_L <= ;
if(key_6_pos)
state <= 'd7;
else
state <= 'd2;
end
'd3:
begin
state <= 'd4;
end
'd4: /* 决定单击还是双击 */
begin
if((key_6_neg)&&((count1 == )&&(count < t_100ms))) /* 双击 *//* 按键按下 */
begin
count_en <= ;
state <= 'd6;
key_D <= ;
end
else if((count1 == )&&(count > t_100ms)) /* 单击 */
begin
count_en <= ;
state <= 'd5;
key_S <= ;
end
else
count_en <= ;
end
'd5:
begin
state <= 'd8;
key_S <= ;
end
'd6:
begin
key_D <= ;
if(key_6_pos) /* 按键释放 */
state <= 'd8;
else
state <= 'd6;
end
'd8:
begin
state <= 'd0;
end
default:state <= 'd0;
endcase end
end reg [:] led;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led <= 'b000;
end
else
begin
if(key_S)
led[]<= ~led[];
else if(key_L)
led[]<= ~led[];
else if(key_D)
led[]<= ~led[];
end
end //------------------------------
assign {led_D,led_L,led_S} = led; endmodule
难点:单击与双击的处理部分,状态机部分
测试代码
/********************************Copyright**************************************
01 **----------------------------File information--------------------------
02 ** File name :key_function_testbench.v
03 ** CreateDate :2015.03
04 ** Funtions :按键功能的测试文件
05 ** Operate on :M5C06N3L114C7
06 ** Copyright :All rights reserved.
07 ** Version :V1.0
08 **---------------------------Modify the file information----------------
09 ** Modified by :
10 ** Modified data :
11 ** Modify Content:
12 *******************************************************************************/
`timescale ns/ ns
module key_function_3_tb;
reg clk;
reg rst_n; reg key_6; wire led_S;
wire led_L;
wire led_D; key_function_3 key_function_3_1(
.clk,
.rst_n, .key_6, .led_S,
.led_L,
.led_D ); parameter tck = ;
parameter t = /tck; always #(t/) clk = ~clk; initial
begin
clk = ;
rst_n = ;
key_6 = ; #(*t) rst_n = ; #(*t); /* 点击 */
#(*t) key_6 = ;
#(*t) key_6 = ;
#(*t) key_6 = ; /* 长击 */
#(*t);
#(*t) key_6 = ;
#(*t) key_6 = ;
#(*t);
#(*t) key_6 = ; /* 双击 */
#(*t);
#(*t) key_6 = ;
#(*t) key_6 = ;
#(*t) key_6 = ;
#(*t) key_6 = ;
#(*t) key_6 = ;
end endmodule
仿真波形

注:参考资料来自网络。
按键的使用方法(三)-------verilog的更多相关文章
- Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...
- js中点击事件方法三种方式的区别
在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 (1)注意函数名没有双引号. ...
- 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三
用CSS画小猪佩奇,你就是下一个社会人! 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...
- Android模拟、实现、触发系统按键事件的方法
Android模拟.实现.触发系统按键事件的方法 /** * 模拟系统按键. * * @param keyCode */ public static void onKeyEvent(final ...
- python基本数据类型;字符串及其方法三:
###################判断类型################### ######################################################### ...
- PyQt学习随笔:PyQt中捕获键盘事件后获取具体按键值的方法
在PyQt中,如果要捕获键盘事件的具体按键,可以通过重写组件对象的keyPressEvent方法或event方法来捕获具体的按键,推荐使用keyPressEvent方法,因为event方法是一个通用事 ...
- Day16_94_IO_读取文件字节流read()方法(三)
读取文件字节流read()方法(三) int read(byte[] bytes) 返回值为int类型, 该int类型数据表示每一次读取到的有效字节数,也就是读取到了几个字节, 一个都没读取到返回-1 ...
- CRC校验原理和verilog实现方法(三)
1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...
- i2c状态机方法设计-verilog
2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...
随机推荐
- Ubuntu 12.10安装OpenGL
http://wiki.ubuntu-tw.org/index.php?title=Howto_Install_OpenGL_Development_Environment 前言 OpenGL 是一套 ...
- NYOJ298点的转换(矩阵十大问题之一)
点的变换 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M),相对X ...
- Oracle大数据常见优化查询
[转]http://www.cnblogs.com/myhappylife/p/5006774.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的 ...
- 利用Arraylist输入学生的成绩,求出平均分和总分。
Console.WriteLine("请输入学生人数:"); int n=int.Parse(Console.ReadLine()); ArrayList arr= new Arr ...
- 比RBAC更好的权限认证方式(Auth类认证)
Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...
- ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法
这个编辑器按脚本分主要有4个版本,ASP/ASPX/PHP/JSP 每个版本都有可以利用的漏洞.判断网站是否使用了eWebEditor查看程序源代码,看看源码中是否存在类似”ewebeditor.as ...
- Centos更换yum库镜像
首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- 使用注解实现IOC
在biz业务处理类实现类中 /** * 用户业务类,实现对User功能的业务管理 */ @Service("userBiz") public class UserBiz imple ...
- 昂贵的聘礼(dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38549 Accepted: 11158 Descripti ...
- cocos基础教程(4)基础概念介绍
在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...