利用VHDL语言实现数字钟2009-06-1909:53eda课程设计vhdl数字钟eda设计论文一、设计要求说明设计并实现具有一定功能的数字小系统(数字钟)要求:1、对所有设计的小系统能够正确分析;2、基于VHDL语言描述系统的功能;3、在quartus2环境中编译通过;4、仿真通过并得到正确的波形;5、给出相应的设计报告。难度要求:至少有2层电路,底层电路至少有4中元件。二、方案论证该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有4部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。秒计时器(second1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,秒计时器清0;set为置数信号,当set为0时,秒计时器置数,置s1的值。clk为驱动秒计时器的时钟,sec为秒计时器的输出,ensec为秒计时器的进位信号,作为下一级的时钟输入信号。分计时器(minute1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,分计时器清0;set为置数信号,当set为0时,分计时器置数,置m1的值。clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。时计时器(hour1)是由一个24进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,时计时器清0;set为置数信号,当set为0时,时计时器置数,置h1的值。clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。星期计时器(day1)是由一个7进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,星期计时器清0;set为置数信号,当set为0时,星期计时器置数,置d1的值。clkd为驱动星期计时器工作的时钟,与enhour相连接;day为星期计时器的输出。报时模块(alarm1)的功能是当整点(将min作为该模块的输入信号,min=00)时,alarm输出高电平,并且持续1分钟。数字钟的工作原理图如下所示:见相册“EDA课程设计论文-数字钟-仿真波形”图1三、各模块设计1、秒计时器(second1)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;Entitysecond1isPort(clk,set,reset:instd_logic;S1:instd_logic_vector(7downto0);――置数端(秒)Sec:bufferstd_logic_vector(7downto0);――秒输出端Ensec:outstd_logic);――秒计时器的进位,用来驱动分计时器End;Architectureaofsecond1isBeginProcess(clk,reset,set,s1)BeginIfreset='0'thensec=00000000;――对秒计时器清0Elsifset='0'thensec=s1;――对秒计时器置s1的数Elsifclk'eventandclk='1'thenifsec=59thensec=00000000;ensec='1';――重复计数并产生进位elsesec=sec+1;ensec='0';以驱动下一级endif;endif;Endprocess;End;2、分计时器(minute1)略.3、时计时器(hour1)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;Entityhour1isPort(clkh,set,reset:instd_logic;h1:instd_logic_vector(7downto0);――置数端(时)hour:bufferstd_logic_vector(7downto0);――时输出端Enhour:outstd_logic);――时计时器的进位,用来驱动星期计时器End;Architectureaofhour1isBeginProcess(clkh,reset,set,h1)BeginIfreset='0'thenhour=00000000;――对时计时器清0Elsifset='0'thenhour=h1;――对时计时器置h1的数Elsifclkh'eventandclkh='1'thenifhour=23thenhour=00000000;enhour='1';――重复计数elsehour=hour+1;enhour='0';并产生进位以驱动下一级endif;endif;Endprocess;End;4、星期计时器(day1)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;Entityday1isPort(clkd,set,reset:instd_logic;d1:instd_logic_vector(2downto0);――置数端(星期)day:bufferstd_logic_vector(2downto0));――星期输出端end;Architectureaofday1isBeginProcess(clkd,reset,set,d1)BeginIfreset='0'thenday=000;――对星期计时器清0Elsifset='0'thenday=d1;――对星期计时器置d1的数Elsifclkd'eventandclkd='1'thenIfday=6thenday=000;――重复计数Elseday=day+1;Endif;Endif;Endprocess;End;5、报时模块(alarm1)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;Entityalarm1isPort(reset:instd_logic;Min:instd_logic_vector(7downto0);Alarm:outstd_logic);――输出的报时信号End;Architectureaofalarm1isBeginAlarm='1'whenmin=00000000andreset='1'else――当分为0且清0'0';信号无效时,输出高电平并持续至分不为0end;四、系统设计将上述5个程序作为底层文件,存放在同一个文件夹中,然后按下面的图将这几个文件连接起来,并用元件例化语句编写顶层文件的程序,如下:见相册“EDA课程设计论文-数字钟-仿真波形”图2Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;EntitytopclockisPort(clk,reset,set:instd_logic;S1,m1,h1:instd_logic_vector(7downto0);D1:instd_logic_vector(2downto0);Alarm:outstd_logic;Sec,min,hour:bufferstd_logic_vector(7downto0);Day:outstd_logic_vector(2downto0));End;ArchitectureoneoftopclockisComponentsecond1――秒元件的例化Port(clk,reset,set:instd_logic;S1:instd_logic_vector(7downto0);Sec:bufferstd_logic_vector(7downto0);Ensec:outstd_logic);EndComponent;Componentminute1――分元件的例化Port(clkm,reset,set:instd_logic;m1:instd_logic_vector(7downto0);min:bufferstd_logic_vector(7downto0);Enmin:outstd_logic);EndComponent;Componenthour1――时元件的例化Port(clkh,reset,set:instd_logic;h1:instd_logic_vector(7downto0);hour:bufferstd_logic_vector(7downto0);Enhour:outstd_logic);EndComponent;Componentday1――星期元件的例化Port(clkd,reset,set:instd_logic;d1:instd_logic_vector(2downto0);day:bufferstd_logic_vector(2downto0));EndComponent;Componentalarm1――报时元件的例化Port(reset:instd_logic;min:instd_logic_vector(7downto0);alarm:outstd_logic);EndComponent;signalenm,enh,enda:std_logic;――秒分、分时、时星期之间的连接信号signalena:std_logic_vector(7downto0);――分与报时之间的连接信号beginu1:second1portmap(reset=reset,set=set,s1=s1,sec=sec,clk=clk,ensec=enm);u2:minute1portmap(reset=reset,set=set,m1=m1,min=min,clkm=enm,enmin=enh);u3:hour1portmap(reset=reset,set=set,h1=h1,hour=hour,clkh=enh,enhour=enda);u4:day1portmap(reset=reset,set=set,d1=d1,day=day,clkd=enda);u5:alarm1portmap(reset=reset,min=min,alarm=alarm);end;五、调试过程1、秒计时器(second1)(Endtime为1us)在秒计时器的clk输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(100ns)为低电平,后面均为高电平;置数端(set)前面一小段(200ns)为低电平,后面均为高电平;秒重置端(s1)可设置数值为50秒,保存波形图,进行仿真,产生如下波形:见相册“EDA课程设计论文-数字钟-仿真波形”图3由上述波形可以清楚的看到:当清0信号(reset)无效时,秒计时器置数,从50秒开始计数,到59秒时回到0,并且从ensec输出一个高电平。2、分计时器(minute1)(Endtime为1us)在分计时器的clkm输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(100ns)为低电平,后面均为高电平;置数端(set)前面一小段(200ns)为低电平,后