⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字钟2.txt

📁 基本功能: 1.具有时、分、秒计数显示功能(6位数码管构成)
💻 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 + -