EDA课程设计 多功能数字钟设计报告 数字系统设计与verilog HDL(

更新时间:2024-05-15 20:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EDA课程设计报告:

实用多功能数字钟

学 院:

专 业:

班 级:

学 号: 姓 名: 指导老师:江伟

2012年12月25日

实用多功能数字钟

摘要

本EDA课程设计利用QuartusII软件Verilog VHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。

单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。

关键字:多功能数字钟、Verilog、模块、调试、仿真、功能

目录

一.课程设计的目的及任务???????????????1

1.1 课程设计的目的?????????????????1 1.2 课程设计的任务与要求??????????????1

二.课程设计思路及其原理 ??????????????1 三.QuartusII软件的应用??????????????2

3.1工程建立及存盘?????????????????2 3.2工程项目的编译?????????????????3 3.3时序仿真????????????????????3

四.分模块设计、调试、仿真与结果分析 ?????????4

4.1 clk50mto1 时钟分频模块 ????????????4 4.2 adder 加法器模块 ???????????????4 4.3 hexcounter16 进制计数器模块 ??????????5 4.4 counter_time 计时模块 ?????????????5 4.5 alarm闹铃模块?????????????????6 4.6 sound_ddd嘀嘀嘀闹铃声?????????????7 4.7 sound_ddd_du嘀嘀嘀—嘟声音模块 ????????7 4.8 alarm_time闹钟时间设定模块 ??????????8 4.9 bitsel将输出解码成时分秒选择模块 ???????8 4.10 switch去抖模块????????????????8 4.11 led译码显示模块 ???????????????9 4.12 clock顶层模块 ????????????????10

五.实验总结???????????????????????? 11

5.1调试中遇到的问题及解决的方法??????????11 5.2实验中积累的经验????????????????12 5.3心得体会????????????????????12

六.参考文献 ????????????????????12

七.程序清单?????????????????????13

一. 课程设计的目的及任务

1.1 课程设计的目的

通过课程设计的锻炼,要求学生掌握Verilog语言的一般设计方法,掌握VHDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的创新精神。

掌握现代数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法

1.2 课程设计的任务与要求

用Verilog设计一个多功能的数字钟,具有下述功能;

(1)计时功能。包括时、分、秒的计时;

(2)定时与闹钟功能:能在设定的时间发出闹铃音; (3)校时功能。对时、分和秒能手动调整以校准时间;

(4)整点报时功能;每逢整点,产生\嘀嘀嘀嘀一嘟\四短一长的报时音

二.课程设计思路及其原理

数字计时器要实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能,所有功能都基于计时功能。

因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHZ,通过分频获得所需脉冲频率1Hz。

得到1hz脉冲后,要产生计时模块,必须需要加法器来进行加法,因此需要一个全加器,此实验中设计一个八位全加器来满足要求。

数字电路设计中,皆采用二进制加法,为实现实验中时分秒的最大功能,本实验中采用十六进制加法器,再进行BCD码进行转换来实现正常时钟显示。

为产生秒位,设计一个模60计数器,利用加法器对1HZ的脉冲进行秒计数,产生秒位;为产生分位,通过秒位的进位产生分计数脉冲,分位也由模60计数器构成;为产生时位,用一个模24计数器对分位的进位脉冲进行计数。整个数字计时器的计数部分共包括六位:时十位、时个位、分十位、分个位、秒十位和秒个位。

基本的计时模块完成之后,整点报时、清零、校时、LED显示、闹铃模块可以相互实现,其中,闹铃模块与计时模块的显示相互并行。

清零功能是通过控制计数器清零端的电平高低来实现的。只需使清零开关按下时各计数器的清零端均可靠接入有效电平(本实验中是低电平),而清零开关断开时各清零端均接入无效电平即可。

保持功能是通过逻辑门控制秒计数器输入端的1Hz脉冲实现的。正常情况下,开关不影响脉冲输入即秒正常计数,当按下开关后,使脉冲无法进入计数端,从而实现计时保持功能。

要进行闹钟功能,是否进行闹钟模块nowmode,当选择00表示即使模块,10闹钟模式,01手动调整模式。

当选择闹铃模块之后,是否是整点报时闹铃还是闹钟闹铃,又需要设置一个选择模块alarmout,当00模式时不开启闹铃,01进行闹铃模式,10进行整点报时模块。

整点报时是本实验中的sound_ddd_du模块(详见附录中程序清单),sound_ddd_du模块与计时模块有点类似,但整点报时模块中不要分时分秒计数,可直接利用1hz的分频计数至时位进位时的数值,开启ddd_du闹铃。

闹钟报时功能。在计时电路走到设定的时间时闹铃报时功能会被启动,通过与ddd产生电路进行逻辑组合,使得在达到闹铃时,发出ddd。

闹铃模块和校正模块中,需要选择闹铃调时Alarmode还是checkmode校时模块,因此需要利用bitsel模块进行选择。

闹钟只设定时和分,基本模块Alarmode与正常计时电路里的校时校分电路相同。本实验中为节省按键,闹钟时间调节键复用正常调时的校时校分开关,为使设定闹铃与正常计时中调节时间按键互不影响,额外用一个闹钟使能键,按下该键后进入闹钟设定界面,此时校时校分开关用于调节闹钟时间,对正常计时没有影响;恢复使能键后校分校时键用于对数字钟进行时间调节,对设定的闹钟时间没有影响。

校分校时checkmode功能基本原理是通过逻辑门电路控制分计数器的计数脉冲,当校分校时开关断开时,计数脉冲由低位计数器提供;当按下校分校时开通时,既可以手动触发出发式开关给进位脉冲,也可以有恒定的1Hz脉冲提供恒定的进位信号,计数器在此脉冲驱动下可快速计数。

为实现可靠调时,采用防抖动开关(由D触发器实现)克服开关接通或断开过程中产生的一串脉冲式振动。

当全部功能实现之后,要完成数字钟的全部输出,需要一个LED显示模块。 最后,将所有程序进行调试,在clock顶层模块中可以实现全部功能。

三. QuartusII软件的应用

3.1工程建立及存盘

1.打开 QuartusⅡ,单击“File”菜单,选择 File→New Project Wizard,对话框如下:分别输入项目的工作路径、项目名和实体名,单击Finish。

图3.1

2.单击“File”菜单,选择New,弹出小对话框,双击“VHDL File\,即选中了文本编辑方式。在出现的“Vhdl1.vhd”文本编辑窗中键入VHDL程序,输入完毕后,选择File→Save As,即出现“Save As”对话框。选择自己建立好的存放本文件的目录,然后在文件名框中键入文件名,按“Save”按钮。

3. 建立工程项目,在保存VHDL文件时会弹出是否建立项目的小窗口,点击“Yes”确定。即出现建立工程项目的导航窗口,点击“Next”,最后在出现的屏幕中分别键入新项目的工作路径、项目名和实体名。注意,原理图输入设计方法中,存盘的原理图文件名可以是任意的,但VHDL程序文本存盘的文件名必须与文件的实体名一致,输入后,单击“Finish”按钮。

3.2工程项目的编译

单击工具条上的编译符号开始编译,并随着进度不断变化屏幕,编译成功,完成后的屏幕如图3.2所示:

图3.2

3.3时序仿真

建立波形文件:选择 File→New,在New窗中选中“Other File”标签。在出现的屏幕中选择“Vector Waveform File”项出现一新的屏幕,在assignment中选择seting,将timing选择function功能仿真,再在processing中建立网格。在出现的新屏幕中,双击“Name”下方的空白处,弹出“Insert Nod or Bus”对话框,单击该对话框的“Node Finder??”。在屏幕中的 Filter 中选择 Pins,单击“List”。而后,单击“>>”,所有输入/输出都被拷贝到右边的一侧,这些正是我们希望的各个引脚,也可以只选其中的的一部分,根据实际情况决定。然后单击屏幕右上脚的“OK”。在出现的小屏幕上单击“OK”。

设定仿真时间宽度。选择 Edit → End time?选项,在End time选择窗中选择适当的仿真时间域,以便有足够长的观察时间。

波形文件存盘。选择File→Save as 选项,直接存盘即可。 运行仿真器。在菜单中选择项,直到出现,仿真结束。

图3.4 编辑过程的仿真波形

四. 分模块设计、调试、仿真与结果分析

4.1 clk50mto1 时钟分频模块

实验中使用的振荡频率源为50MHZ,通过分频获得所需脉冲频率1Hz。在counter_1hz==50000000时,输出信号清零,若未达到则继续加一。

为实验观察方便,在单个模块的显示中,本处clock输入为1ps周期信号,得到clk50to1输出结果如图4.1所示,完全符合实验要求。

图4.1 clk50mto1 时钟分频模块

4.2 adder 加法器模块

本实验中adder采用8位全加器,out=in1+in2,带进位。

图4.2 adder 加法器模块

实验中数字钟时分秒最大计数为59,带进位8位全加器完全符合实验要求,如图4.2所示,77加62等于139,76加上93等于169.

4.3 hexcounter16 进制计数器模块

经过分频后,输出脉冲频率为1hz,即周期为1s,通过16进制计数器,将其转化为16进制数字。

16进制采用4位二进制,因此寄存器长度为四位。当set高电平有效时,将数据送给counter计数器,carrtbit清零,如若counter计数器达到16进制中max即15时,counter清零,而carrtbit置高电平有效。如若set一直处于低电平,则counter计数器自加一进行计数,carrtbit清零。

图4.3 hexcounter16 进制计数器模块

调试试验结果如图4.3所示,set一直处于低电平状态下,当datout计

数置3后再加一即清零,而carrybit置一,再来一个脉冲上升沿又回来置数,符合十六进制计数器。

4.4 counter_time 计时模块

时钟能够产生时间前提是对秒脉冲计数产生形成的,每个计时器的时钟,由前级进位和自增脉冲相加得到,为了形成时分秒,需要对秒进位信号进行计数从而产生分,对分进位信号进行计数产生时信号。秒和分均为60进制,时为24进制,所以需要有模60和模24计数器。计时示意如下:

秒个位 秒十位 分个位 分十位 时个位 时十位 1Hz

当秒计数中,秒个位逢9后,再来一个脉冲即向秒十位加一,秒个位清0,当秒十位达到5、秒个位9时,再自加一个脉冲后,向分个位加一,秒全班清零。同理,当分位达到59后,向时个位进一,分秒全部清零。而时为24进制,当时分秒为23:59:59时,当下一个脉冲上升沿到来时,全部清零。

图4.4 counter_time 计时模块

如图4.4所示,第一幅图为秒计数器计数至59后,向分计数器进位清零重新计数。第二个跳跃是分59向时进位。第二幅图中,最后一个跳跃是时分秒全部清零。根据时间轴的间断,可以观察到此现象。

4.5 alarm闹铃模块

闹钟模式是否开启,需要外部信号输入,让数字钟进入闹铃界面,还要分别是整点报时还是闹铃功能,且要保证在设定闹铃时数字钟能够正常工作。这就要求在闹铃和数字钟的走时功能互不影响。本实验用alarmon作为闹钟设定使能键。00时,正常计时;01进入闹钟设定状态。

本闹铃模块另外含有简单计时功能,这样与计时模块不产生冲突,当时间达到整点时,开启整点报时闹铃模块,当达到闹钟时间,进入闹钟闹铃模块。其他全部置零,计时模块。

图4.5 alarm闹铃模块

如图4.5所示,当alarmon选择00时,闹铃模块进入计数模块,没有闹铃输出。接着输入为01,闹钟铃声输出,进入闹钟闹铃模式;输入为10时,输出为嘀嘀嘀读,为整点报时铃声的输出。

4.6 sound_ddd嘀嘀嘀闹铃声模块

由前面闹铃模块选择闹铃声后,直接跳入到此闹钟闹铃嘀嘀嘀模块,嘀嘀嘀铃声分位三段,且设置不同周期,当mscount等于第一声间距乘以3加上二声间距乘以2加上三声之后时间间距减1时,为闹铃的最大周期,清零。当时间周期处于第一声或二声间距或三声之后周期之间时,闹铃响,总共响三声。其他情况下,闹铃无输出。

图4.6 sound_ddd嘀嘀嘀闹铃声模块

如图4.6所示,当进入闹钟闹铃时,闹钟发出ddd声音,两个滴声间距为20马上,连续三个低声之后间距为50ms,且以三声为周期。

4.7 sound_ddd_du嘀嘀嘀—嘟声音模块

嘀嘀嘀嘟声音模块与嘀嘀嘀声音模块类似,只不过嘀嘀嘀声过后不是控制下一声滴的时间间距,而是控制嘟的到来。嘟的声音比滴的声音长。

当进入嘀嘀嘀嘟模块后,如果mscount小于于滴声长度加上滴滴之间的时间间距再乘3再加上嘟的声音加10时,mscount在脉冲到来时自加,当mscount大于零小于SOUNDSPACE、在SOUNDSPACE加上两滴间距到再加SOUNDSPACE时等(详见程序清单),嘀嘀嘀嘟响起。

图4.7 sound_ddd_du嘀嘀嘀—嘟声音模块

如图4.7所示,在50ps周期的clk下,SOUNDSPACE为300ms,两滴时间间距为200ms,嘟的长度为600ms情况下,在整点报时开启时,在mscount0到220之间响起嘀嘀嘀嘟。

4.8 alarm_time闹钟时间设定模块

闹钟设定时,需要外部信号输入,让数字钟进入闹钟界面,且要保证在设定闹铃时数字钟能够正常工作。这就要求在设定闹铃和数字钟的校时校分功能互不影响。本实验用enablel作为闹钟设定使能键。0时,正常计时; 1进入闹钟设定状态。设定闹铃时间电路和计时电路中的校时校分的原理基本一致,不同之处在于,在闹铃设定完毕返回时间显示状态时获其他任何没有重新设定闹铃状态时,闹钟时间都不会改变。另外,在闹钟设定中,分位对时位没有进位。当sel为10时,对时进行设定;sel为01时,对分进行设定,当rest置一时,复位清零。。本模块采用基准时钟。

图4.8 alarm_time闹钟时间设定模块

如图4.8所示,当rest为低电平,enable高电平时,sel为01时,在inc的作用下对十进制的分秒进行设定;当sel为10时,同样的对时位进行设定。

4.9 bitsel将输出解码成时分秒选择模块

将输出解码成时分秒选择,并且分闹钟设置还是计时模式。为了不产生冲突,Alarmmode为是否设置闹钟模式,checkmode为是否设置调整时间模式,且相互之间不能同时有效。当reset有效时,对所有输出清零。

图4.9 bitsel将输出解码成时分秒选择模块

如图4.9所示,当rest有效时,输出全部清零;当alarmmode高电平有效时,对闹钟时分位的十分位进行调整输出;checkmode高电平有效时,可以对调整时间的时分秒进行调整。

4.10 switch去抖模块

为实现可靠调时,常采用防抖动开关克服开关接通或断开过程中产生的一串脉冲式振动,一般由D触发器延时功能实现。这里选择的是计数消抖,即只当有效电平到来后开始计数,当计数值大于一定值后再输出该有效电平,否则不输出,从而达到消抖目的。

图4.10 switch去抖模块

如图4.10所示,当clk下降沿到来时,counter进行计数自加;当clk_use下降到来时,输出电路输出输入数据。完成了因抖动带来的错误。

4.11 led译码显示模块

此模块是用于数码管的动态显示,采用七段显示数码管,因此输入长度定义四位,输出定义八位,将四位输入译码成对应的七位扫描数值。

0:dataout<=7'b1000000; 1:dataout<=7'b1111001; 2: dataout<=7'b0100100; 3:dataout<=7'b0110000; 4: dataout<=7'b0011001; 5:dataout<=7'b0010010; 6:dataout<=7'b0000010; 7:dataout<=7'b1111000; 8: dataout<=7'b0000000; 9:dataout<=7'b0010000; 10: dataout<=7'b0001000; 11:dataout<=7'b0000011; 12: dataout<=7'b1000110; 13:dataout<=7'b0100001; 14: dataout<=7'b0000110; 15:dataout<=7'b0001110;

图4.11 led译码显示模块

如图4.11所示,当输入为3时,ledout输出为00110000,对应数码管显示为3.

4.12 clock顶层模块

顶层模块中,调用各个模块来实现多功能数字钟。

首先是建立在计时模块上完成整个数字钟的走时,计时模块又是建立在50mhz分频至1hz、八位全加器、十六进制计数器等模块上完成整体的基本走时。

然后可以建立闹钟模块,且设置modestate置00为计时模式,10选择闹钟模块,01手动调整模式,11非法模式来避免闹钟模块与走时模块的冲突。

其次在闹铃模块中,ld_alert是否设置了闹铃控制闹铃的开关,mcheck手动调整时间,turn来控制调整的时间在分与时的选择,change是调整信号,alert为闹铃输出。

再通过led输出时分秒。

脉冲发生电路 译码显示电路 计时电路 报时电路 校分校时电路 清零电路

图4.11 clock顶层模块

如图4.11所示,在clock为1ps周期情况下,设置modestate置00为计时模式,10选择闹钟模块,01手动调整模式,11非法模式,在闹铃模块中,ld_alert高电平闹铃开,mcheck为高电平则可以手动调整时间,turn控制了调整的时间在分与时的选择,change有效则改变调整的数值,alert有效闹铃输出。

led hourl,led_hour0,led_minul,led_minu0,led_secl,led sec0输出时分秒。

五. 实验总结:

5.1 调试中遇到的问题及解决的方法: 1、 编程时,最常见也是最头疼的就是在各个模块调试的时候显示句子无定义,导致程序无法编译,但整个模块的语法没有错误。

解决办法:将各个模块之间调试有先后顺序,且将所有模块调试放在一个文件夹存放,以致可以相互调用。 2、经常导致语法错误,如:“;”没有写上,变量类型没有预先标明,前后变量名字由于缺少一个或多一个字母而导致出错。

解决办法:对照错误,认真检查程序,看哪个地方的标点,变量没有写上或标明。

3、进行编译或波形仿真时,经常得到的不是预想中的结果。

解决办法:弄明白该模块实现什么功能,调整好输入变量进行调试,不能完全采用随机变量。在方面观察的情况下,可以采用高电平或低电平代替。将需要编译或进行仿真的实体文件置顶,经检错无误后,进行波形仿真,在仿真之前需要合理设置仿真结束时间和信号周期。

5.2实验中积累的经验:

1、系统设计进要行充分的方案论证,不可盲目就动手去做;

2、实验中对每一个细节部分都要全面思考,要对特殊情况进行处理; 3、对于数字系统,要考虑模块定义使用先后顺序问题; 4、数字电路的理论分析要结合时序图;

5、遇到问题,要顺藤摸瓜,分析清楚,不可胡乱改动,每做一次改变都要有充分的理由;

6、模块化设计方法的优点在于其简洁性,但是在实验设计中也发现,在实验最终结果确定之前,要尽量减少模块重叠嵌套。

7、遇到问题花了很长时间没有解决掉,要学会向他人请教,别人的不经意一点,可能就能把自己带出思维死区。

5.3心得体会

作为当代大学生,将知识完全局限在课本上,缺乏理论实践,是普遍的一大成长弊端。而理论实践,又完全建立在课本知识上,因此,我们要学好专业知识和技能,这样在用到时才能得心应手;要有自学新知识的能力,对于陌生的东西要根据已掌握的知识来帮助自己尽快了解它;遇到困难时,首先要自己想办法解决,实在行不通时就要像老师和同学请教。

多功能数字钟,在实际应用中微不足道,但其中的设计流程思维与实践能力以及实践遇到的一些相关问题,让我们不容小视。设计是一个十分严谨的过程,容不得随意和马虎。要想快速而高效地完成一项设计,必须先有一个清晰明了的设计思路,设想好一个整体框架,然后在此基础上,逐渐将各个部分功能进行完善。

虽不是第一次在实验室接触Quartus,但通过两天的课程设计,让我受益匪浅,也让我真正明白理论与实践相结合的重要性。通过具体实践才能让自己清楚哪些知识已经掌握,哪些知识仍需巩固加强。但正所谓坚持就是胜利,要想取得成功,

必须要有努力付出,这样所取得的结果才更有意义。

与此同时,我也对EDA以及VHDL语言有了进一步了解,对于其结构、语法、功能等认识不少。当然,我目前所做的还仅仅只是一些基本操作,要想真正将其融会贯通还需要今后更多的学习与实践。

六.参考文献

[1] 王金明编数字系统设计与Verilog HDL(第四版)电子工业出版社 2008年10月 [2] 南京理工大学电子技术中心编 EDA设计实验指导书 2008 [3]www.http://www.njliaohua.com/百度文库

本文来源:https://www.bwwdw.com/article/y8s7.html

Top