Verilog实现按键计数器

文章目录

  • Verilog实现按键计数器
    • 一、简介
    • 二、 代码实现
    • 三、效果

一、简介

计数器我们都知道,这里我们旨在使用Verilog HDL 来实现按键计数器的操作,功能有:

1、按下一个键,计数加一(+1);

2、按下另一个键,计数减一(-1);

3、按下复位键,则计数清零。

4、最多计数60次。

二、 代码实现

我们使用了两个模块,第一个是按键消抖模块,第二个是实现计数器的功能。因为,我们都知道,用按键,必消抖。

1、按键消抖模块:

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : debounce.v
// Module name  : debounce
// Author       : STEP
// Description  :
// Web          : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function:按键消抖module debounce_button (clk,rst,key,key_pulse);parameter       N  =  1;                      //要消除的按键的数量input             clk;input             rst;input   [N-1:0]   key;                        //输入的按键                   output  [N-1:0]   key_pulse;                  //按键动作产生的脉冲   reg     [N-1:0]   key_rst_pre;                //定义一个寄存器型变量存储上一个触发时的按键值reg     [N-1:0]   key_rst;                    //定义一个寄存器变量储存储当前时刻触发的按键值wire    [N-1:0]   key_edge;                   //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk  or  negedge rst)beginif (!rst) beginkey_rst <= {N{1'b1}};                //初始化时给key_rst赋值全为1{}中表示N个1key_rst_pre <= {N{1'b1}};endelse beginkey_rst <= key;                     //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst;             //非阻塞赋值。相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值end    endassign  key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。当key检测到下降沿时,key_edge产生一个时钟周期的高电平reg [17:0]   cnt;                       //产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器     //产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;end  reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量reg     [N-1:0]   key_sec;                    //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效always @(posedge clk  or  negedge rst)beginif (!rst) key_sec <= {N{1'b1}};                else if (cnt==18'h3ffff)key_sec <= key;  endalways @(posedge clk  or  negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};else                   key_sec_pre <= key_sec;             end      assign  key_pulse = key_sec_pre & (~key_sec);     endmodule

2、按键计数器的模块:

module btncounter(clk,rst, btn1, btn2,seg_led_1,seg_led_2);input clk;input rst;input btn1;input btn2;//    input [3:0] seg_data_1;                      //数码管需要显示0~9十个数字,所以最少需要4位输入做译码
//  input [3:0] seg_data_2;          output [8:0] seg_led_1;                     //在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput [8:0] seg_led_2;                      //在小脚丫上第二个数码管的控制信号  MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];                                            //定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽wire key_pulse1;wire key_pulse2;reg [5:0] counting = 2'd00;reg [3:0] seg_data_1= 1'd0;reg [3:0] seg_data_2= 1'd0;initial                                                         //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initialbeginseg[0] = 9'h3f;                                           //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字  0seg[1] = 9'h06;                                           //7段显示数字  1seg[2] = 9'h5b;                                           //7段显示数字  2seg[3] = 9'h4f;                                           //7段显示数字  3seg[4] = 9'h66;                                           //7段显示数字  4seg[5] = 9'h6d;                                           //7段显示数字  5seg[6] = 9'h7d;                                           //7段显示数字  6seg[7] = 9'h07;                                           //7段显示数字  7seg[8] = 9'h7f;                                           //7段显示数字  8seg[9] = 9'h6f;                                           //7段显示数字  9enddebounce_button  u1 (                               .clk (clk),.rst (rst),.key (btn1),.key_pulse (key_pulse1));//按键1对应于加一debounce_button  u2 (                               .clk (clk),.rst (rst),.key (btn2),.key_pulse (key_pulse2));//按键2对应于减一always@(posedge clk or negedge rst)beginif(~rst)begincounting <= 0;endelsebeginif(key_pulse1)begincounting <= (counting + 1) % 60;endelse beginif(key_pulse2)begincounting <= (counting -1 + 60) % 60;endelsebegincounting <= counting;endendseg_data_1 <= counting / 10;if(counting % 10 == 0)begin seg_data_2 <= 0;endelsebegin seg_data_2 <= counting - 10 * seg_data_1;endendendassign seg_led_1 = seg[seg_data_1];                         assign seg_led_2 = seg[seg_data_2];
endmodule

然后进行,设置引脚以及烧录:

三、效果

我们使用如下所示的视频来展示具体的效果:

