《数电课程设计基于FPGA的数字时钟的设计.docx》由会员分享,可在线阅读,更多相关《数电课程设计基于FPGA的数字时钟的设计.docx(23页珍藏版)》请在课桌文档上搜索。
1、基于FPGA的数字时钟的设计课题:基于FPGA的数字时钟的设计学院:电气信息工程学院专业:测量控制与仪器班级:08测控班姓名:潘志东学号:08314239合作者姓名:颜志林2010年12月12日综述近年来随着数字技术的迅速开展,各种中、大规模集成电路在数字系统、控制系统、信号处理等方面都得到了广泛的应用。这就迫切要求理工科大学生熟悉和掌握常用中、大规模集成电路功能及其在实际中的应用方法,除通过实验教学培养数字电路的根本实验方法、分析问题和故障检查方法以及双踪示波器等常用仪器使用方法等根本电路的根本实验技能外,还必须培养大学生工程设计和组织实验能力。本次课程设计的目的在于培养学生对根本电路的应用
2、和掌握,使学生在实验原理的指导下,初步具备根本电路的分析和设计能力,并掌握其应用方法;自行拟定实验步骤,检查和排除故障、分析和处理实验结果及撰写实验报告的能力。综合实验的设计目的是培养学生初步掌握小型数字系统的设计能力,包括选择设计方案,进行电路设计、安装、调试等环节,运用所学知识进行工程设计、提高实验技能的实践。数字电子钟是一种计时装置,它具有时、分、秒计时功能和显示时间功能;具有整点报时功能。本次设计我查阅了大量的文献资料,学到了很多关于数字电路方面的知识,并且更加稳固和掌握了课堂上所学的课本知识,使自己对数字电子技术有了更进一步的认识和了解。1、课题要求1.1 课程设计的性质与任务本课程
3、是电子与信息类专业的专业的专业根底必修课一一“数字电路”的配套实验课程。目的在于培养学生的理论联系实际,分析和解决问题的能力。通过本课程设计,使学生在理论设计、计算机仿真、指标调测、故障排除等方面得到进一步的训练,加强学生的实践能力。学生通过设计、仿真、调试、撰写设计报告等过程,培养学生的动手能力和严谨的工作作风。1.2 课程设计的根本技术要求1)根据课题要求,复习稳固数字电路有关专业根底知识;2)掌握数字电路的设计方法,特别是熟悉模块化的设计思想;3)掌握QUARTUS-2软件的使用方法;4)熟练掌握EDA工具的使用,特别是原理图输入,波形仿真,能对仿真波形进行分析;5)具备EDA技术根底,
4、能够熟练使用VHDL语言进行编程,掌握层次化设计方法;6)掌握多功能数字钟的工作原理,学会不同进制计数器及时钟控制电路的设计方法;7)能根据设计要求对设计电路进行仿真和测试;8)掌握将所设计软件下载到FPGA芯片的下载步骤等等。9)将硬件与软件连接起来,调试电路的功能。1.3 课程设计的功能要求根本功能:能进行正常的时、分、秒计时功能,分别由6个数码管显示24小时,60分钟,60秒钟的计数器显示。附加功能:1)能利用硬件局部按键实现“校时”“校分”“清零”功能;2)能利用蜂鸣器做整点报时:当计时到达5959时开始报时,鸣叫时间1秒钟;3)定时闹铃:本设计中设置的是在七点时进行闹钟功能,鸣叫过程
5、中,能够进行中断闹铃工作。本人工作:负责软件的编程与波形的仿真分析。2、方案设计与分析1.1 设计方案1、时钟功能,具有显示时、分、秒的功能;2、具有整点报时功能,在整点时使用蜂鸣器进行报时,具有闹钟功能,鸣叫过程中,具有中断闹铃功能。1.2 设计要点数字钟一般是由振荡器、分频器、计数器、译码器、显示器等几局部组成。这些都是数字电路中应用最广泛的根本电路,本设计分模块设计实现各局部功能,采用软件编程控制FPGA芯片内部产生振动周期为IS的脉冲。并将信号送入计数器进行计算,并把累加的结果以“时”、“分”、“秒”的数字显示出来。“秒”的显示由两级计数器和译码器组成的六十进制计数电路实现;“分”的显
6、示电路“秒”相同,“时”的显示由两级计数器和译码器组成的二十四进制电路来实现。所有计时结果由六位数码管显示。1.3 工作原理数字电子钟由振荡器、分频器计数器、译码显示、报时等电路组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示,计时出现误差时,可以用校时电路“校时”“校分”“清零二秒脉冲可以通过分频电路得到。通过报时设计模块可以实现整点报时及定时闹铃,译码显示由七段译码器完成,显示由数码管
7、构成,采用的是动态显示方式。数码管动态显示:动态扫描电路将计数器输出的8421BGD码转换为数码管需要的逻辑状态,并且输出数码管的片选信号和为选信号。所谓动态扫描显示方式是在显示某一位LED显示块的数据的时候,让其它位不显示,然后再显示下一位的数据。只要保证每一位显示的时间间隔不要太大,利用人眼的视觉暂留的现象,就可以造成各位数据同时显示的假象。一般每一位的显示时间为10mso3、单元电路的设计,仿真与分析(1)分频模块(fenpin1)程序:libraryieee;useieee.stdlogic1164.all;entityfenpinisport(clk6:instd_logic;ql0
8、00,q5,ql:outstd_logic);endfenpin;architecturecccarcoffenpinissignalx:stdlogic;beginprocess(clk6)variableent:integerrange0to24999;beginifclk6,eventandclk6三,1,thenifcnt24999thenent:=cnt+l;elseent:=0;x=notx;endif;endif;endprocess;ql000=x;process(x)variablecnt2:integerrange0to999;variabley:std_logic;beg
9、inif,eventandx=,thenifcnt2999thencnt2:=Cnt2+1;ql=0;elseCnt2:=0;ql=T;endif;endif;if,eventandx=itheny:=noty;endif;q5=y;endprocess;endccc_arc;2)仿真波形:3)仿真结果分析:产生用于计时,扫描输入,扫描显示,以及蜂鸣器所需的各个频率的信号。2秒模块(second1)程序:libraryieee;useieee.stdlogic1164.all;useieee.stdlogicunsigned,all;entitysecondisport(clkl,enl:in
10、stdlogic;qa:outstd_lOgiC_vector(3downtoO);col:outstdlogic;qb:outstd_logic_vector(3downto0);endsecond;architectureccofsecondissignalcout2,coutl:std_logic_vector(3downto0);signalmm:std_logic;beginprocess(clkl,enl)beginifenl三,thencout2=zz0000zz;coutK=zzOOOOzz;elsif(clkeventandclkl三,)thenif(cout2=5andco
11、ut1=8)thencout2=cout2coutl=coutll;mm=,;elsif(cout2=5andcoutl=9)thencout2=z,0000z;cout1=,0000;mm=0;elseif(cout1=9)thencout2=cout2+l;coutK=zzOOOOzz;mm=,0,;elsecout2=cout2;coutl=cout1+1;mm=,0,;endif;endif;endif;endprocess;col-mm;qa=cout2;qb=coutl;endcc;2)仿真波形:MasterTimeBar:11.975ns史Poi二WS一EndTJ TJ TJ T
12、J TJ TJ TJ TJ 4 0 1 2 3 0 1 2 3 k 1 1 L L L L L L L L 1 O nAAa a Abbbbb C Ceq QqqqqqqqqVlu211.98n,BOBOBOUOBOBOBOBOUOBOBOBOBO3)仿真结果分析:该模块实际是一个六十进制计数器,而六十秒为一分钟,故用此模块可以作为秒局部设计,通过观察可知,仿真波形是正确可行的。3分模块(minute)1)程序:libraryieee;useieee.stdlogic1164.all;useieee.stdlogicunsigned,all;entityminuteisport(clk2,en
13、2:instdlogic;qc:outstd_logic_vector(3downto0);co2:outstdlogic;qd:outstd_logicvector(3downto0);endminute;architecturebbofminuteissignalcout2,coutl:std_logic_vector(3downto0);signalcc:stdlogic;beginprocess(clk2,en2)beginifen2=*thenif(clk2,eventandclk2,)thenif(cout2=5andcoutl=8)thencout2=cout2;coutl=co
14、utl+l;cc=,;elsif(cout2=5andcoutl=9)thenCOUt2=0000;COUtl=0000”;cc=0;elseif(coutl=9)thencout2=cout2+l;coutl=z/OOOOz,;cc=,0,;elsecout2=cout2;coutl=cout1+1;cc=,0,;endif;endif;endif;endif;endprocess;co2=cc;qc=cout2;qd=coutl;endbb2)仿真波形:MasterTimeBar:11.975ns则脸自2238USinterval:Sta化clk2co2ext2qcqc0QC1qc2qc3
15、qdqdOqdlqd2qd317.85US58.00us68.甲US78.甲us88.8JUS11ju三三mR11三uuum三三11Jumrmmmm三三w,门:-:1:njrmnrmrLLLmmrLnrLrmrL1.rn111FnrnEL111IIIIIIIIILnnnr3)仿真结果分析:此模块实际也是一个六十进制的计数器模块,六十分钟即为一个小时,用此模块就成功解决了分设计模块这个难题。从仿真波形可知,该设计时正确的。4时模块(hour)1)程序:libraryieee;useieee.stdlogic1164.all;useieee.stdlogicunsigned,all;entityh
16、ourisport(clk3,en3:instdlogic;qe:outstd_logicvector(3downto0);qf:outstd_logic_vector(3downto0);endhour;architectureaaofhourissignalcout2,coutl:std_logic_vector(3downto0);beginprocess(clk3,en3)beginifen3,1,thenif(clk3,eventandclk3,)thenif(cout2=2andcoutl=3)thenCOUt20OoO0;COUtl=0000”;elseif(coutl=9)th
17、encout2=cout2+ljcoutl=,zOOOOz,;elsecout2=cout2IcoutK=COUt1+1;endif;endif;endif;endif;endprocess;qe-cout2;qf=coutl;endaa;2)仿真波形:3)仿真结果分析:这是一个24计数器,用来表示24小时,通过波形可知,程序设计正确,正常计时是每次清零后从00:00:00开始计时的,假设要从预置时间开始,可以通过“校时”“校分”“清零”三个按键调整时间。5数码显示驱动模块1)程序:libraryieee;useieee.stdlogic1164.all;useieee.stdlogicuns
18、igned,al1;entityhhhisport(nl,112,n3,n4,n5,116:instdlogicvector(3downto0);a:instdlogicvector(2downto0);qqq:outstdIogijVeCtOr(3downto0);endhhh;architectureddofhhhisbeginwithaselectqqq=nlwhen000,n2when001,n3when010,n4whenn5when100,n6when101,zz0000,zwhenothers;enddd;2)仿真波形:片选模块(sell)1)程序:libraryieee;use
19、ieee.stdlogic1164.all;useieee.stdlogicunsigned,al1;entitygggisport(m:instdIogiCVeCtOr(2downto0);b:outstd_logic_vector(5downto0);endggg;architectureeeofgggisbeginwithmselectb=100000when000,zz010000z,whenzz00z,z,001000z,whenzzoozz,“000100whenzzoz;z,000010z,whenzzoozz,ooooorwhenzz101z,oooooo,zwhenother
20、s;endee;3)仿真结果分析:设置时间时将所需的数据传给显示模块,当设置闹铃时将数据传给闹钟和显不模块O(7)译码显示模块(display)1)程序:libraryieee;useieee.stdlogicll64.all;useieee.stdlogicunsigned,all;entitydecoderisport(x:instdlogicvector(3downto0);y:outstd_logic_vector(6downto0);enddecoder;architectureoneofdecoderisbeginwithxselecty二Illlll0whenz,ooooz,zz
21、0110000zzwhenz,ooorzz,110110zwhenz,ooozz111100zwhenzz001zOI100IIzzwhenz,0100zzz,101101zwhenz,oor;yzIOlllllzzwhenz,oozz,1110000zzwhenzz0111lllllllzzwhenzzooozz,“1111011whenzzoo,ooooooo,zwhenothers;endone;8报时模块(alart)1)程序:libraryieee;useieee.stdlogic1164.all;entitysstisport(hl,h,ml,m,si,s:instdlogicve
22、ctor(3downto0);clk4:instd_logic;q500:outstdlogic);endsst;architecturesssofsstisbeginprocess(clk4,ml,m,si,s)beginif(clk4,eventandclk4三,)thenif(hl=z,0000z,andh0=0111andml=zz0000zzandInO=0000”)or(ml=zz0101z,andm0=1001andsl=0101ands0=1001)thenq500=1,;elseq500三,0,;endif;endif;endprocess;endsss;2)仿真波形:clM
23、 h国hl m国ml0 SO siq5Master Time Bar:11.975ns Pointer 2.12us Interval:2.11 us Start:End3)仿真结果分析:通过观察波形可知,当时钟时间与整点或闹铃预设时间相同时,给出一个脉冲信号,使蜂鸣器鸣叫,实现整点报时和定时闹铃功能。9六进制计数器模块(cnt6)1)程序:libraryieee;useieee.stdlogic1164.all;useieee.stdlogicunsigned,al1;entitycnt6isport(clk5:instd_logic;1) outstdlogicvector(2downto
24、0);endcnt6;architecturebehavofcnt6issignalql:stdlogicvector(2downto0);beginprocess(clk5)beginifclk5,eventandCIk5=1,thenifql5thenql=ql+l;elseql,0,);endif;endif;endprocess;nPointer:89.05usInterval:89.04u$Start:EndNameValueat11.98n三)ps20.48us40.96us61.44us81.9,2ux11.975nsJ-LL11JnJiJnjL11JLLmJTrLrLrLnL1
25、.clk5B0JSnU0O)Cl2345o1X2X3X4X5:X0X12345o13)仿真结果分析:很明显可以看出这是一个简单的六进制计数器。它与3-6译码器配合作用产生片选信号。10两输入与模块(and2a1)程序:libraryieee;useieee.stdlogic1164.all;entityandaisport(al,bl:instdlogic;y:outstd_logic);endanda;architectureanofandaisbeginy=alandbl;endan;11两输入或模块(2a)1)程序:libraryieee;useieee.stdlogic1164.all
26、;entityor_lisport(al,bl:instdlogic;y:outstd_logic);endor_l;architectureooofor_lisbeginyclk,ql-h,qlOOO=z);u2:secondportmap(clkl=h,enl=sc,qa=k,qb=l,col=I);uO:or1portmap(al=i,bl=sb,y-a);u3:minuteportmap(clk2=h,en2=a,qc=e,qd=f,co2=j);u30:andaportmap(al=i,bl=j,y-b);u31:or_lportmap(al=b,bl=sa,y=c);u4:hour
27、portmap(clk3=h,en3=c,qe=u,qf=v);u5:sstportmap(hl=u,h=v,ml=e,m=f,sl=k,s=l,clk4=h,q500=ql);u6:hhhportmap(nl=k,112=1,n3=e,n4=f,n5=u,n6=v,qqq=t,a=s);u7:gggportmap(b=r,m=s);u8:cnt6portmap(n=s,clk5=z);u9:decoderportmap(x=t,y-q);endarchitecturemain;3) 仿真波形:并与硬件局部对应连接好,可以验证到我们所预期的所有功能,故可知该顶层文件是正确的,每一个模块的功能也
28、都是正确的,模块之间的连接也都是正确的。在软件调试仿真过程中,我们以参考资料上的程序为模板,依据个人的需要添加修改各个功能模块,尽管有模板作为参考,仿真过程中还是出了很多的问题,例如在做数码管动态显示中,我们采用了NPN型9013晶体三极管作为数码管的接地驱动,这里的片选信号应该是高电平有效,我们原程序是低电平,经过屡次的和其他组的学习交流中,找到了这个错误。解决分频问题中,我们也在分频模块中做了修改,得到我们所需要的频率。5、硬件电路设计与安装电路(1)按照电路功能设计好硬件局部安装图(电路安装图详见末页图b);(2)焊接前应先排好线,再焊接电路,注意不能飞线,可正反穿线焊接;(3)焊接过程
29、中注意各引脚的功能,不能接错;(4)焊接完后需要仔细检查前方能通电,电源电压为5V。所需元器件清单元器件规格数量元器件规格数量电阻1K11开关单刀双置4电阻20018杜邦线假设干三极管90136插针50数码管共阴6导线假设干万能板1蜂鸣器16、硬件电路安装与调试1)借助杜邦线将芯片与所焊接硬件电路根据之前锁定好的引脚连接好,在本设计中,各引脚锁定情况是:elk:17,qq6分别对应芯片引脚:65,63,59,57,53,51,47;rr5分别对应芯片引脚:42,40,31,28,26,24,;sa,sb,sc分别对应芯片引脚:80,86,92;ql对应芯片引脚:44,qOq6对应数码管的a,b
30、,c,d,e,f,g;r指片选信号的六个输出;sa、sb、SC对应校时电路的“校时”“校分”“清零”三个按键;ql指报时电路输出,当其为高电平时,蜂鸣器鸣叫;增加一个插针用来与蜂鸣器相连,用来实现中断闹铃的功能。2)硬件与软件两局部正确连接之后,接上5伏的电源,仔细观看数码管的显示情况,在验证功能的过程中,并不是一帆风顺的,经过很屡次的修改和改进,最后才获得满意的成果。7、调试结果调试结果:芯片与硬件电路连接好通电后,六个数码管可以正常显示时、分、秒;硬件局部电路板上的3个按键也分别能实现“清零”“校分”“校时”功能;将时间调至59分59秒时蜂鸣器开始鸣叫,鸣叫时间为1秒钟,即实现了整点报时功
31、能;将时间调至七点时蜂鸣器开始鸣叫,鸣叫时,我们也可以进行中断闹铃动作。8、收获与体会经过这次的数字电路课程设计,我个人得到了不少的收获,一方面加深了我对课本理论的认识,另一方面也提高了实验操作能力。现在我总结了以下的体会和经验。这次的课程设计跟我们以前做的不同,因为我觉得这次我是真真正正的自己亲自去完成。所以是我觉得这次实验最珍贵,最深刻的。就是设计的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂一个电路的原理。在这里我深深体会到哲学上理论对实践的指导作用:弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。我们做实验绝对不能人云亦
32、云,要有自己的看法,这样我们就要有充分的准备,假设是做了也不知道是个什么实验,那么做了也是白做。实验总是与课本知识相关的,有了课本的知识,我们才能编写出自己需要的程序,实现自己预期的功能。我们做实验不要一成不变和墨守成规,应该有改进创新的精神。实际上,在弄懂了实验原理的根底上,我们的时间是充分的,做实验应该是游刃有余的,如果说创新对于我们来说是件难事,那改进总是有可能的。数字时钟大体看上去很简单,但其中的可变的地方还是有很多的,譬如说整点报时功能,报时持续的时间长短就是一个可变的地方。在实验的过程中我们要培养自己的独立分析问题,和解决问题的能力。在编程过程中,我们也遇到了很多的问题,就之前提到
33、的动态扫描驱动问题,如果一味的去遵循资料上的程序的话,那整个设计将会失败,只有不断的学习研究,才能解决问题。这次的课程设计,我的收获很多,就我本身来说,不但对理论知识有了更加深的理解,对于实际的操作和也有了质的飞跃。经过这次的实验,我们整体对各个方面都得到了不少的提高,团队的合作意识也增强了很多。9、课题扩展对于数字时钟的设计,在定时闹钟的环节,我们可以掺入睡眠延时功能,利用N进制计数器,在闹铃鸣叫时,通过按键给计数器一个脉冲,使计数器进入计时状态,具体的延时时长由计数器的进制决定。参考资料:付家才.EDA工程实践技术.化学工业出版社.2004年12月陈忠平.基于QUartUSIl的FPGA/CPLD设计与实践.北京电子工业出版社.2010年4月