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

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. ZOJ 3811 Untrusted Patrol

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3811 解题报告:一个无向图上有n个点和m条边,其中有k个点上安装 ...

  2. php配置中的register_globals用法

    开发的时候设置成register_globals=off,只能通过post或get得到前端数据. 参考资料:http://blog.csdn.net/alex_best/article/details ...

  3. Java反射-方法(Method)

    工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...

  4. Qt5.5.1 学习笔记

    添加图标(.pro): RC_ICONS = 1.ico    RC_FILE = 1.rc 新建 1.rc 内容:IDI_ICON1 ICON "1.ico" 支持c++11(. ...

  5. 34 网络相关函数(二)——live555源码阅读(四)网络

    34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...

  6. Linux下VMware虚拟机网卡不能运行在混杂模式解决办法

    转自: http://blog.csdn.net/henulwj/article/details/50347489 问题描述 在Linux如果以普通用户运行VMware Workstations,创建 ...

  7. 【架构】Google的大规模集群管理工具Borg

    参考资料: http://www.cnblogs.com/YaoDD/p/5374393.html http://www.cnblogs.com/YaoDD/p/5351589.html

  8. Thread.Sleep vs. Task.Delay

    We use both Thread.Sleep() and Task.Delay() to suspend the execution of a program for some given tim ...

  9. Angularjs与bootstrap.datetimepicker结合实现日期选择器

    http://www.lovelucy.info/angularjs-best-practices.html http://damoqiongqiu.iteye.com/blog/1917971 ht ...

  10. Print Common Nodes in Two Binary Search Trees

    Given two Binary Search Trees, find common nodes in them. In other words, find intersection of two B ...