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

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. ActionBar使用

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...

  2. MongoDB 基础知识

    一. 基础知识 1. MongoDB是一个文档型的数据库,文档就是一个键值对的有序集合. 例如这样:{"greeting":"hello world"} 2. ...

  3. MyEclipse SVN安装方法

    方法一:在线安装 1.打开HELP->MyEclipse Configuration Center.切换到SoftWare标签页. 2.点击Add Site 打开对话框,在对话框Name输入Sv ...

  4. 如何使用coding.net

        由于我有一位十分聪明能干的室友会使用coding.net,于是我决定奉献一下室友的智慧,告诉大家如何使用conding.net上交作业.(如有说错的地方希望大家可以指出来) 首先登陆codin ...

  5. PHP学习路线

    0x1 0x2

  6. BZOJ 1511: [POI2006]OKR-Periods of Words

    Description 求一个最长周期. Sol KMP. 一个点的最短周期就是 \(i-next[i]\) 此外 \(i-next[next[i]],i-next[next[next[i]]]\) ...

  7. PHP开发神器——phpstorm

    常用快捷键 快捷键 说明 ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 Shift + Enter 新一行 ctrl+q 查看代码注释 ...

  8. [ruby on rails] 深入(1) ROR的一次request的响应过程

    示意图 即: 1.  浏览器发起请求 2. Routes对请求进行一个url映射,交给对应的Controller来处理 3/4. Contoller从Model中获取数据(或者操作数据) 5. 返回给 ...

  9. 在本地计算机无法启动MYSQL服务错误1067进程意外终止

    在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...

  10. ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)

    八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...