📄 数字钟2.txt
字号:
基本功能:
1.具有时、分、秒计数显示功能(6位数码管构成),以24小时循环为计时基准。
2. 具有调节小时、分钟的功能。
3.具有整点报时功能,整点报时的同时数码管显示闪烁提示。
附加功能:
1. 能显示日历。
2. 能显示星期几;
3. 闹铃。
4. 秒表功能。
5.篮球24秒倒计时。
1. 按键的设置
考虑到操作的简单、实用,这里只用了的3个按键:
(1)功能切换键;
(2)移位键(用于指定对哪一个数操作,选中的数会闪烁,还用于秒表的暂停和开始);
(3)设置键(用于加减,秒表的复位)。
2. 状态机的设计
系统分成:
(1)state_normal: 时间显示。
(2)state_calendar: 实现日历的显示和设置。
(3)state_Week: 实现星期的显示和设置。
(4)state_timeAdjust: 实现时间设置。
(5)state_timerAdjust: 实现闹铃设置。
(6)state_secondWatch:实现秒表的操作。
(7)state_countDown: 实现篮球24秒倒计时。
module end_digit_clock_5f(
clk,//时钟信号,频率=1KHZ
key_func,//功能切换键
key_shift,//移位键
key_set,//设置键
LEDaddr,//数码管地址输出
codeOut,//数码管段码输出
alarm//警报输出
);
input clk;
input key_func,key_shift,key_set;
reg keyfunc,keyshift,keyset;
output [2:0]LEDaddr;
reg [3:0]LEDx;
reg [2:0]LEDaddr;
output [6:0]codeOut;
reg [6:0]codeOut;
output alarm;
reg timing,timer_alarm,clock_alarm;
assign alarm=timer_alarm||clock_alarm;//闹铃报警信号或整点报时
reg [3:0]LED_flash;//闪烁位
reg [3:0]LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0;//8个数码管的显示值
reg [3:0]counter_100HZ;//分频计数器
reg [6:0]counter_1HZ;//
reg clk_1HZ,clk_100HZ; //1HZ和100HZ的时钟
reg [3:0]sec0,sec1,min0,min1,hour0,hour1;//时间计数值
reg sec0_over,sec1_over,min0_over,min1_over,hour0_over,hour_over;//时间进位脉冲
reg [2:0]week;//星期计数值
reg addmin,addhour,add_week;// 加1信号
reg add_day,add_month,add_year;//加1信号
wire clk_second,clk_min,clk_hour,clk_week;
reg add_second,add_minute,add_hour;//时间计数器的加1信号
assign clk_second=add_second^clk_1HZ;//秒计数时钟
assign clk_min=add_minute^sec1_over;//分记数时钟
assign clk_hour=add_hour^min1_over;//时记数时钟
assign clk_week=add_week^hour_over;//星期计数时钟
reg day_over,month_over,year0_over,year1_over,year2_over;//日历计数器的进位信号
reg [3:0]day0,day1,day,month0,month1,month,year0,year1,year2,year3;//日历计数器的值
wire clk_day,clk_month,clk_year;//日历计数脉冲
assign clk_day=add_day||hour_over;//天记数时钟
assign clk_month=add_month||day_over;//月记数时钟
assign clk_year=add_year||month_over;//年记数时钟
reg add_timer_second,add_timer_minute,add_timer_hour;//闹铃计数器的加1信号
reg timer_sec0_over,timer_min0_over;//闹铃计数器的进位信号
reg [3:0]timer_sec0,timer_sec1,timer_min0,timer_min1,//闹铃计数值
timer_hour0,timer_hour1;
reg [3:0]SW0,SW1,SW2,SW3,SW4,SW5;//秒表的计数值
reg SW0_over,SW1_over,SW2_over,SW3_over,SW4_over;//秒表的进位信号
reg SW_stop,SW_clear;//秒表的停止和清除信号
reg CD_stop,CD_clear;//24秒倒计时的停止和清除信号
reg [3:0]CD0,CD1;//24秒倒计时的计数值
//-----------------------
parameter ON=1'b1,
OFF=1'b0,
NO_disp=4'b1111;//表示数码管不显示
reg [3:0]state;//状态值
parameter state_normal=0, //时间状态
state_calendar=1, //日历状态
state_Week=2, //星期状态
state_timeAdjust=3, //时间设置状态
state_timerAdjust=4,//闹铃设置状态
state_secondWatch=5,//秒表状态
state_countDown=6; //倒计时状态
always @(posedge clk)//----- 十分频
begin
if(counter_100HZ==9)
counter_100HZ=0;
else counter_100HZ=counter_100HZ+1;
if(counter_100HZ<5)clk_100HZ=0;
else clk_100HZ=1;
end
always @(posedge clk_100HZ)//----- 百分频
begin
if(counter_1HZ==99)
counter_1HZ=0;
else counter_1HZ=counter_1HZ+1;
if(counter_1HZ<50)clk_1HZ=0;
else clk_1HZ=1;
end
//---------------------------------
wire key_down;//当任何键按下时:key_down=1;没键按下时: key_down=0。
assign key_down = key_func||key_shift||key_set;
//-----------------用于触发事件 的秒计数器
//比如当键释放后开始计数,计数值达到5秒钟,系统的状态复位
reg [2:0]count_seccond;
always @(posedge clk_1HZ or posedge key_down)
if(key_down)count_seccond=0;
else
count_seccond=count_seccond+1;
//---------------用于系统初始化的内部复位脉冲 的产生模块--------
reg flag_reset,reset;
always @(posedge clk)
if(flag_reset==0)
begin
flag_reset=1;
reset=1;
end
else
begin
reset=0;
end
//------------3个按键的去抖 -----------
reg [3:0]n0,n1,n2;
always @(posedge clk)//------------功能切换键去抖
//当按键维持高电平时间长度达到1KHZ时钟的5个周期,
//才产生一个上升沿,并维持高电平到键释放
if(key_func)begin
if(n0==5)keyfunc=1;
n0=n0+1;
end
else
begin
n0=0;
keyfunc=0;
end
always @(posedge clk)//------------移位键去抖
if(key_shift)
begin
if(n1==5)keyshift=1;
n1=n1+1;
end
else
begin
n1=0;
keyshift=0;
end
always @(posedge clk)//------------设置键去抖
if(key_set) begin
if(n2==5)keyset=1;
n2=n2+1;
end
else
begin
n2=0;
keyset=0;
end
//-----------------报警信号的产生(alarm)--------
always @(posedge clk or posedge key_down)
if(key_down)timer_alarm=OFF;//当有键按下时,关闭闹铃
else
//当时间达到闹铃设定时间,或者
if((timing&&timer_sec1==sec1&&timer_sec0==sec0&&timer_min1==min1&&
timer_min0==min0&&timer_hour1==hour1&&timer_hour0==hour0)||
(CD0==0&&CD1==0))
timer_alarm=ON;
else
if(min0-timer_min0)timer_alarm=OFF; //响一分钟关闭
else
if(!sec0&&!sec1&&!min0&&!min1)clock_alarm=ON;//当分秒都为零时,整点报时
else clock_alarm=OFF;
//----------------按键处理模块--------------
reg flag_done,//一次按键处理标志
flag_back;//用于协调显示位闪烁的标志:功能键按下时值1,当移动键按下时清除。
always @(posedge clk)//
begin
if(reset==1)//寄存器的初始化
begin
LED_flash=0;//不闪烁
state=state_normal;//正常时间显示
SW_stop=1;//秒表停止
CD_stop=1;//倒计时停止
flag_back=1;
flag_done=0;//按键处理标志复位
timing=0;//关闭闹铃
end
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -