




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档数字系统设计实验多功能时钟的设计 SYSU目录1、 实验简介.32、 时钟操作方法.43、 设计模块概览.64、 模块及代码详解.7一、实验简介1、实验内容:利用vivado开发工具和BASYS3开发板,采用硬件编程语言verilog设计一个时钟。以开发板上的四位七段数码管支持时钟的显示,以5个button和16个switch支持闹钟的功能切换。2、 实验目标:(1) 实现基础功能时钟的显示。要求时钟精准,并且能够显示时、分、秒。(2) 实现基础功能设置时间。要求进入到设置时间的功能,调整好时间后,从当前时间运行。(3) 实现基础功能闹钟,可设置闹钟时间,当时间到达后响起。附有闹钟开关控制闹钟。(4) 实现扩展功能秒表。进入秒表后从零开始计时,计时最小单位10ms,最大单位小时。具有暂停重置的功能。2、 时钟操作方法1、 显示模式:显示模式下,显示当前时间的时和分,显示为24h制。分和时中间有一小数点以1HZ的频率闪烁。最左边的led灯表面当前的闹钟开关状态,led灯亮代表闹钟打开。显示模式的按键功能如下:中间的button:摁住可显示当前时间的秒。左边的button:长按超过一秒可进入设置时间状态右边的button:长按超过一秒可进入设置闹钟的状态上边的button:按住可显示闹钟设置的时间,长按超过一秒 可对闹钟进行开关下边的button:长按超过一秒进入秒表状态2、设置时间模式在显示模式下长按左边的button即可进入设置时间模式。设置时间模式下,要设置分,即分的两位闪烁;要设置时即小时的两位闪烁。进入设置时间时,分时的初始状态即为进入前的当前时间。设置时间模式的按键功能如下:中间的button:按一下确认更改将当前时间更改为设置时间左边的button:按一下改变调试变量,可调分和小时右边的button:按一下退出设置时间并对当前时间不做更改上边的button:按一下即可将当前设置的变量加1,分钟大 于59后即从零计,小时大于23后从零计下边的button:按一下即可将当前设置的变量减1,分钟小 于0后即从59计,小时小于0后从23计3、 设置闹钟模式: 在显示模式下长按右边的button即可进入设置闹钟模式。设置闹钟模式下,要设置分,即分的两位闪烁;要设置时即小时的两位闪烁。进入设置闹钟时,分时的初始状态为当前闹钟的分钟和小时。闹钟触发现象为led灯走马灯闪烁。设置闹钟模式的按键功能如下:中间的button:按一下确认更改将闹钟更改为当前设置时间左边的button:按一下改变调试变量,可调分和小时右边的button:按一下退出设置闹钟并对闹钟不做更改上边的button:按一下即可将当前设置的变量加1,分钟大 于59后即从零计,小时大于23后从零计下边的button:按一下即可将当前设置的变量减1,分钟小 于0后即从59计,小时小于0后从23计4、 秒表模式:在显示模式下长按下边的button即可进入秒表模式。秒表模式的计数从零开始,最小单位为10ms。四位显示最初为秒+10毫秒,到达一分钟后自动跳转为分+秒,到达一小时后自动跳转为小时+分,到达一天后从零重计。秒表模式的按键功能如下:中间的button:按一下暂停读秒,再按重新开始左边的button:按一下重置秒表右边的button:按一下退出设秒表但不重置也不暂停上边的button:无功能下边的button:无功能三、设计模块概览设计模块关系如下: 其中模块watch_TOP为顶层模块,无其他功能,只是将各个子模块相连接。watch_TOP的RTL图如下:其余模块功能简介如下:1、 all_clk模块:负责输出不同的分频2、 ctrl模块:负责控制其他所有模块,感知当前状态并根据不同的外部输入调整下一状态。根据当前状态选择要进行输出的数据。是整个设计中权限最高、最核心的模块3、 time_count模块:是进行时钟计数,并设置时间的模块4、 stopwatch模块:负责秒表计数及其显示的模块5、 alarm模块:负责设置闹钟,并判断闹钟是否响起的模块6、 clock_display模块:负责显示当前的时间,接受来自 time_count模块的时间数据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分别代表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频率的时钟。分频模块的代码比较简单,直接贴上:其中输入clk即为100MHZ的时钟,输出clk1为1HZ频率的时钟;输出clk2为1KHZ频率的时钟;输出clk3为2HZ频率的时钟。寄存器变量count0,count1,count2为分频时计数所用。分频的原理是每个clk的上升沿进行各个count的计数,当到达相应的频率和100MHZ频率倍数的一半时,将代表该频率的变量进行取反。这样即可得到相应的频率的时钟输出。3、 控制模块ctrl:控制模块ctrl是所有模块中最重要,最核心的模块。这个模块负责根据当前的状态及外部的输入决定下一个状态以及要输出的外部的显示的数据是哪一个模块的数据。该模块的输入输出及定义的变量如下:其中clk代表100MHZ的时钟,key代表5个button,state_now代表当前状态,state_next代表下一状态。duan0,duan1,duan2,duan3分别代表4种状态下的每种状态的七段码段的输出;wei0,wei1,wei2,wei3分别代表4种状态下的每种状态的七段码位的输出;具体对应是“0代表显示模式,1代表设置时间模式,2代表设置闹钟模式,3代表秒表模式”。对应关系在整个设计中均为如此,之后不再赘述。其余输入输出前文均有提过,意义相同不再赘述。寄存器变量count0,count1,count2,count3,count4也是为计数所用,但注意这里计数的意义与分频模块all_clk中不同,这里的计数是为按下button时消抖所用。具体对应为“0代表中间的button,1代表上边的button,2代表下边的button,3代表左边的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被按下,对应计数变量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,返回显示模式。最后,要将设置时间模式的输出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): 显示模式输出当前时间的显示以及部分隐藏的显示。 显示模式的输入输出变量之前均已解释,意义相同不再赘述。变量data代表传入七段码转化模块的数据,wei_ctrl是位的控制变量用来移位,并将其赋值给wei0。duan_7和duan0_7都是为了使分和小时中间的点闪烁用的。下面这部分主要就是让那个点一秒钟闪烁一次,clk3频率为2HZ。 接下来是显示模式主要的代码:触发条件为1KHZ的clk2的上升沿。首先是数码管的移位,并且只显示第三位的小数点。接下来是if else语句,如果key0被按下,显示秒。如果key1被按下,显示闹钟的设置时间。否则显示当前的分和小时。如果不在当前状态(00)下,全部复位。每一个if语句中,有一个case语句,根据wei_ctrl的状态显示不同的数据,是七段码扫描显示的基本要求。5、 设置时间模块(01):设置时间模块用来设置时间以及显示设置时间的状态。输入输出变量此前均已说明,不再赘述。5个count还是计数用。、;m_set和h_set代表设置时要显示的分和时。wei_ctrl用来数码管的扫描移位,wei_shan是为了做到调时间时的闪烁效果;data还是转化为七段码之前的数据。duan_7和duan0_7与之前相同;set_state代表当前要设置的是哪一位。 上边这段代码是时钟的计时以及对中间的按键的使用。中间的按键只能在当前状态下才能调用,如果按键key0被按下,则是确认设置时间,我们就将设置的时间赋值给要显示的时间。计时的话,就是每一秒s+1,s每到60置零,m+1并以此类推。下边的代码是小数点以及设置位闪烁的代码。首先小数点还是每秒闪烁一次。而wei_shan用来控制数码管的闪烁。如果设置状态set_state为0,即设置分,那么前两位常亮,后两位不断取反闪烁。如果设置小时,就刚好倒过来。接下来是设置时间和分钟加或减的代码。还是当前状态下,按键有效,否则设置显示的时间就是当前显示时间。key1被按下,则根据目前的要设置的状态分别对时或分进行加减,如果超出则置零。key2就是就是将加改成减,如果小于0就置为最大值。Key3如果被按下,就将设置状态进行取反。即可调节当前要设置的是分还是小时。接下来这一段是七段码的扫描显示,与此前的显示模式基本相同,只不过一直只显示我们设置的情况。6、 设置闹钟模块(10):设置闹钟模块是用来设置闹钟的时间以及做出相应的显示。该模块的输入输出此前均有定义,意义相同不再赘述。定义的变量中,led_alarm是为了在闹钟激活时led能够以走马灯亮起的初始状态,alarm_switch是闹钟开关状态,从ctrl模块中传出,并在此处赋值给led灯。其余变量在设置时间模式中均有使用,意义相同不再赘述。接下来是时间到达闹钟设置时间时的代码。如果显示的时间和我们设置的闹钟的时间相同,led_alarm就以50HZ的频率进行移位,也就是走马灯显示。否则的话就置为初始值,不做显示。接下来分别是,小数点和设置位闪烁的代码,对闹钟的分和时进行设置的代码,七段码扫描显示输出的代码,这些与设置时间的代码基本相同。两处不同可对比观察,一个是key0被按下后,h_set和m_set赋值给h_alarm和s_alarm而不是h和m;另一个是不为当前状态时,复位是之前设的闹钟时间,而不是当前显示时间。其余直接贴上,不做解释。7、 秒表模块(11):秒表模块的作用主要是从零开始计时,输入输出以及定义的变量如下: 输入输出变量此前均有说明,意义相同不再赘述。定义的变量中,ms_10是存储以10ms为单位的计时变量,stop_state代表当前是暂停状态还是读秒状态。dis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论