按键在项目中应用还是很频繁的,这里主要介绍按键的几种用法。

1、按下一次有效:按下一次计数器增加一下。

2、按下连续有效:按下不松,计数器就一直增加。

3、按下无效,松开有效:按下时计数器值不变,按键释放的时候计数器增加一下。

4、一键多用:点击与长击,单击与双击:这个比较复杂。

本试验只学习使用前3种作用。代码如下:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name :key_function.v
** CreateDate :2015.03
** Funtions :按键的一些作用:1、按下一次有效。2、按下连续有效。3、按下无效,松开有效。默认按键已经消抖。
** Operate on :M5C06N3L114C7
** Copyright :All rights reserved.
** Version :V1.0
**---------------------------Modify the file information----------------
** Modified by :
** Modified data :
** Modify Content:
*******************************************************************************/ module key_function (
clk,
rst_n, key_1,
key_2,
key_3, led_1,
led_2,
led_3
);
input clk; //24M
input rst_n;
input key_1; //按键1,按下一次有效
input key_2; //按键2、按下连续有效
input key_3; //按键3、按下无效释放有效 output led_1; //按键1有效时,翻转
output led_2; //按键1有效时,翻转
output led_3; //按键1有效时,翻转 //------------------------------
//分频到4hz(250ms),使下载到板子的现象明显
wire clk_4hz;
localparam cntt_4hz = 'd5999999; //实际设计
// localparam cntt_4hz = 23'd599; //仿真测试用
reg [:] cnt;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= ;
end
else if(!key_2)
begin
if(cnt == cntt_4hz)
cnt <= ;
else
cnt <= cnt + ;
end
else
cnt <= ;
end assign clk_4hz = (cnt == cntt_4hz); //4HZ的时钟,只有一个clk的时间 //----------key1----------------
reg [:] key_1_reg;
wire key_1_neg;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
key_1_reg <= 'b111; //默认按键没有按下时为高电平
end
else
begin
key_1_reg <= {key_1_reg[:],key_1};
end
end assign key_1_neg = key_1_reg[]&(~key_1_reg[]); reg led_d1;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led_d1 <= ;
end
else if(key_1_neg)
begin
led_d1 <= ~led_d1;
end
else
led_d1 <= led_d1;
end
//--------------key2--------------
reg led_d2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led_d2 <= ;
end
else if(!key_2) //按键按下后
begin
if(clk_4hz) //4hz时钟高电平来的时候
led_d2 <= ~led_d2;
else
led_d2 <= led_d2;
end
end //--------------key3--------------
reg [:] key_3_reg;
wire key_3_pos;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
key_3_reg <= 'b111; //默认按键没有按下时为高电平
end
else
begin
key_3_reg <= {key_3_reg[:],key_3};
end
end assign key_3_pos = ~key_3_reg[]&key_3_reg[]; reg led_d3;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led_d3 <= ;
end
else if(key_3_pos)
begin
led_d3 <= ~led_d3;
end
else
led_d3 <= led_d3;
end //---------------------
assign led_1 = led_d1;
assign led_2 = led_d2;
assign led_3 = led_d3; endmodule

