Verilog实现按键计数器

这篇具有很好参考价值的文章主要介绍了Verilog实现按键计数器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Verilog实现按键计数器

一、简介

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

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

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

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

4、最多计数60次。

Verilog实现按键计数器

二、 代码实现

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

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)
          begin
             if (!rst) begin
                 key_rst <= {N{1'b1}};                //初始化时给key_rst赋值全为1{}中表示N个1
                 key_rst_pre <= {N{1'b1}};
             end
             else begin
                 key_rst <= key;                     //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_pre
                 key_rst_pre <= key_rst;             //非阻塞赋值。相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值
             end    
           end
 
        assign  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)
           begin
             if(!rst)
                cnt <= 18'h0;
             else if(key_edge)
                cnt <= 18'h0;
             else
                cnt <= cnt + 1'h1;
             end  
 
        reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量
        reg     [N-1:0]   key_sec;                    
 
 
        //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效
        always @(posedge clk  or  negedge rst)
          begin
             if (!rst) 
                 key_sec <= {N{1'b1}};                
             else if (cnt==18'h3ffff)
                 key_sec <= key;  
          end
       always @(posedge clk  or  negedge rst)
          begin
             if (!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、A
	output [8:0] seg_led_2;						
	//在小脚丫上第二个数码管的控制信号  MSB~LSB=DIG、DP、G、F、E、D、C、B、A
	reg [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和initial
		begin
			seg[0] = 9'h3f;                                           
			//对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字  0
	      seg[1] = 9'h06;                                           
			//7段显示数字  1
	      seg[2] = 9'h5b;                                           
			//7段显示数字  2
	      seg[3] = 9'h4f;                                           
			//7段显示数字  3
	      seg[4] = 9'h66;                                           
			//7段显示数字  4
	      seg[5] = 9'h6d;                                           
			//7段显示数字  5
	      seg[6] = 9'h7d;                                           
			//7段显示数字  6
	      seg[7] = 9'h07;                                           
			//7段显示数字  7
	      seg[8] = 9'h7f;                                           
			//7段显示数字  8
	      seg[9] = 9'h6f;                                           
			//7段显示数字  9
       end
	 debounce_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)
		begin
			if(~rst)
			begin
				counting <= 0;
			end
			
			else
			begin
				if(key_pulse1)
				begin
					counting <= (counting + 1) % 60;
				end
				else 
				begin
					if(key_pulse2)
					begin
						counting <= (counting -1 + 60) % 60;
					end
					else
					begin
						counting <= counting;
					end
				end
				
				seg_data_1 <= counting / 10;
				if(counting % 10 == 0)
				begin 
					seg_data_2 <= 0;
				end
				else
				begin 
					seg_data_2 <= counting - 10 * seg_data_1;
				end
			end
		end
		 
	assign seg_led_1 = seg[seg_data_1];                         
   assign seg_led_2 = seg[seg_data_2];
endmodule

然后进行,设置引脚以及烧录:
Verilog实现按键计数器
Verilog实现按键计数器

三、效果

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

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

按键计数器的视频

以上就是使用Verilog HDL来实现计数器的功能的基本操作了,如果有帮助的话就点个赞吧,谢谢大家的阅读与支持了啦,(づ ̄3 ̄)づ╭❤~。文章来源地址https://www.toymoban.com/news/detail-445076.html

到了这里,关于Verilog实现按键计数器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog基础之十、计数器实现

    目录 一、前言 二、工程设计 2.1 设计代码 2.2 综合结果 ​2.3 仿真结果     计数器是较为基础的逻辑,很多其他逻辑可依靠计数器实现,如控制器,分频。原理为通过统计时钟脉冲的个数来输出计数值。 工程设计以计数20的计数器为例 测试代码 综合后的网表可知,6位的计

    2024年02月09日
    浏览(48)
  • verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

    2023.5.12 编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号 zero ,当置位信号 set 有效时,将当前输出置为输入的数值 set_num 。 注意 :这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一

    2024年02月07日
    浏览(54)
  • Verilog语言实现FPGA上的计数器

    Verilog语言实现FPGA上的计数器 计数器是数字电路中经常使用的基本元素之一,它用于生成指定脉冲数量或者指定计数范围内的计数信号。在现代数字电路设计中,FPGA(Field Programmable Gate Array)作为一种可编程逻辑器件被广泛应用,可以通过Verilog语言来实现计数器模块。 在V

    2024年02月05日
    浏览(45)
  • verilog中几种实现计数器的方法

    module counter ( input clk, output reg [3:0] count ); always @(posedge clk) begin if (count == 4’hF) begin count = 4’h0; end else begin count = count + 4’b1; end end endmodule integer      i ; reg [3:0]    counter2 ; initial begin     counter2 = \\\'b0 ;     for (i=0; i=10; i=i+1) begin         #10 ;         counter2 = coun

    2024年02月03日
    浏览(45)
  • 通过verilog实现模可变计数器的设计

    实验要求:          (一) 实验目的 (1)掌握组合逻辑电路和时序电路的 FPGA实现方法; (2)熟悉EDA开发板和开发软件的使用方法; (3)学习静态数码管的使用和7段数码显示译码器设计; (4)掌握时钟在时序电路中的作用; (5)掌握分频电路的实现方法。 (二)

    2024年02月05日
    浏览(44)
  • 【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

      目录 Ⅰ. 理论部分 0x00 移位寄存器(Shift Register) 0x01 环形计数器(Ring Counter)

    2024年02月05日
    浏览(43)
  • FPGA开发] 使用Verilog实现一个简单的计数器

    计数器是数字电路中常见的元件之一,它能够按照一定的规律进行计数。在FPGA开发中,我们可以使用硬件描述语言Verilog来实现一个简单的计数器。本文将为您详细介绍如何使用Verilog编写一个基于FPGA的计数器,并提供相应的源代码。 首先,我们需要定义计数器的功能和规格

    2024年02月03日
    浏览(61)
  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(44)
  • OUC数字逻辑Verilog实验二 用Verilog实现4位计数器(时序逻辑)

    clk为模拟的脉冲,reset为重置信号,如果reset为0,则把init的值作为初始值赋值给out,enable为使能端,如果enable为1,则在上升沿根据mode的值,如果mode为1,为加计数,mode为0,为减计数。 仿真图像中, 第1个脉冲,reset为0,为out赋值输入的初始值0010。 第2~6个脉冲,enable为1,

    2024年01月17日
    浏览(46)
  • verilog计数器

    (1) 深入了解计数器原理 (2) 学习使用 Verilog 实现同步计数器 ( 模八) 计数器的功能是记忆脉冲个数,它是数字系统中应用最为广泛的时序逻辑构件。 下图为设计 计数器从0开始每隔25_000_000个时钟周期(0.25秒)数码管末位显示加一,最大值为7,7后复0值              这

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包