1、 目录一、摘要1二、关键词1三、引言1四、设计要求1五、技术指标1六、设计思想1七、设计原理2八、设计方案2九、设计各个模块的功能2十、各个模块的波形仿真结果5十一、各个电路模块的DV综合的网标和电路模型9十二、设计结果分析15十三、论文结论16十四、参考文献16十五、附录17一、摘要: 本设计采用层次化设计方法,自顶向下进行设计。设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过ModelSim SE 6.1完成综合、仿真。二、关键词: Models
2、im VHDL 硬件描述语言 设计 数字钟 三、引言: 硬件描述语言HDL(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言。目前电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,VHDL在这种形势下显示出了巨大的优势,展望将来VHDL在硬件设计领域的地位将与c语言和c+在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。本文提出了以VHDL语言为手段,设计了多功能数字钟。其代码具有良好的可
3、读性和易理解性,源程序经Altera公司的ModelSimSE 61软件完成综合、仿真,四、设计要求:1、采用自顶向下的设计思想;2、使用本学期学习的设计语言VHDL和集成电路设计软件实现;五、技术指标:1、设计数字电子钟的基本功能:年、月、日、时以24小时制显示,月日为阳历显示,起始时间为:2012年11月26日14:00;2、可随时进行时间校对;3、支持闹铃功能。六、设计思想: 本课程设计要求我们设计的数字电子钟的基本功能可以年、月、日、时以24小时制显示,月日为阳历显示,起始时间为:2012年11月26日14:00,且能可随时进行时间校对和支持闹铃功能,并用采用自顶向下的设计思想,即层次
4、化设计思想并使用例化语句编写,很容易想到分模块设计,将各个模块用顶层模块连接起来,再编写testbench激励信号,然后仿真波形。在时模块中把初始值设定为14,日模块中初始值设定为26,在月模块中初始值设定为11,在年模块中设定初始值为2012。可以通过比较的方法设计闹铃及利用“set”控制信号设计时钟校对。七、设计原理: 本课程设计的主要原理就是利用计数器进行计数。首先是小时模块利用24进制计数器,由于设计要求,先将计数器的初始值设定为14,然后当时钟信号“clk”的上升沿来临时,计数器开始计数到23后回到0循环计数,与此同时定义一个控制信号给日计数模块。日模块就由初始值26开始计数到30后
5、回到1循环计数,并再定义一个控制信号给月模块,以此类推,再将各个模块用顶层模块连接起来,就可以实现年、月、日、时计数功能了。时间校队就用到控制信号“set”,定义一个输入信号,比如时就是“hb”。当“set=1”时,就进行时间设置,其他模块与时模块相同。当“set=0”时就设置完毕,数字就从设置的时间开始计时。闹铃功能就用另一个控制信号“alarm”,当“alarm=1时,就进行闹铃时间设置,其他模块与时模块相同。当“alarm=0时,就设置完毕,并且闹铃时间与数字钟时间进行比较,当各个模块的时间都相等时,“ring”输出1,既闹钟响起。 八、设计方案: 按照设计内容和要求以及所有的设计思路与
6、原理,综合考虑后,采用例化语句方法,设计模块化的结构:顶层设计实体为electronic_clock(数字钟)模块,其下又分为:years(年)、month(月)、day(日)、hour(时)、alarm_clock(闹钟)五个模块。每个模块主要使用VHDL语言输入中常用的进程语句、元件例化语句、if语句以及赋值语句来编写VHDL代码。九、设计各个模块的功能:1、Hour计时模块:begin process(clk) beginif(clkevent and clk=1) then if(q=23) then q=0;clk1=1; elsif q23 then q=q+1; clk1=0;
7、end if;end if;end process;当clk上升沿来临时,hour模块开始从0计数到23,并输出一个控制信号clk1控制day模块,此时clk1=1 ,并回到0然后循环计数,此时clk1=0。由于要求初始时间为14,我们可以利用“signal q:integer:=14;”赋初始值,这样计数器就会从14开始计数。2、Day计时模块:begin process(clk) beginif(clkevent and clk=1) then if(q=30) then q=1; clk2=1; elsif q30 then q=q+1; clk2=0; end if;end if;en
8、d process;当上一个模块的控制信号来临时,day模块开始从1计数到30,并输出一个控制信号clk2控制month模块,此时clk2=1 ,并回到1然后循环计数,此时clk2=0。由于要求初始时间为26,我们可以利用“signal q:integer:=26;”赋初始值,这样计数器就会从26开始计数。3、Month计时模块:begin process(clk) beginif(clkevent and clk=1) then if(q=12) then q=1; clk3=1; elsif q12 then q=q+1; clk3=0; end if;end if;end process
9、;当上一个模块的控制信号来临时,month模块开始从1计数到12,并输出一个控制信号clk3控制year模块,此时clk3=1 ,并回到1然后循环计数,此时clk3=0。由于要求初始时间为11,我们可以利用“signal q:integer:=11;”赋初始值,这样计数器就会从11开始计数。4、Years计时模块:begin process(clk) beginif(clkevent and clk=1) then q=q+1; end if;end process;当上一个模块的控制信号来临时,year模块开始从0计数并一直计数下去,由于要求初始时间为2012,我们可以利用“signal q
10、:integer:=2012;”赋初始值,这样计数器就会从2012开始计数。5、Alarm_clock闹钟比较模块:entity alarm_clock isport( h1a: in integer; d1a: in integer; m1a: in integer; y1a: in integer; h2a: in integer; d2a: in integer; m2a: in integer; y2a: in integer; ring: out std_logic );end alarm_clock;architecture one of alarm_clock is beginp
11、rocess(h2a,d2a,m2a,y2a,h1a,d1a,m1a,y1a)beginif (h1a=h2a and d1a=d2a and m1a=m2a and y1a=y2a) then ring=1;else ring=0;end if;end process;end;定义八个输入信号和一个输出信号ring用于当前时间与闹铃时间进行比较,当两者相等时,就输出ring=1,既满足了闹铃功能。 6、Set时间校对模块:process(set,hs) 这是小时模块的set,其他计时模块与其相同 begin if set=1then if hs=0 then qh=qh ; else qh=
12、hs; end if; end if;“hs”即为你要设置的时间,当set=1时 就把“hs”上的值赋给“h”,然后“h”就从你设置的时间开始计时,就实现了时间设置功能。(以上只是各个模块的一小段VHDL程序,详细的程序请看附录。)十、各个模块的波形仿真结果:1、时钟初始值:初始时间为2012-11-26-14。2、Hour模块:3、Day模块:4、Month模块:5、Years模块:6、Set(时间校对)模块:将校对时间设置为2011-5-17-19,当set=1时,时钟时间就重置了,然后当set=0时,时钟就由你设置的时间开始计时。(hset-dset-mset-yset分别为设置的时间的
13、时-日-月-年)7、Alarm_clock(闹钟)模块:将闹钟时间设置为2012-12-8-7,当时钟的时间走到与闹钟时间相同时,ring输出为1,既闹钟响起。(halarm-dalarm-malarm-yalarm分别为闹钟时间的时-日-月-年)8、数字钟计时校对闹钟总模块:从下图可以很清楚的看出数字钟的计时校对闹钟这些基本功能已经实现。十一、各个电路模块的DV综合的网标和电路模型:1、Hour模块:2、Day模块: 3、Month模块:4、Years模块:5、Alarm_clock(闹钟)模块:6、总模块:7、Testbench模块:十二、设计结果分析: 此次数字电子钟设计中,使得数字电子
14、钟具有切换显示年、月、日、时的功能,并且能够根据设置按钮进行相应的设置,也可以设置闹铃。设计过程中对各个模块进行了功能仿真及总的数字钟仿真都达到了预期效果。经过查看波形文件验证知,达到了设计所要求的计时功能,闹铃功能和设置功能,完成了设计要求。十三、论文结论: 作为一名电子科学与技术专业的大三学生,我觉得上集成电路软件应用的收获还是很多的。集成电路软件应用也是电子科学与技术专业基础的一门课,此课程对学生要求也算是有点高、学习难度也是较大的,对本专业也是息息相关的,也是重要的。通过集成电路软件应用课程设计对课本知识进一步掌握,对以前所学数电知识进一步熟练提高,也为以后上奠定基础。 通过这次设计,
15、进一步加深了对VHDL代码编写的了解,让我对它有了更加浓厚的兴趣,巩固了层次化的设计方法,从设计到模块到具体的编程一步步走下去,最终在先前设计好的框架下完成了设计。其次,本次设计中我更加深入的掌握了VHDL程序设计语言,了解到很多语法只能用在仿真设计并不能综合成实际的电路。在设计中我使用了元件例化,程序包,函数,过程等手段综合实现。程序中我使用了较为标准的格式,提高了代码的可读性。自顶向下的设计思想在设计数字电子系统时非常实用,可以将较为复杂的问题化简为一个个小问题,这样设计人员的思路会变得很清晰。为了确保整个系统的正确运行,每个底层的实体在写好之后我都把它们进行了仿真,确保仿真结果正确性。层
16、次化设计的好处是带给我们很大的灵活性,我们可以单独对某个功能的模块进行修改而不影响其他的模块,便于升级、局部优化和维护。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示,在设定testbench后,用modelsim仿真,但是始终看不到时间设置的功能。后来,在数次的调试之后,才发现问题,原来是每一个模块的process()中没有加人敏感信号导
17、致波形仿真得不到正确的结果,后来经过修改终于成功了。总的来说,这次设计的数字钟还是成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。 十四、参考文献:1、阎石, 数字电子技术基础M 1 北京: 高等教育出版社,2000.2、潘松,王国栋,VHDL实用教程M.成都:电子科技大学出版社,2000.3、崔建明主编,电工电子EDA仿真技术 北京:高等教育出版社,2004十五、附录:各个模块的VHDL代码、底层文件代VHDL码及testbench代码:1、H
18、our模块:library ieee;use ieee.std_logic_1164.all;entity hour isport ( clkh: in std_logic; seth: in std_logic; alarmh: in std_logic; ha: in integer; hs: in integer; qth: out integer; clk1: out std_logic; hx: out integer; hy: out integer) ; end hour;architecture shi of hour issignal qh:integer:=14;begin
19、 process(clkh,seth,hs) begin if seth=1then if hs=0 then qh=qh ; else qh=hs;end if;elsif(clkhevent and clkh=1) then if(qh=23) then qh=0;clk1=1; elsif qh23 then qh=qh+1; clk1=0; end if; end if;end process;process(alarmh,ha)beginif alarmh=1 then hx=ha;end if;end process;qth=qh; hy=qh;end shi;2、Day模块:li
20、brary ieee;use ieee.std_logic_1164.all;entity day isport ( clkd: in std_logic; setd: in std_logic; alarmd: in std_logic; da: in integer; ds: in integer; qtd: out integer; clk2: out std_logic; dx: out integer; dy: out integer) ; end day;architecture ri of day issignal qd:integer:=26;begin process(clk
21、d,setd,ds) begin if setd=1 then if ds=0 then qd=qd; else qd=ds; end if;elsif(clkdevent and clkd=1) then if(qd=30) then qd=1; clk2=1; elsif qd30 then qd=qd+1; clk2=0; end if; end if;end process;process(alarmd,da)beginif alarmd=1 then dx=da;end if;end process;qtd=qd; dy=qd;end ri;3、Month模块:library iee
22、e;library ieee;use ieee.std_logic_1164.all;entity month isport ( clkm: in std_logic; setm: in std_logic; alarmm: in std_logic; ma: in integer; ms: in integer; qtm: out integer; clk3: out std_logic; mx: out integer; my: out integer) ; end month;architecture yue of month issignal qm:integer:=11;begin
23、process(clkm,setm,ms) begin if setm=1 then if ms=0 then qm=qm; else qm=ms; end if;elsif(clkmevent and clkm=1) then if(qm=12) then qm=1; clk3=1; elsif qm12 then qm=qm+1; clk3=0; end if; end if;end process;process(alarmm,ma)beginif alarmm=1 then mx=ma;end if;end process;qtm=qm;my=qm;end yue;4、Years模块:
24、library ieee;use ieee.std_logic_1164.all;entity year isport ( clky: in std_logic; sety: in std_logic; alarmy: in std_logic; ya: in integer; ys: in integer; qty: out integer; yx: out integer; yy: out integer) ; end year;architecture nian of year issignal qy:integer:=2012;begin process(clky,sety,ys) b
25、egin if sety=1 then if ys=0 then qy=qy; else qy=ys; end if;elsif(clkyevent and clky=1) then qy=qy+1; end if;end process;process(alarmy,ya)beginif alarmy=1 then yx=ya;end if;end process;qty=qy;yy=qy;end nian;5、Alarm_clock(闹钟)模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
26、entity alarm_clock isport( h1a: in integer; d1a: in integer; m1a: in integer; y1a: in integer; h2a: in integer; d2a: in integer; m2a: in integer; y2a: in integer; ring: out std_logic );end alarm_clock;architecture one of alarm_clock is beginprocess(h2a,d2a,m2a,y2a,h1a,d1a,m1a,y1a)beginif (h1a=h2a an
27、d d1a=d2a and m1a=m2a and y1a=y2a) then ring=1;else ring ring , dalarm = dalarm , malarm = malarm , d = d , set = set , halarm = halarm , yset = yset , dset = dset , h = h , y = y , mset = mset , clk = clk , hset = hset , m = m , alarm = alarm , yalarm = yalarm ) ; process(clk) begin clk =not clk after 50 ns; end process; alarm=0 after 0 us, 1 after 10 us, 0 after 20 us; set=0 after 0 us, 1 after 90 us, 0 after 100 us; halarm= 0 after 0 us, 7 after 10 us,-闹钟时间设置为7时 0 after 20 us; dalarm= 0 after 0 us,