




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多功能数字钟设计实验报告 多功能数字钟设计 院系:电光学院 班级:* 学号: * 姓名: * 指导老师:* 时间:2010.4.20.摘要:利用QuartusII软件设计一个数字钟,利用模块化的程序设计思想,核心模块均采用Verilog语言编写(译码显示模块采用原理图设计),软件仿真调试编译成功后,再下载到SmartSOPC实验系统中。经过硬件测试,查找软件设计缺陷,并进一步完善软件,最终设计得到较为满意的多功能数字钟。关键词:QuartusII; 多功能数字钟; 模块化; Verilog; 可编程; Abstract:Using the QuartusII software design a digital bell with the blocking method.The design takes theory drawing instead of Verilog language.After emluating and debuging successfully,translate and edit the code.Then,download the result to the programmable SmartSOPC system and test it in hardware.Realizing the soul of designing hardware by software. Keywords:QuartusII; digital bell; blocking method; VHDL; programmable; hardware目录设计内容简介3设计要求说明3方案论证(整体电路设计原理) 3各子模块设计理5分频模块: 5计数模块: 7 -校准模块程序实现:8 -秒计数模块程序实现:9 -分计数模块程序实现:10 -时计数模块程序实现:10整点报时模块: 12闹钟设定模块: 13 -闹钟调节模块程序实现:14 -输出信号选择模块程序实现:14彩铃模块: 15译码显示模块: 18万年历模块: 19 -日计数模块程序设计:20 -月计数模块程序设计:23 -年计数模块程序设计:23 -万年历波形仿真结果:25结论: 26实验感想: 26附图: 27 设计内容简介设计一个数字计时器,可以完成00:00:00到23:59:59的计时功能,并在控制电路的作用下具有保持、清零、快速校时、快速校分、快速较秒等功能。在设计的电路具有上述基本功能的前提下,我又进行了功能扩展:整点报时、闹钟设置、彩铃和万年历功能。(由于时间限制,万年历功能未经硬件测试,仅通过软件层面简单调试仿真)设计要求说明设计基本要求:1、能进行正常的时、分、秒计时功能;2、分别由六个数码管显示时分秒的计时;3、K1是系统的使能开关(K1=0正常工作,K1=1时钟保持不变);4、K2是系统的清零开关(K2=0正常工作,K2=1时钟的分、秒全清零);5、K3是系统的校分开关(K3=0正常工作,K3=1时可以快速校分);6、K4是系统的校时开关(K4=0正常工作,K4=1时可以快速校时);设计提高部分要求1、使时钟具有整点报时功能(当时钟计到5953”时开始报时,在5953”, 5955”,5957”时报时频率为512Hz,5959”时报时频率为1KHz);2、 闹表设定功能;方案论证(整体电路的工作原理)本实验在实现实验基本功能的基础上,加入了整点报时、闹钟设置、彩铃和万年历显示调节功能。整个电路由计数模块、分频模块、校时、校分较秒模块,清零模块、保持模块,整点报时模块,闹钟设定模块、彩铃模块,以及万年历模块构成。(如下图所示)基本功能:数字计时器基本功能是计时,因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为48MHZ,通过分频获得所需脉冲频率(1Hz,2Hz,4Hz,1KHz,500Hz,6MHz)。经过Verilog编程可以轻松获得较为精确的分频信号。 在计数模块中,秒位和分位分别通过编程用模60计数器实现,时位通过编程用模24计数器实现。校时、校分及校秒模块则通过语言选择实现。清零及保持功能在计数模块中用判断语句可轻松实现。计数模块总共输出6路信号:秒位的个、十位,分位的个、十位及时位的个、十位。整点报时:利用计数模块的输出作为报时模块的输入,当检测到5953”, 5955”,59 实验模块原理图57”时令报时模块的输出为500Hz,5959”时令报时模块的输出为1Kz.,驱动蜂鸣器产生不同的响声。闹钟设定模块:这里设计一个闹钟模块,输入为计数模块的输出及一系列调节信号,输出接到译码模块上。在闹钟模块内部,核心模块是一个选择模块,选择输出的信号是闹钟显示还是正常的计数显示。为了使闹钟模块与计数模块是相互独立的,因此单独设计模24(闹钟小时)和模60(闹钟分钟)作为选择模块的输入。设计程序语言的思想是,当检测到与设定闹钟相同的时、分位时就输出一个信号1,并保存当前计数位(加1)当检测到当前信号与保存位相同时输出信号恢复为0。(这个信号将作为闹铃结束的判断信号)彩铃模块:本程序选用了一段悠扬的梁祝音乐,该模块的输入分别为6MHz和4Hz,通过编程实现输出为符合音律的不同频率。程序实现的思想并不复杂,只要有乐谱可以实现各种不同的音乐输出。蜂鸣器何时鸣叫取决于闹钟模块的输出。译码显示模块:本模块没有采用Verilog语言实现,通过搭建原理图实现。显示功能是通过数选器、译码器、码转换器和7段显示管实现的。因为实验中只用一个译码显示单元,6个7段码(用于显示时分秒 ),所以通过1个24选4MUX和一个3-8译码器配合,显示译码器采用7447,根据计数器的信号进行数码管的动态显示。万年历模块:通过编程可以轻松实现,原理与上述计数模块,调节模块很是类似。由于未经硬件测试(时间限制),将在下面的子模块介绍中给出软件层面的实现和编译调试结果。各子模块设计原理本数字钟设计主要用Verilog语言实现,严格采用了模块化的程序设计思想,自顶向下逐步求精,模块之间高度独立。(仅译码显示模块采用原理图搭建)下面将分别介绍各主要子模块及其子模块以及算法语言的实现和部分波形仿真编译调试结果。分频模块:(clkout输出为1Hz,clkout1K输出为1Kz,clkout500输出为500Hz,clkout2输出为2Hz,clkout6M输出为6MHz,clkout4输出为4Hz.)module clkdiv(clk,clkout,clkout1k,clkout500,clkout2,clkout6M,clkout4);input clk;output clkout,clkout1k,clkout500,clkout2,clkout6M,clkout4;reg clkout,clkout1k,clkout500,clkout2,clkout6M,clkout4;reg 31:0cnt,cnm,cnn,cmm,caa,cbb;always(posedge clk) /产生1Hz信号begin if(cnt= 32d) begin clkout=1d1; cnt=cnt+32d1; end else if(cnt=32d) begin clkout=1b0; cnt=32d0; end else cnt=cnt+32d1;endalways(posedge clk) /产生1KHz信号begin if(cnm= 32d24000) begin clkout1k=1d1; cnm=cnm+32d1; end else if(cnm=32d48000) begin clkout1k=1b0; cnm=32d0; end else cnm=cnm+32d1;endalways(posedge clk) /产生500Hz信号begin if(cnn= 32d48000) begin clkout500=1d1; cnn=cnn+32d1; end else if(cnn=32d96000) begin clkout500=1b0; cnn=32d0; end else cnn=cnn+32d1;endalways(posedge clk) /产生2Hz信号begin if(cmm= 32d) begin clkout2=1d1; cmm=cmm+32d1; end else if(cmm=32d) begin clkout2=1b0; cmm=32d0; end else cmm=cmm+32d1;endalways(posedge clk) /产生6MHz信号begin if(caa= 32d4) begin clkout6M=1d1; caa=caa+32d1; end else if(caa=32d8) begin clkout6M=1b0; caa=32d0; end else caa=caa+32d1;endalways(posedge clk) /产生4Hz信号begin if(cbb= 32d) begin clkout4=1d1; cbb=cbb+32d1; end else if(cbb=32d) begin clkout4=1b0; cbb=32d0; end else cbb=cbb+32d1;endEndmodule除了6MHz可以通过波形图直接观察,其他分频在程序设计原理上都可以确定是正确的,通过硬件可以作一定的观察(或者对仿真时间设定作相应调整)。计数模块:计数模块中包含三个校准模块和三个计数模块(分别对应着秒分时)。(secondclka为秒脉冲输入信号1Hz,secondclkb为输入校准信号用频率2Hz,K5jiaomiao、K3jiaofen、K4jiaoshi分别为校秒、校分、校时输入信号,clkdff为D触发器输入信号(去开关抖动用),reset1K2为清零信号,start0K1为保持信号。输出分别对应秒分时的个位和十位) -校准模块程序实现:module xiaozhun( clka,clkb,cp,clko);input clka,clkb,cp; /正常进位信号频率、校准频率、校准使能信号output clko;reg clko; always begin if(!cp) clko=clka; else clko=clkb;endEndmodule-秒计数模块程序实现:module second(clk,reset,start,SL,SH,co);input clk; /输入计数时钟input reset,start;/清零信号、保持信号output co=1b0; /进位信号reg co;output3:0SL,SH;reg3:0SL,SH;reg7:0cnt;always(posedge clk or negedge reset)beginif( !reset) begin SL=4d0; SH=4d0; cnt=8d0; endelsebegin if(!start) beginif(cnt=8d59) begin cnt=8d0; SL=4d0; SH=4d0; co=1b1; endelse begin co=1b0; cnt=cnt+8d1; SL=cnt%10; SH=cnt/10; endendendendendmodule-分计数模块程序实现:module minute(clk,reset,start,ML,MH,co);input clk; /输入计数时钟input reset,start; /清零信号、保持信号output co=1b0; /进位信号reg co;output3:0ML,MH;reg3:0ML,MH;reg7:0cnt;always(posedge clk or negedge reset)beginif( !reset)beginML=4d0;MH=4d0;cnt=8d0;endelsebegin if(!start)beginif(cnt=8d59) begin cnt=8d0; ML=4d0; MH=4d0; co=1b1; endelse begin co=1b0; cnt =cnt+8d1; ML =cnt%10; MH =cnt/10; endendendendendmodule-时计数模块程序实现:module hour(clk,reset,start,HL,HH);input clk; /输入计数时钟input reset,start; /清零信号、保持信号output3:0HL,HH;reg3:0HL,HH;reg7:0cnt;always(posedge clk or negedge reset)beginif( !reset)beginHL=4d0;HH=4d0;cnt=8d0;endelsebegin if(!start)beginif(cnt=8d23) begin cnt=8d0; HL=4d0; HH=4d0; endelse begin cnt=cnt+8d1; HL=cnt%10; HH=cnt/10; endendendendEndmodule(计数秒脉冲设为48MHz时可以得到如下波形仿真,验证计数器功能基本正确)计数模块内部子模块的连接示意图如下所示,3个D触发器的作用分别为去除开关抖动。整点报时模块:(输入分别为秒位和分位以及报时所需的两种频率,输出为驱动蜂鸣器的频率)module baoshi(sl,sh,ml,mh,clk1k,clk500,clkbeep );input3:0 sl,sh,ml,mh;input clk1k,clk500;output clkbeep;reg clkbeep;always begin if(mh=8d5&ml=8d9&sh=8d5&sl=8d3) clkbeep=clk500; else if(mh=8d5&ml=8d9&sh=8d5&sl=8d5) clkbeep=clk500; else if(mh=8d5&ml=8d9&sh=8d5&sl=8d7) clkbeep=clk500; else if(mh=8d5&ml=8d9&sh=8d5&sl=8d9) clkbeep=clk1k; else clkbeep=0; endendmodule闹钟设定模块:闹钟设定模块中包含2个校准模块,1个模60计数模块,1个模24计数模块和1个输出信号选择模块。(其中计数模块与前面的类似,只是不含进位输出信号)闹钟调节模块程序实现:module tiaonao( clka,cp,clko);input clka,cp; /闹钟调节用频率、调节输入使能信号output clko;reg clko; always begin if(cp) clko=clka; else clko=0;endEndmodule模24计数模块和模60计数模块的程序源码不再给出(与前面的计数模块程序基本类似,只是不输出进位信号,无清零保持信号)输出信号选择模块程序实现:(sl,sh,ml,mh,hl,hh为正常计数输入信号,iml,imh,ihl,ihh为闹钟输入信号,slo,sho,mlo,mho,hlo,hho为输出信号接译码显示模块,k为显示闹钟或正常计数选择信号,km为响铃判断信号)module naozhxuan(sl,sh,ml,mh,hl,hh,iml,imh,ihl,ihh,slo,sho,mlo,mho,hlo,hho,k,km);input3:0sl,sh,ml,mh,hl,hh,iml,imh,ihl,ihh;input k;output3:0slo,sho,mlo,mho,hlo,hho;reg3:0slo,sho,mlo,mho,hlo,hho,xx;output km;reg km;initial beginkm=0;Endalwaysbeginif(!k)begin begin slo=sl; sho=sh; mlo=ml; mho=mh; hlo=hl; hho=hh; end if(mlo=iml)&(mho=imh)&(hlo=ihl)&(hho=ihh) begin xx=mlo; km=1; end else if(mlo=xx ) km=0;endelsebeginslo=4d8;sho=4d8;mlo=iml;mho=imh;hlo=ihl;hho=ihh;endendEndmodule彩铃模块:梁祝源码:(来自网络)module song(clk_6MHz,clk_4Hz,speaker,high,med,low);input clk_6MHz, clk_4Hz;output speaker;output3:0 high,med,low;reg3:0 high,med,low;reg13:0 divider,origin;reg7:0 counter;reg speaker;wire carry;assign carry=(divider=16383);always (posedge clk_6MHz)beginif(carry) divider=origin;else divider=divider+1;endalways (posedge carry)beginspeaker=speaker;endalways (posedge clk_4Hz) begincase(high,med,low)b1:origin=7281;b1:origin=8730;b0:origin=9565;b1:origin=10310;b0:origin=10647;b0:origin=11272;b0:origin=11831;b0:origin=12556;b0:origin=12974;b0:origin=13516;b0:origin=16383;endcase endalways (posedge clk_4Hz) beginif(counter=63) counter=0;else counter=counter+1;case(counter)0:high,med,low=b1;1:high,med,low=b1;2:high,med,low=b1;3:high,med,low=b1;4:high,med,low=b1;5:high,med,low=b1;6:high,med,low=b1;7:high,med,low=b0;8:high,med,low=b0;9:high,med,low=b0;10:high,med,low=b0;11:high,med,low=b0;12:high,med,low=b0;13:high,med,low=b0;14:high,med,low=b1;15:high,med,low=b1;16:high,med,low=b0;17:high,med,low=b0;18:high,med,low=b0;19:high,med,low=b0;20:high,med,low=b0;21:high,med,low=b0;22:high,med,low=b0;23:high,med,low=b0;24:high,med,low=b0;25:high,med,low=b0;26:high,med,low=b0;27:high,med,low=b0;28:high,med,low=b0;29:high,med,low=b0;30:high,med,low=b0;31:high,med,low=b0;32:high,med,low=b0;33:high,med,low=b0;34:high,med,low=b0;35:high,med,low=b0;36:high,med,low=b1;37:high,med,low=b1;38:high,med,low=b0;39:high,med,low=b0;40:high,med,low=b1;41:high,med,low=b1;42:high,med,low=b1;43:high,med,low=b0;44:high,med,low=b0;45:high,med,low=b0;46:high,med,low=b0;47:high,med,low=b0;48:high,med,low=b1;49:high,med,low=b1;50:high,med,low=b0;51:high,med,low=b0;52:high,med,low=b0;53:high,med,low=b1;54:high,med,low=b0;55:high,med,low=b0;56:high,med,low=b1;57:high,med,low=b1;58:high,med,low=b1;59:high,med,low=b1;60:high,med,low=b1;61:high,med,low=b1;62:high,med,low=b1;63:high,med,low=b1;endcaseendendmodule译码显示模块:显示电路主要由数据选择器24选4MUX、译码器74138、显示译码器7447和数码显示管组成。显示电路示意图如下:因为实验要求只用一个显示译码器7447,所以考虑用动态扫描显示法进行数据显示,即每次只显示一位,按照一定的显示时间间隔轮流显示。每个显示位均为四位二进制数,所以需要数选器,要显示的位有时分秒6位(HH,HL,MH,ML,SH,SL)。数选器的选择信号有三位,所以要用一个模8循环计数器作为数选器的地址选择端,供轮流选择带显示的数据,此外,还要用一个3-8译码器来选择数码管(DIG位)来显示对应的数据。(这部分功能实现未采用Verilog语言,原因是用原理图现成的模块搭建十分方便)显示电路方框图译码模块内部连接原理图:万年历模块:万年历实现程序设计思想:万年历显示一般为“”正好用到8个数码管。年、月、日分别对应3个模块。年月的输出除了连接译码显示外,还要输入到日的模块中,以供各种不同情形的进位判断(诸如大月、小月,平年闰年对应不同的日进位输出)。年月日的设定信号,初始化信号与前面的校分、清零信号实现原理基本类似。至于当前数码管的显示同样可以设计一个输出选择模块,选择当前显示(正常时分秒计数或闹钟设定界面或万年历显示界面),涉及开关不够用问题可通过对开关编码实现。日计数模块程序设计:module day(clk,reset,S1,S2,co,year,month);input15:0year,month;/年、月作为输入供日进位判断使用input clk; /每24小时的输出进位作为日的输入时钟input reset; /重置信号,恢复到“”output co=1b0; /进位信号reg co;output3:0S1,S2;reg3:0S1,S2;reg15:0cnt;always(posedge clk or negedge reset)beginif(!reset) begin S1=4d0; S2=4d1; cnt=16d1; endelse beginif(month=1)&(cnt=31)begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=3&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=4&cnt=30) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=5&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=6&cnt=30) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=7&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if (month=8&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=9&cnt=30) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=10&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=11&cnt=30) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=12&cnt=31) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=2&cnt=28&year/4) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else if(month=2&cnt=29&(!(year/4) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; end else begin co=1b0; cnt=cnt+16d1; S1=cnt/10%10; S2=cnt%10; endendendEndmodule月计数模块程序设计:module month(clk,reset,S1,S2,co,cnt);input clk;input reset;output co=1b0;output cnt;reg co;output3:0S1,S2;reg3:0S1,S2;reg15:0cnt;always(posedge clk or negedge reset)beginif( !reset) begin S1=4d0; S2=4d1; cnt=16d1; endelse beginif(cnt=8d12) begin cnt=16d1; S1=4d0; S2=4d1; co=1b1; endelse begin co=1b0; cnt=cnt+16d1; S1=cnt/10%10; S2=cnt%10; endendendEndmodule年计数模块程序设计:module year(clk,reset,S1,S2,S3,S4,cnt);input clk;input reset;output cnt;output3:0S1,S2,S3,S4;reg3:0S1,S2,S3,S4;reg15:0cnt;always(posedge clk or negedge reset)beginif( !reset) begin S1=4d2; S2=4d0; S3=4d0; S4=4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 前端技术面试题及答案
- 2025年中国合同法中的漏洞与改进
- 2025员工试用期合同协议书范本「标准版」
- 2025珠宝首饰购销合同范本
- 2025酒店管理租赁合同范本
- 婚内财产协议书范本(正式文本)
- 公告知识培训课件
- 搭建帐篷安全知识培训班课件
- 2025设备租赁合同补充协议范本
- 公司财务知识培训视课件
- 2025年事业单位考试公共基础知识考试试题及答案
- 医院科室主任年度目标责任书模板
- 2025年足球裁判三级试题及答案
- 2025年育儿补贴政策培训课件
- 干洗店试题及答案
- 2025年司机三力考试题库及答案
- 开利30HXY-HXC螺杆冷水机组开机、运行维护手册
- 盆底功能障碍问卷(PFDI20)
- 灭火器每月定期检查及记录(卡)表
- 关于推荐评审高级工程师专业技术职务的推荐意见报告
- Chewy电商企业案例研究报告
评论
0/150
提交评论