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

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. 160809209_李梦鑫_C语言程序设计实验3 循环结构程序设计

    <C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学    期 2016-2017 第1学期 指导教师 黄俊莲 吉吉老师 实验地点 C05 ...

  2. BZOJ 4580: [Usaco2016 Open]248

    Description 一个序列,每次可以把相邻的两个数合为一个,价值+1,求最后的最大价值. Sol 区间DP. \(f[i][j]\) 表示 \(i-j\) 中合成一个数字为多少,转移就是枚举断点 ...

  3. 29 GroupSock(NetAddressList)——live555源码阅读(四)网络

    29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...

  4. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  5. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  6. Struts2学习笔记《二》

    struts.xml配置文件的全部配置元素:

  7. Interleaving Positive and Negative Numbers

    Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...

  8. linux pep8 检查工具

    感谢dongweiming大神.

  9. float 在内存中如何存储的

    float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...

  10. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...