引言
完全基于标准计数器进行设计,结构简单,采用多个计数器并通过各个计数器之间的“结束条件”与“加一条件”的组合逻辑进行拼接,实现可调时钟与可调闹钟。。
按钮信号处理
在按钮信号处理部分,由于使用的开发板按钮按下表示低电平,所以对输入信号进行取反后再使用,利用输入按钮信号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

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

2849

被折叠的 条评论
为什么被折叠?



