1、(3)实现基础功能闹钟,可设置闹钟时间,当时间到达后响起。附有闹钟开关控制闹钟。(4)实现扩展功能秒表。进入秒表后从零开始计时,计时最小单位10ms,最大单位小时。具有暂停重置的功能。2、时钟操作方法1、显示模式:显示模式下,显示当前时间的时和分,显示为24h制。分和时中间有一小数点以1HZ的频率闪烁。最左边的led灯表面当前的闹钟开关状态,led灯亮代表闹钟打开。显示模式的按键功能如下:中间的button:摁住可显示当前时间的秒。左边的button:长按超过一秒可进入设置时间状态右边的button:长按超过一秒可进入设置闹钟的状态上边的button:按住可显示闹钟设置的时间,长按超过一秒 可
2、对闹钟进行开关下边的button:长按超过一秒进入秒表状态2、设置时间模式在显示模式下长按左边的button即可进入设置时间模式。设置时间模式下,要设置分,即分的两位闪烁;要设置时即小时的两位闪烁。进入设置时间时,分时的初始状态即为进入前的当前时间。设置时间模式的按键功能如下:按一下确认更改将当前时间更改为设置时间按一下改变调试变量,可调分和小时按一下退出设置时间并对当前时间不做更改按一下即可将当前设置的变量加1,分钟大 于59后即从零计,小时大于23后从零计按一下即可将当前设置的变量减1,分钟小 于0后即从59计,小时小于0后从23计3、设置闹钟模式: 在显示模式下长按右边的button即可
3、进入设置闹钟模式。设置闹钟模式下,要设置分,即分的两位闪烁;进入设置闹钟时,分时的初始状态为当前闹钟的分钟和小时。闹钟触发现象为led灯走马灯闪烁。设置闹钟模式的按键功能如下:按一下确认更改将闹钟更改为当前设置时间按一下退出设置闹钟并对闹钟不做更改4、秒表模式:在显示模式下长按下边的button即可进入秒表模式。秒表模式的计数从零开始,最小单位为10ms。四位显示最初为秒+10毫秒,到达一分钟后自动跳转为分+秒,到达一小时后自动跳转为小时+分,到达一天后从零重计。秒表模式的按键功能如下:按一下暂停读秒,再按重新开始按一下重置秒表按一下退出设秒表但不重置也不暂停无功能三、设计模块概览设计模块关系
4、如下:其中模块watch_TOP为顶层模块,无其他功能,只是将各个子模块相连接。watch_TOP的RTL图如下:其余模块功能简介如下:1、all_clk模块:负责输出不同的分频2、ctrl模块:负责控制其他所有模块,感知当前状态并根据不同的外部输入调整下一状态。根据当前状态选择要进行输出的数据。是整个设计中权限最高、最核心的模块3、time_count模块:是进行时钟计数,并设置时间的模块4、stopwatch模块:负责秒表计数及其显示的模块5、alarm模块:负责设置闹钟,并判断闹钟是否响起的模块6、clock_display模块:负责显示当前的时间,接受来自 time_count模块的时
5、间数据7、change模块:最底层模块,将四位二进制所表示的数据转 化七段码四、模块及代码详解1、顶层模块watch_TOP:顶层模块的输入输出以及所定义的变量如下: 其中输入输出全部与外部直接相连,clk与100MHZ时钟连接,key与5个button相连,wei与数码管三个控制位相连,duan与数码管每位的各段相连,led与16个led灯相连。定义的变量全部为wire型变量,作用只是将各个模块相连。其中s,m,h代表当前要显示的时间;m_alarm,h_alarm代表闹钟的时间;state_next,state_now代表当前状态和下一状态;duan0,duan1,duan2,duan3分
6、别代表4种状态下的每种状态的七段码段的输出;wei0,wei1,wei2,wei3分别代表4种状态下的每种状态的七段码位的输出;clk1,clk2,clk3代表了1HZ,1KHZ,2HZ的分频;alarm_switch代表了闹钟的开关状态。以上变量的意义在子模块中均没有任何改变,可一并代入理解。代码中将state_next直接赋给state_now用以改变运行的当前状态,后续将再度提到。顶层模块的代码没有什么其他实际性内容,只是将各个模块实例化并连接。将代码展示如下:2、分频模块all_clk:分频模块的主要功能是根据输入的100MHZ的时钟,进行分频,输出1HZ,1KHZ,2HZ频率的时钟。
7、分频模块的代码比较简单,直接贴上:其中输入clk即为100MHZ的时钟,输出clk1为1HZ频率的时钟;输出clk2为1KHZ频率的时钟;输出clk3为2HZ频率的时钟。寄存器变量count0,count1,count2为分频时计数所用。分频的原理是每个clk的上升沿进行各个count的计数,当到达相应的频率和100MHZ频率倍数的一半时,将代表该频率的变量进行取反。这样即可得到相应的频率的时钟输出。3、控制模块ctrl:控制模块ctrl是所有模块中最重要,最核心的模块。这个模块负责根据当前的状态及外部的输入决定下一个状态以及要输出的外部的显示的数据是哪一个模块的数据。该模块的输入输出及定义的
8、变量如下:其中clk代表100MHZ的时钟,key代表5个button,state_now代表当前状态,state_next代表下一状态。具体对应是“0代表显示模式,1代表设置时间模式,2代表设置闹钟模式,3代表秒表模式”。对应关系在整个设计中均为如此,之后不再赘述。其余输入输出前文均有提过,意义相同不再赘述。寄存器变量count0,count1,count2,count3,count4也是为计数所用,但注意这里计数的意义与分频模块all_clk中不同,这里的计数是为按下button时消抖所用。具体对应为“0代表中间的button,1代表上边的button,2代表下边的button,3代表左边
9、的button,4代表右边的button”。key的编号也是这个意义。本处的对应关系在整个设计中应用到button的均为如此(分频模块all_clk中除外),以下不再赘述。控制模块ctrl以clk的上升沿作为触发条件,并用case语句根据当前状态state_now进行不同操作。接下来将解释每种状态下的处理:显示模式(状态编号00): 当key1被按下,对应计数变量count1开始计数,计数超过1S时,变量alarm_switch进行取反,代表闹钟的开关。当key2被按下,对应计数变量count2开始计数,计数超过1S时,state_next改为11,代表进入秒表模式。当key3被按下,对应计数
10、变量count3开始计数,计数超过1S时,state_next改为01,代表进入设置时间模式。当key4被按下,对应计数变量count4开始计数,计数超过1S时,state_next改为10,代表进入设置闹钟模式。最后,要将显示模式的输出duan0和wei0赋值给总的输出duan和wei。设置时间模式(状态编号01): 当key0被按下,对应计数变量count0开始计数,计数超过1S时,代表确认设置,state_next改为00,返回显示模式。 当key4被按下,对应计数变量count4开始计数,计数超过1S时,代表取消设置,state_next改为00,返回显示模式。最后,要将设置时间模式的
11、输出duan1和wei1赋值给总的输出duan和wei。设置闹钟模式(状态编号10):设置闹钟模式下按键的意义与设置时间模式完全一样,代码基本相同,只不过最后要将设置闹钟模式的输出duan2和wei2赋值给总的输出duan和wei。秒表模式(状态编号11): 当key4被按下,对应计数变量count4开始计数,计数超过1S时,代表返回显示模式,state_next改为00,注意此时秒表仍在运行。最后,要将秒表模式的输出duan3和wei3赋值给总的输出duan和wei。整个控制模块ctrl中的这条case语句默认是显示模式(状态00)下的操作。4、显示模式(00): 显示模式输出当前时间的显示
12、以及部分隐藏的显示。显示模式的输入输出变量之前均已解释,意义相同不再赘述。变量data代表传入七段码转化模块的数据,wei_ctrl是位的控制变量用来移位,并将其赋值给wei0。duan_7和duan0_7都是为了使分和小时中间的点闪烁用的。下面这部分主要就是让那个点一秒钟闪烁一次,clk3频率为2HZ。 接下来是显示模式主要的代码:触发条件为1KHZ的clk2的上升沿。首先是数码管的移位,并且只显示第三位的小数点。接下来是if else语句,如果key0被按下,显示秒。如果key1被按下,显示闹钟的设置时间。否则显示当前的分和小时。如果不在当前状态(00)下,全部复位。每一个if语句中,有一
13、个case语句,根据wei_ctrl的状态显示不同的数据,是七段码扫描显示的基本要求。5、设置时间模块(01):设置时间模块用来设置时间以及显示设置时间的状态。输入输出变量此前均已说明,不再赘述。5个count还是计数用。、;m_set和h_set代表设置时要显示的分和时。wei_ctrl用来数码管的扫描移位,wei_shan是为了做到调时间时的闪烁效果;data还是转化为七段码之前的数据。duan_7和duan0_7与之前相同;set_state代表当前要设置的是哪一位。 上边这段代码是时钟的计时以及对中间的按键的使用。中间的按键只能在当前状态下才能调用,如果按键key0被按下,则是确认设置
14、时间,我们就将设置的时间赋值给要显示的时间。计时的话,就是每一秒s+1,s每到60置零,m+1并以此类推。下边的代码是小数点以及设置位闪烁的代码。首先小数点还是每秒闪烁一次。而wei_shan用来控制数码管的闪烁。如果设置状态set_state为0,即设置分,那么前两位常亮,后两位不断取反闪烁。如果设置小时,就刚好倒过来。接下来是设置时间和分钟加或减的代码。还是当前状态下,按键有效,否则设置显示的时间就是当前显示时间。key1被按下,则根据目前的要设置的状态分别对时或分进行加减,如果超出则置零。key2就是就是将加改成减,如果小于0就置为最大值。Key3如果被按下,就将设置状态进行取反。即可调
15、节当前要设置的是分还是小时。接下来这一段是七段码的扫描显示,与此前的显示模式基本相同,只不过一直只显示我们设置的情况。6、设置闹钟模块(10):设置闹钟模块是用来设置闹钟的时间以及做出相应的显示。该模块的输入输出此前均有定义,意义相同不再赘述。定义的变量中,led_alarm是为了在闹钟激活时led能够以走马灯亮起的初始状态,alarm_switch是闹钟开关状态,从ctrl模块中传出,并在此处赋值给led灯。其余变量在设置时间模式中均有使用,意义相同不再赘述。接下来是时间到达闹钟设置时间时的代码。如果显示的时间和我们设置的闹钟的时间相同,led_alarm就以50HZ的频率进行移位,也就是走
16、马灯显示。否则的话就置为初始值,不做显示。接下来分别是,小数点和设置位闪烁的代码,对闹钟的分和时进行设置的代码,七段码扫描显示输出的代码,这些与设置时间的代码基本相同。两处不同可对比观察,一个是key0被按下后,h_set和m_set赋值给h_alarm和s_alarm而不是h和m;另一个是不为当前状态时,复位是之前设的闹钟时间,而不是当前显示时间。其余直接贴上,不做解释。7、秒表模块(11):秒表模块的作用主要是从零开始计时,输入输出以及定义的变量如下:输入输出变量此前均有说明,意义相同不再赘述。定义的变量中,ms_10是存储以10ms为单位的计时变量,stop_state代表当前是暂停状态还是读秒状态。dis_state代表当前显示的状态,其余变量其他模块中均有使用,意义相同不再赘述。下面的代码与此前的模块有很多相似之处,就不一一解释了,只将几个不同点来解释一下。一个是计时的模块中增加了ms_10这个变量,其余的可类比time_count模块。还有按键的功能为,key0被按下,则stop_state取反,代表当前是暂停还是读秒。Key3被按下,则是全部置零且置于暂停状态。而在七段码扫描显示部分,则可类比clock_display模块。只不过判断条件由按键变为了显示状态dis_state。显示状态则由计时的时间决定,时间满则进入下一状态。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1