仿真代码:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name :key_function_testbench.v
** CreateDate :2015.03
** Funtions :按键功能的测试文件
** Operate on :M5C06N3L114C7
** Copyright :All rights reserved.
** Version :V1.0
**---------------------------Modify the file information----------------
** Modified by :
** Modified data :
** Modify Content:
*******************************************************************************/ `timescale ns/ ns module key_function_testbench ;
reg clk; //24M
reg rst_n;
reg key_1; //按键1,按下一次有效
reg key_2; //按键2、按下连续有效
reg key_3; //按键3、按下无效释放有效 wire led_1; //按键1有效时,翻转
wire led_2; //按键1有效时,翻转
wire led_3; //按键1有效时,翻转 key_function key_function_1(
.clk,
.rst_n, .key_1,
.key_2,
.key_3, .led_1,
.led_2,
.led_3
); parameter tck = ;
parameter t = /tck; always #(t/) clk = ~clk; initial
begin
clk = ;
rst_n = ;
key_1 = ;
key_2 = ;
key_3 = ; #(*t) rst_n = ; #(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ;
#(*t) key_1 = ; #(*t) key_2 = ;
#(*t) key_2 = ;
#(*t);
#(*t) key_2 = ;
#(*t) key_2 = ;
#(*t);
#(*t) key_2 = ;
#(*t) key_2 = ;
#(*t);
#(*t) key_2 = ; #(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ;
#(*t) key_3 = ; end endmodule

仿真波形:

1、按键按下时一次有效:

2.按下连续有效:

3、按键释放时有效

按键的使用(一)------verilog的更多相关文章

  1. 按键消抖-----verilog

    实际系统中常用的按键大部分都是轻触式按键,如下图所示.该按键内部由一个弹簧片和两个固定触点组成,当弹簧片被按下,则两个固定触点接通,按键闭合.弹簧片松开,两个触点断开,按键也就断开了.根据这种按键的机 ...

  2. Verilog HDL那些事_建模篇笔记(实验三:按键消抖)

    实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止 ...

  3. 按键使用方法(二)------verilog

    这里我们要验证一键两用的情况:点击与长击,单击与双击 代码: /********************************Copyright*************************** ...

  4. 【代码】verilog之:按键消抖

    此模块完美运行 /*-------------------------------------------------------------------------------------- -- ...

  5. 矩阵按键的试验---verilog

    矩阵键盘的试验,采用三段式状态机处理方法. 难点在于检测状态机中:按键消抖以后逐列检测. 电路图: 代码 /********************************Copyright***** ...

  6. 按键的使用方法(三)-------verilog

    按键的使用方法三:一键三用: 点击.长击和双击. 代码: /********************************Copyright***************************** ...

  7. 按键消抖VERILOG实现

    对于消抖,有很多种写法.今天分享一下我的写法. 基本思路: 1. 看图                     图1                                           ...

  8. 基于Verilog的按键检测实验

    一.模块框图及基本思路 detect_module:检测按键输入脚的电平边沿变化 delay_10ms_module:延时消抖,输出按键有效信号 debounce_module:前两个模块的组合模块 ...

  9. FPGA按键去抖verilog代码

    按键去抖的原因及其分类就不罗嗦了. 在这里解释一段代码,代码是网上找的,看了半天没懂,无奈查了半天想了半天,终于明白了... module sw_debounce(clk,rst_n,sw1,sw2, ...

随机推荐

  1. tomcat JNDI 设置

    一.在Spring配置文件中的配置   <bean id="dataSource" class="org.springframework.jndi.JndiObje ...

  2. iOS开发——UI进阶篇(十六)Quartz2D实战小例子

    一.画线 只有在drawRect中才能获取到跟view相关联的上下文 - (void)drawRect:(CGRect)rect {} 一条线 // 1.获取跟当前View相关联的layer上下文(画 ...

  3. CF570D——Tree Requests

    1.题目大意:给你一棵树,每个点有一个字符,然后我们定义1的深度是1,然后1的儿子深度是2... 然后有一个询问,询问以i为根节点的子树,然后深度是k的那层的所有字符,可否组成一个回文串 2.分析:首 ...

  4. Linux 利器- Python 脚本编程入门(一)

    导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...

  5. js ajax简单使用

    文章部分资源来源:(http://blog.csdn.net/lzkkevin/article/details/6777474)以及(http://www.cnblogs.com/hwx0807/ar ...

  6. 小波变换C++实现(一)----单层小波变换

    文章转自: http://www.cnblogs.com/IDoIUnderstand/archive/2013/03/30/3280724.html [小波变换]STL版 一维离散小波变换(DWT) ...

  7. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

  8. Oracle10g下载地址--多平台下的32位和64位

    前段时间ORACLE把10G的下载从官网拿掉了 ,许多童鞋不知道ORACLE 10g 的下载地址,这里我附上oracle 10g 下载的链接,方便大家下载.      点击链接使用迅雷即可下载.    ...

  9. winrt组件库(包括翻书组件)

    http://www.mindscapehq.com/products/metroelements/controls/book-control-for-winrt 点击“down free trial ...

  10. 新浪微博授权失败:applications over the unaudited use restrictions

    在用新浪微博授权第三方app时,授权失败,log显示 com.sina.weibo.sdk.exception.WeiboHttpException: {,"request":&q ...