按键的使用方法三:一键三用: 点击、长击和双击、

代码:

    /********************************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的更多相关文章

  1. Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具

    Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...

  2. js中点击事件方法三种方式的区别

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 (1)注意函数名没有双引号. ...

  3. 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三

    用CSS画小猪佩奇,你就是下一个社会人!   欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...

  4. Android模拟、实现、触发系统按键事件的方法

     Android模拟.实现.触发系统按键事件的方法 /** * 模拟系统按键. * * @param keyCode */ public static void onKeyEvent(final ...

  5. python基本数据类型;字符串及其方法三:

    ###################判断类型################### ######################################################### ...

  6. PyQt学习随笔:PyQt中捕获键盘事件后获取具体按键值的方法

    在PyQt中,如果要捕获键盘事件的具体按键,可以通过重写组件对象的keyPressEvent方法或event方法来捕获具体的按键,推荐使用keyPressEvent方法,因为event方法是一个通用事 ...

  7. Day16_94_IO_读取文件字节流read()方法(三)

    读取文件字节流read()方法(三) int read(byte[] bytes) 返回值为int类型, 该int类型数据表示每一次读取到的有效字节数,也就是读取到了几个字节, 一个都没读取到返回-1 ...

  8. CRC校验原理和verilog实现方法(三)

    1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...

  9. i2c状态机方法设计-verilog

    2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...

随机推荐

  1. C++中使用array报错 requires compiler and library surpport for the ISO c++ 2011 standard

    #error This file requires compiler and library support for the \ISO C++ 2011 standard. This support ...

  2. 在使用easyui,datagrid时,JSON中的如果含有换行符,则不能显示数据

    http://www.xuebuyuan.com/2103538.html 每项值需处理换行符 item = item.Replace("\r\n", ""); ...

  3. MyEclipse------各种问题解决方法

    1.汉化后如何变为英文版:找到myeclipse.ini文件,改为:language=enlanguage=zh为中文 2.解决版本不匹配问题:http://blog.sina.com.cn/s/bl ...

  4. Boost的状态机库教程(1)

    介绍 Boost状态机库一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器.它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对 ...

  5. xss跨站攻击测试代码

    '><script>alert(document.cookie)</script> ='><script>alert(document.cookie)& ...

  6. javafx实现饼图统计效果图

  7. linux下可以禁用的一些服务

    linux下多软件/多脚本之间的配合: 包括做好 “实体”和“配置”两个方面的事情 “实体”是指实实在在的脚本文件,服务脚本: “配置”是指其他与之交互的.协同工作的软件.脚本,要进行适当的配置,告知 ...

  8. SVN 学习笔记

    命令参考 Api手册 清除用户密码 rm ~/.subversion/auth 撤销本地svn操作 svn revert 解决冲突 分支处理 拷贝分支 svn copy http://svn.exam ...

  9. zoj.3865.Superbot(bfs + 多维dp)

    Superbot Time Limit: 2 Seconds      Memory Limit: 65536 KB Superbot is an interesting game which you ...

  10. Rescue

    1039: Rescue Time Limit: 1 Sec  Memory Limit: 32 MBSubmit: 1320  Solved: 306 Description Angel was c ...