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

代码:

    /********************************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. autofac 初步学习

    //数据处理接口 public interface IDal<T> where T : class { void Insert (T model); void Update(T model ...

  2. Servlet之Filter详细讲解

    Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息进行 ...

  3. 锋利的jQuery-7--一个$.fn.color插件的编写过程

    编写一个设置和获取元素的color的插件: 首先实现第一个功能,设置: ;(function($){ $.fn.extend({ color:function(value){ return this. ...

  4. BurpSuite实例教程

    很久以前就看到了Burp suite这个工具了,当时感觉好NB,但全英文的用起来很是蛋疼,网上也没找到什么教程,就把这事给忘了.今天准备开始好好学习这个渗透神器,也正好给大家分享下.(注:内容大部分是 ...

  5. (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)

    很早看了MFC的一些宏的实现,什么RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE, etc,看了就烦,现在整 ...

  6. [Angularjs]asp.net mvc+angularjs+web api单页应用

    写在前面 最近的工作一直在弄一些h5的单页应用,然后嵌入到app的webview中.之前一直在用angularjs+html+ashx的一套东西.实在是玩腻了.然后就尝试通过asp.net mvc的方 ...

  7. 老码农教你在 StackOverflow 上谈笑风生

    作为一个高大上的码农,你肯定用到过 StackOverflow,必须的.会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门.StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备 ...

  8. editplus快捷键大全其他editplus快捷键

    editplus快捷键大全其他editplus快捷键,更多快捷键请参考以下文章:editplus快捷键大全之editplus搜索快捷键 editplus快捷键大全之editplus编辑快捷键 edit ...

  9. Xcode 4.6.3 Bug - .m 文件不能正常打开,uitableveiwController

    当打开.m文件时尤其是自定义的继承uitableviewcontroler的m 文件.不能滑动,不能正常显示. 解决方法: 用文本编辑器打开这个文件,关闭xcode .然后在继承uitableview ...

  10. Spring AOP使用整理:使用@AspectJ风格的切面声明

    要启用基于@AspectJ风格的切面声明,需要进行以下的配置: <!-- 启用@AspectJ风格的切面声明 --> <aop:aspectj-autoproxy proxy-tar ...