集成电路软件设计基于VHDL的数字电子钟系统设计学院信息工程学院班级电科1112姓名闭应明学号2011850057成绩指导老师卫雅芬2013年12月10日目录一、摘要...............................................................1二、关键词.............................................错误!未定义书签。三、引言................................................错误!未定义书签。四、设计要求...........................................错误!未定义书签。五、技术指标..........................................................1六、设计思想..........................................................1七、设计原理..........................................................2八、设计方案..........................................................2九、设计各个模块的功能...............................................3十、各个模块的波形仿真结果..........................................1十一、各个电路模块的DV综合的网标和电路模型.................................................12十二、设计结果分析..................................................19十三、论文结论.......................................................20十四、参考文献.......................................................20十五、附录...........................................................21十六、致谢.............................................................50第1页共52页一、摘要:本设计采用层次化设计方法,自顶向下进行设计。设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过ModelSimSE6.1完成综合、仿真。二、关键词:ModelsimVHDL硬件描述语言设计数字钟三、引言:硬件描述语言HDL(HardwareDescriptionLanguage)是一种用形式化方法来描述数字电路和系统的语言。目前.电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,VHDL在这种形势下显示出了巨大的优势,展望将来VHDL在硬件设计领域的地位将与c语言和c++在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。本文提出了以VHDL语言为手段,设计了多功能数字钟。其代码具有良好的可读性和易理解性,源程序经Altera公司的ModelSimSE6.1软件完成综合、仿真,四、设计要求:1、采用自顶向下的设计思想;2、使用本学期学习的设计语言VHDL和集成电路设计软件实现;3、最终以论文形式提交。五、技术指标:1、设计数字电子钟的基本功能有:年、月、日、时、分、秒,其中,月日为阳历显示,时为24小时制显示;可随时进行时间校对(60分);2、闰年提醒(10分)、支持闹铃功能(10分);3、阳历转阴历与阴历显示(20分)。备注:用硬件描述语言VHDL设计系统,用Modelsim软件仿真,用Designcompiler软件或Synplify软件综合成电路网表。六、设计思想:这次课题论文要求设计显示年月日时分秒、阳历转阴历的数字电子钟,且能可随时进行时间校对和支持闹铃功能以及闰年提醒功能。本次课题基于VHDL语言,并用采用自顶向下的设计思想,即层次化设计思想并使用例化语句编写,很容易想到分模块设计,先写second、minute、hour、day、month、year、clock第2页共52页模块,然后将各个模块用顶层模块连接起来,再编写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个模块。每个模块主要使用VHDL语言输入中常用的进程语句、元件例化语句、if语句以及赋值语句来编写VHDL代码。八、设计方案图1第3页共52页九、设计各个模块的功能:1.second计时模块:beginprocess(clks,sets,ss)beginifsets='1'thenifss=0thenqs=qs;elseqs=ss;endif;elsif(clks'eventandclks='1')thenif(qs=59)thenqs=0;clk1='1';elsifqs59thenqs=qs+1;clk1='0';endif;endif;endprocess;当clk上升沿来临时,second模块开始从0计数到59,并输出一个控制信号clk1控制minute模块,此时clk1=1,并回到0然后循环计数,此时clk1=0。当需要设置时间时,即sets=‘1’,则把预定好的初值ss赋给输出信号qs。2、minute模块beginprocess(clkmn,setmn,mns)beginifsetmn='1'thenifmns=0thenqmn=qmn;elseqmn=mns;endif;elsif(clkmn'eventandclkmn='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。第4页共52页3、Hour计时模块:beginprocess(clk)beginif(clk'eventandclk='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='1'thenifds=0thenqd=qd;elseqd=ds;endif;elsif(clkd'eventandclkd='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';第5页共52页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(clk'eventandclk='1')thenif(q=12)thenq=1;clk3='1';elsifq12thenq=q+1;clk3='0';endif;第6页共52页endif;endprocess;当上一个