按键的使用(一)------verilog
按键在项目中应用还是很频繁的,这里主要介绍按键的几种用法。
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的更多相关文章
- 按键消抖-----verilog
实际系统中常用的按键大部分都是轻触式按键,如下图所示.该按键内部由一个弹簧片和两个固定触点组成,当弹簧片被按下,则两个固定触点接通,按键闭合.弹簧片松开,两个触点断开,按键也就断开了.根据这种按键的机 ...
- Verilog HDL那些事_建模篇笔记(实验三:按键消抖)
实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止 ...
- 按键使用方法(二)------verilog
这里我们要验证一键两用的情况:点击与长击,单击与双击 代码: /********************************Copyright*************************** ...
- 【代码】verilog之:按键消抖
此模块完美运行 /*-------------------------------------------------------------------------------------- -- ...
- 矩阵按键的试验---verilog
矩阵键盘的试验,采用三段式状态机处理方法. 难点在于检测状态机中:按键消抖以后逐列检测. 电路图: 代码 /********************************Copyright***** ...
- 按键的使用方法(三)-------verilog
按键的使用方法三:一键三用: 点击.长击和双击. 代码: /********************************Copyright***************************** ...
- 按键消抖VERILOG实现
对于消抖,有很多种写法.今天分享一下我的写法. 基本思路: 1. 看图 图1 ...
- 基于Verilog的按键检测实验
一.模块框图及基本思路 detect_module:检测按键输入脚的电平边沿变化 delay_10ms_module:延时消抖,输出按键有效信号 debounce_module:前两个模块的组合模块 ...
- FPGA按键去抖verilog代码
按键去抖的原因及其分类就不罗嗦了. 在这里解释一段代码,代码是网上找的,看了半天没懂,无奈查了半天想了半天,终于明白了... module sw_debounce(clk,rst_n,sw1,sw2, ...
随机推荐
- 160809209_李梦鑫_C语言程序设计实验3 循环结构程序设计
<C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吉吉老师 实验地点 C05 ...
- BZOJ 4580: [Usaco2016 Open]248
Description 一个序列,每次可以把相邻的两个数合为一个,价值+1,求最后的最大价值. Sol 区间DP. \(f[i][j]\) 表示 \(i-j\) 中合成一个数字为多少,转移就是枚举断点 ...
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...
- 搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- 【架构】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 ...
- Struts2学习笔记《二》
struts.xml配置文件的全部配置元素:
- Interleaving Positive and Negative Numbers
Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...
- linux pep8 检查工具
感谢dongweiming大神.
- float 在内存中如何存储的
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...
- iOS 串行网络请求。。。待研究
nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...