资源预览内容
第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
第9页 / 共57页
第10页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
集成电路软件设计基于VHDL勺数字电子钟系统设计学院信息工程学院班级电科1112姓名学号成绩指导老师2013年12月10日目录一、摘要1二、关键词三、引言四、设计要求五、技术指标1六、设计思想1七、设计原理2八、设计方案2九、设计各个模块的功能3十、各个模块的波形仿真结果1十一、各个电路模块的DV综合的网标型12十二、设计结果分析19十三、论文结论20十四、参考文献20十五、附录21错 误 ! 未定义书签。错 误 ! 未定义书签。错 误 ! 未定义书签。和电路模十六、致谢50一、摘要:本设计采用层次化设计方法,自顶向下进行设计。设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过ModelSimSE6.1完成综合、仿真。二、关键词:ModelsimVHDL硬件描述语言设计数字钟三、引言:硬件描述语言HDL(HardwareDescriptionLanguage)是一种用形式化方法来描述数字电路和系统的语言。目前电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,VHD在这种形势下显示出了巨大的优势,展望将来VHD在硬件设计领域的地位将与c语言和C+在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。本文提出了以VHD语言为手段,设计了多功能数字钟。其代码具有良好的可读性和易理解性,源程序经Altera公司的ModelSimSE61软件完成综合、仿真,四、设计要求:1、采用自顶向下的设计思想;2、使用本学期学习的设计语言VHDU口集成电路设计软件实现;3、最终以论文形式提交。五、技术指标:1、设计数字电子钟的基本功能有:年、月、日、时、分、秒,其中,月日为阳历显示,时为24小时制显示;可随时进行时间校对(60分);2、闰年提醒(10分)、支持闹铃功能(10分);3、阳历转阴历与阴历显示(20分)。备注:用硬件描述语言VHD段计系统,用Modelsim软件仿真,用Designcompiler软件或Synplify软件综合成电路网表。六、设计思想:这次课题论文要求设计显示年月日时分秒、阳历转阴历的数字电子钟,且能可随时进行时间校对和支持闹铃功能以及闰年提醒功能。本次课题基于VHDLS言,并用采用自顶向下的设计思想,即层次化设计思想并使用例化语句编写,很容易想到分模块设计,先写second、minute、hour、day、month、year、clock模块,然后将各个模块用顶层模块连接起来,再编写testbench激励信号,然后仿真波形。可以通过比较的方法设计闹铃及利用“set”控制信号设计时钟校对。七、设计原理:本次实验的电子数字钟的设计采用异步计时的方式,即各个时间模块每一个轮回后,输出一个高电平作为紧接下一个的时间模块的时钟信号;校正设置时间是通过set端控制,即如果为高电平时,就把预定好的时间参数(sset、mnset、hset、dset、mset、yset)作为要设置的时间,同时也通过此办法来校正时间的参数;闹铃时间控制是通过alarm端控制,即作为高电平时,把预定好的时间参数(salarm、mnalarm、halarm、dalarm、malarm、yalarm)作为闹铃的时间参数预制;闹铃功能实现是通过一个比较器,即当前的电子钟时间和预定的时间是否一致,如果一致,闹铃ring输出1,否则为0,同时也可以作为闰年的提醒功能。按照设计内容和要求以及所有的设计思路与原理,综合考虑后,采用例化语句方法,设计模块化的结构:顶层设计实体为electronic_clock(数字钟)模块,具下又分为:years(年)、month(月)、day(日)、hour(时)、minute(分)、second(秒)、alarm_clock(闹钟)7个模块。每个模块主要使用VUDLEHHIl入中常用的进程语句、元件例化语句、if语句以及赋值语句来编写VHDL弋码。八、设计方案图1九、设计各个模块的功能1.second计时模块:beginprocess(clks,sets,ss)beginifsets=1thenifss=0thenqs=qs;elseqs=ss;endif;elsif(clkseventandclks=1)thenif(qs=59)thenqs=0;clk1=1;elsifqs59thenqs=qs+1;clk1=0;endif;endif;endprocess;当clk上升沿来临时,second模块开始从0计数到59,并输出一个控制信号clkl控制minute模块,此时clk1=1,并回到0然后循环计数,此时clk1=0。当需要设置时间时,即sets=1,则把预定好的初值ss赋给输出信号qs。2、 minute模块beginprocess(clkmn,setmn,mns)beginifsetmn=1thenifmns=0thenqmn=qmn;elseqmn=mns;endif;elsif(clkmneventandclkmn=1)thenif(qmn=59)thenqmn=0;clk2=1;elsifqmn59thenqmn=qmn+1;clk2=0;endif;当clk上升沿来临时,minute模块开始从0计数到59,并输出一个控制信号clk1控制minute模块,此时clk1=1,并回到0然后循环计数,此时clk1=0当需要设置时间时,即setmn=1,则把预定好的初值ss赋给中间信号qmn。第#页共52页3、 Hour计时模块:beginprocess(clk)beginif(clkeventandclk=1)thenif(q=23)thenq=0;clk1=1;elsifq23thenq=q+1;clk1=0;endif;endif;endprocess;当clk上升沿来临时,hour模块开始从0计数到23,并输出一个控制信号clk1控制day模块,此时clk1=1,并回到0然后循环计数,此时clk1=0。由于要求初始时间为14,我们可以利用“signalq:integer:=14;”赋初始值,这样计数器就会从14开始计数。4、 Day计时模块:ifsetd=1thenifds=0thenqd=qd;elseqd=ds;endif;elsif(clkdeventandclkd=1)thenif(yearinrem4=0)thenif(monthin=1)or(monthin=3)or(monthin=5)or(monthin=7)or(monthin=8)or(monthin=10)or(monthin=12)then?if(qd=31)thenqd=1;clk2=1;elsifqd31thenqd=qd+1;clk2=0;endif;elsif(monthin=2)thenif(qd=29)thenqd=1;clk2=1;elsifqd29thenqd=qd+1;clk2=0;endif;elsif(monthin=4)or(monthin=6)or(monthin=9)or(monthin=11)thenif(qd=30)thenqd=1;clk2=1;elsifqd30thenqd=qd+1;clk2=0;endif;endif;elsif(monthin=1)or(monthin=3)or(monthin=5)or(monthin=7)or(monthin=8)or(monthin=10)or(monthin=12)thenif(qd=31)thenqd=1;clk2=1;elsifqd31thenqd=qd+1;clk2=0;endif;elsifmonthin=2thenif(qd=28)thenqd=1;clk2=1;elsifqd28thenqd=qd+1;clk2=0;endif;elsif(monthin=4)or(monthin=6)or(monthin=9)or(monthin=11)thenif(qd=30)thenqd=1;clk2=1;elsifqd30thenqd=qd+1;clk2=0;endif;endif;endif;当上一个模块的时钟信号来临时,如果是闰年,并且是1、3、5、7、8、10、12、月,day模块开始则从1计数到31,而如果是2月,则day模块开始计时从1计数到29,如果其他月份时,则计数从1到30,之后并输出一个控制信号clk2控制month模块,此时clk2=1,计数到最大值时都会回到1然后循环计数,此时clk2=0。如果是非闰年,并且是1、3、5、7、8、10、12、月,day模块开始则从1计数到31,而如果是2月,则day模块开始计时从1计数到29,如果其他月份时,则计数从1到30,之后并输出一个控制信号clk2控制month模块,此时clk2=1,计数到最大值时都会回到1然后循环计数,此时clk2=0。如果要设置初值,则令setd=1,然后再设置想要数值ds。5、 Month计时模块:beginprocess(clk)beginif(clkeventandclk=1)thenif(q=12)thenq=1;clk3=1;elsifq12thenq=q+1;clk3=0;第 # 页 共 52 页endif;endif;endprocess;当上一个模块的控制信号来临时,month模块开始从1计数到12,并输出一个控制信号clk3控制year模块,此时clk3=1,并回到1然后循环计数,此时clk3=06、 Years计时模块:beginprocess(clk)beginif(clkeventandclk=1)thenq=q+1;endif;endprocess;当上一个模块的控制信号来临时,year模块开始从0计数并一直计数下去,由于要求初始时间为2012,我们可以利用“signalq:integer:=2012;”赋初始值,这样计数器就会从2012开始计数。7、 Alarm_clock闹钟比较模块:beginprocess(s2a,mn2a,h2a,d2a,m2a,y2a,s1a,mn1a,h1a,d1a,m1a,y1a,run)beginif(runrem4=0)thenring=1;elsif(s1a=s2aandmn1a=mn2aandh1a=h2aandd1a=d2aandm1a=m2aandy1a=y2a)then
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号