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

代码:

    /********************************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. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  2. 深入浅出MySQL双向复制技术

    设置MySQL数据同步(单向&双向)由于公司的业务需求,需要网通和电信的数据同步,就做了个MySQL的双向同步,记下过程,以后用得到再翻出来,也贴出来供大家参考. 一.准备服务器 由于MySQ ...

  3. [Angularjs]ng-repeat中使用ng-model遇到的问题

    写在前面 在ng-reapet中如何为ng-model双向绑定呢?在项目中确实遇到这样的问题,绑定了,但是在controller中获取不到它的值,确实挺奇怪的. 系列文章 [Angularjs]ng- ...

  4. javascript面向对象方式,调用属性和方法

    1.定义一个Person类,其中的属性和方法如果想对外开放,需要使用this,如: var Person=function(name,age,sex){ var psex='Boy'; if(sex) ...

  5. Jni中C++和Java的参数传递 参数对照

    Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...

  6. Lex和Yacc入门

     Lex和Yacc入门 标签: lexyacc 2013-07-21 23:02 584人阅读 评论(0) 收藏 举报  分类: Linux(132)  原文地址:http://coanor.blog ...

  7. IIS网站发布部署

    Windows—控制面板——程序和功能——打开或关闭Windows功能——Internet信息服务(IIS),一定要选中ASP.Net. 1.打开你的VS2012网站项目,右键点击项目>菜单中 ...

  8. ext3文件系统反删除利器-ext3grep

    导读 Linux作为企业级服务器,数据的安全性至关重要,任何数据德尔丢失和误删都是不可容忍的!最近我接触到一款软件-ext3grep,它可以恢复误删的数据,下面简单讲解一下这个软件. ext3grep ...

  9. 随机Loading

    using UnityEngine; using System.Collections; public class Loading : MonoBehaviour { public bool m_Is ...

  10. Aptana插件安装到eclipse和myeclipse的详细过程

    刚开始学习Jquery,为了搭建好的环境是很重要的,所以我尝试了很多方式,下面之一. 一.要下载好Aptana 插件 官网: http://update1.aptana.org/studio/3.2/ ...