https://www.bilibili.com/video/BV1f34y1R7Wm?spm_id_from=333.999.0.0

按键计数器的视频

以上就是使用Verilog HDL来实现计数器的功能的基本操作了,如果有帮助的话就点个赞吧,谢谢大家的阅读与支持了啦,(づ ̄3 ̄)づ╭❤~。

Verilog实现按键计数器相关推荐

  1. (24)System Verilog设计十进制计数器

    (24)System Verilog设计十进制计数器 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计十进制计数器 1.十进制计数器 ...

  2. (4)verilog语言编写计数器

    2.4 verilog语言编写计数器 2.4.1 本节目录 1)本节目录: 2)FPGA简介: 3)verilog简介: 4)verilog语言编写计数器: 5)本节结束. 2.4.2 FPGA简介 ...

  3. 使用Verilog语言描述计数器——脉动计数器;脉动计数器具有减法计数功能。采用模块设计和行为级设计方法。

    使用Verilog语言描述计数器--脉动计数器. 内容说明: 本次设计的计数器属于脉动计数器.使用Verilog语言设计,并且设计方法采用模块设计和简单的行为级设计.会有这两种设计的对比测试.最后,会 ...

  4. Verilog之按键检测(一)

    Verilog之按键检测(一) 使用说明 正文 使用说明 //单个按键检测, //功能:当按键按下时,state_out 输出高电平,当按键松开后,state_out 输出低电平 //应用场景:可用于 ...

  5. 使用Verilog实现FPGA计数器功能

    本人地大14级师兄,如果有学弟学妹搜到这个评论一个呗! 一.设计要求 编写VerilogHDL程序,实现如下功能: 利用开发板上的数码显示译码器设计一个十进制计数器,要求该计数器具有以下功能: 1.计 ...

  6. 基于Verilog的按键控制LED灯

    按键控制LED灯 原理图 程序设计 `timescale 1ns / 1psmodule key_led( input sys_clk, input sys_rst_n, input [3:0] ke ...

  7. verilog之按键消抖的理解

    按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖.抖动时间一般为20ms左右.按下的最终结果是低电平. 按键 ...

  8. Verilog中按键消抖检测的实现

    Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...

  9. 89c51按键计数器

    键盘分编码键盘和非编码键盘.键盘上闭合建的识别有专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘,而靠软件编程来识别的称为非编码键盘,在单片机组成的各种系统中,用的最多的是非编码 ...

最新文章

  1. 当AI黑科技撞上大数据日:清华大学第四届大数据日成功举办
  2. java数组定义便利,java数组的定义(菜鸟教程)
  3. 解决AndroidManifest.xml file missing方案
  4. 全球及中国数字出版产业投资产值与运营模式咨询报告2022版
  5. SD从零开始19 免费货物
  6. c语言经典算法——查找一个整数数组中第二大数
  7. Crontab定时任务访问url实例
  8. Linux程序包管理2
  9. php采集绕过cloudflare,关于pyspider绕过CloudFlare验证的问题
  10. 超级硬盘数据恢复软件 4.6.5.0注冊码破解版
  11. 吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料
  12. 网络协议学习--SOAP协议(二)
  13. Java使用apache的poi将PPT转PDF文件,支持并兼容PPT和PPTX文件
  14. 计算机管理没有指定运行,如何限制电脑只运行一个软件?只打开指定软件?
  15. 生成好看的海底地形图
  16. 华为麦芒5刷机_TWRP_Magisk(Root)_Xposed流程
  17. MVZ2Android,植物大战僵尸mvz2
  18. C语言 统计英语文章单词的数目
  19. 【淘宝开店教程】淘宝直通车常见问题讲解
  20. 2016百度沸点榜单出炉 看看年度搜索报告有哪些

热门文章

  1. 软件设计的哲学:第十六章 修改现有代码
  2. 教你轻松构建一个可以泡妞的 app
  3. greasemonkey 使用心得
  4. grasemonkey ajax页面,Greasemonkey 中使用 GM_xmlhttpRequest 如何在 https 页面中加载 http 资源?...
  5. LTE学习笔记之无线资源管理
  6. 2022/12/26总结
  7. 队列 如何 判断 已满
  8. 2021-2027全球与中国牛肉罐头市场现状及未来发展趋势
  9. MySQL之虚拟列的详细讲解
  10. nO a3i会用上鸿蒙系统么,华为nova3i 真的超级好用哦