FPGA基于标准计数器电子时钟设计

本文介绍了使用标准计数器实现的可调时钟和闹钟设计,涉及按键消抖、系统状态控制和数码管显示。通过简单的结构和逻辑组合,实现在不同操作状态下的计数调整与蜂鸣器控制。

引言

完全基于标准计数器进行设计,结构简单,采用多个计数器并通过各个计数器之间的“结束条件”与“加一条件”的组合逻辑进行拼接,实现可调时钟与可调闹钟。。

按钮信号处理

在按钮信号处理部分,由于使用的开发板按钮按下表示低电平,所以对输入信号进行取反后再使用,利用输入按钮信号key_1、key_2、key_3的逻辑或结果作为0.5s计数器“加一条件”,输出该计数器的结束信号,并与输入按钮信号key_1、key_2、key_3分别进行逻辑相与并输出信号,此部分做法类似于按键消抖,同时可以实现按钮输入信号的截断,用处理后的按钮信号控制后续计数器时方便调整,例如调整时钟与闹钟大小时不用多次按下按钮,此设计依据个人习惯进行设计。用处理后的按钮信号分别作为计数器“state_sys”和计数器“move”的“加一条件”,并用计数器“state_sys”的状态指示系统的操作状态,用计数器“move”的状态控制“时”、“分”、“秒”的分别调整以及关闭蜂鸣器。在此部分还使用4个led灯对系统状态进行指示便于操作。。

时钟功能计数器设计

在此部分设计中使用一个标准计数器对时钟信号进行计数50_000_000次,得到1s的频率用于时钟的正常计时。在控制“时”、“分”、“秒”的计数器部分,对标准计数器进行调整,增加stop状态,在此状态下进行计数器的手动调整,通过对按钮信号与计数器“state_sys”和计数器“move”的状态进行组合逻辑得到信号来控制该部分计数器。

闹钟功能设计

完全采用标准计数器进行设计,不再过多赘述。最后比较闹钟计数器与时钟计数器得到中间信号,控制蜂鸣器鸣叫。

数码管扫描与显示译码

使用一个标准计数器对时钟信号进行计数50_000次,得到1ms的频率作为数码管扫描频率,再使用一个标准计数器“cnt_sel”用来指示显示译码部分的信号流入并控制数码管扫描。用计数器“state_sys”的状态指示显示译码器中间参量的信号传递,用取余和求模的方法将“时”、“分”、“秒”计数器的高低位进行分离。

说明

使用ALINX公司AX301开发板进行验证,蜂鸣器只需要给低电平就能响,要实现不同效果鸣叫可以自己加PWM模块。仿真部分由于电脑配置不了modelsim,故而使用Robei EDA进行验证,做一点验证了一点就不展示了。

上代码

/////////////////////////////////////////////////////////////
//*********************************************************//
//*  Author  : Petter                                     *//                                      
//*  Time    : 2022.03.28                                 *//
//*  IC      : EP4CE6F17C8                                *//
//*  Project : clock_test                                 *//
//*  Module  : clock_test                                 *//
//*                                                       *//
//*********************************************************//
/////////////////////////////////////////////////////////////


/****************************************************************************************************************/
module clock_test(
  input  clk,
  input  rst_n,
  input  key_1,            //system control
  input  key_2,            //select location to change
  input  key_3,            //add '1'
  output reg  [5:0] sel,   //位选输出
  output reg  [6:0] ment,  //段选输出
  output reg  pot,         //小数点
  output reg  ring,        //蜂鸣器
  output reg  [3:0] led    //led_0:reset instruction led, led_1:hour instruction led,
                           //led_2:minute instruction led, led_3:second instruction led,                         
);

  reg  [23:0] cnt_HALF;   //24_999_999*0.02us=0.5s,用于按键消抖
  reg  [3:0] state_sys;   //'0':复位态;'1':state run;'2':state change;'3':state alarm 
  reg  [3:0] move;        //'0':close buzzer;'1':change second;'2':change minute;'3':change hour
  wire add;               //控制各位数据加'1'
  wire add_cnt_HALF;
  wire end_cnt_HALF;
  wire add_state_sys;
  wire end_state_sys;
  wire add_move;
  wire end_move;
  
  reg  [27:0] cnt_div_s;   //49_999_999 1s
  reg  [19:0] cnt_div_ms;  //49_999 1ms,数码管扫描频率
  reg  [3:0]  cnt_sel;     //数码管扫描计数器
  reg  [7:0]  cnt_s;       //时钟second计数器
  reg  [7:0]  cnt_min;     //时钟minute计数器
  reg  [7:0]  cnt_h;       //时钟hour计数器
  reg  [3:0]  data_sL;     //second低位
  reg  [3:0]  data_sH;     //second高位
  reg  [3:0]  data_minL;   //minute低位
  reg  [3:0]  data_minH;   //minute高位
  reg  [3:0]  data_hL;     //hour低位
  reg  [3:0]  data_hH;     //hour高位
  reg  [3:0]  data_ment;   //数码管数据传递中间参量
  wire add_cnt_div_s;
  wire end_cnt_div_s;
  wire add_cnt_div_ms;
  wire end_cnt_div_ms; 
  wire add_cnt_sel;
  wire end_cnt_sel;
  wire add_cnt_s;
  wire add_cnt_min;
  wire add_cnt_h;
  wire end_cnt_s;
  wire end_cnt_min;
  wire end_cnt_h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值