基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计内容选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUS Ⅱ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。
2、设计要求(1)具有时、分、秒计数显示功能。
(2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。
(3)小时为十二小时制。
二.实验目的:1.通过这次EDA设计中,提高手动能力。
2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。
3.掌握多位计数器相连的设计方法。
4.掌握十进制,六进制,二十四进制计数器的设计方法。
5.继续巩固多位共阴极扫描显示数码管的驱动,及编码。
6.掌握扬声器的驱动。
7.LED灯的花样显示。
8.掌握CPLD技术的层次化设计方法三.实验方案:数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。
自顶向下的设计方法将一个复杂的系统逐渐分解成若干功能模块, 从而进行设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。
因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。
通过参考EDA 课程设计指导书,现有以下方案:1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码输出口,扫描用于显示的六个数码管的输出口。
2.底层文件分为:(1)时间计数模块。
分秒计数模块计数为60计数,时计数模块为12计数。
(2)显示模块。
显示模块由一个六进制计数器模块和一个七段译码器组成。
进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。
(3)报警模块当时间到整点时就报时。
输入有时分秒计数,时钟脉冲。
(4)采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示.采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,但无法显示图形文字,在显示星期是也只能用数字表示,而且采用动态扫描法与单片机连接时,在编程时比较复杂。
所以也不采用了LED数码管作为显示。
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,所以在此设计中采用LCD液晶显示屏。
四.实验原理:1. 实验主控系统原理图:模块设计原理图:以上为方案原理图,秒计数、分计数模块为60计数,计满后分别产生分脉冲、时脉,用于分计数、时计数。
各计数器同时将计数值送报时模块和送数及六选一选择器模块。
送数及六选一选择器模块依次将秒分时数送往译码模块译码,同时产生扫描信号用于数码管扫描显示。
整点报警在整点时刻将秒脉冲信号送扬声器声音报警。
(1)秒计数模块:Second模块为秒计数模块。
Clk作为秒脉冲,reset复位,setmin用于调整分钟,接按键,enmin是当秒计数记到59后产生分脉冲,秒计数重新从0开始计数。
Daout为秒计数。
(2)分计数模块:分计数为分计数模块。
Clk作为分脉冲,接second模块的enmin,reset用于复位,sethour用于调整小时,接按键,enhour是当分计数记到59后产生时脉冲,分计数重新从0开始计数。
Daout为分计数。
(3)时计数模块:时计数为时计数模块,clk为时脉冲,接minute模块的enhour,reset复位,daout为时计数。
五.硬件要求:在同一EPLD芯片EPF10K10上集成了如下电路模块:1.时钟计数:秒——60进制BCD码计数;分——60进制BCDD码计数;时——24进制BCDD码计数;同时整个计数器有清零,调分,调时功能。
在接近整数时间能提供报时信号。
2.具有驱动8位八段共阴扫描数码管的片选驱动信号输出和八段字形译码输出。
编码和扫描可参照“实验四”。
3.扬生器在整点时有报时驱动信号产生。
六.实验源程序及流程图:1.实验源程序(VHDL)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;------------------------------------------------------------------------------------------------------------entity daclk isport( Clk : in std_logic; --时钟输入Rst : in std_logic; --复位输入S1,S2 : in std_logic; --时间调节输入SPK : out std_logic; --扬声器输出Display : out std_logic_vector(7 downto 0); --八段码管显示输出SEG_SEL : buffer std_logic_vector(2 downto 0) ; --八段码管扫描驱动lam :out std_logic_vector(2 downto 0) );end daclk;---------------------------------------------------------------------------------------------------------architecture behave of daclk issignal Disp_Temp : integer range 0 to 15;signal Disp_Decode : std_logic_vector(7 downto 0);signal SEC1,SEC10 : integer range 0 to 9;signal MIN1,MIN10 : integer range 0 to 9;signal HOUR1,HOUR10 : integer range 0 to 9;signal Clk_Count1 : std_logic_vector(13 downto 0);signal Clk1Hz : std_logic;signal Music_Count : std_logic_vector(2 downto 0);signal count : std_logic_vector(1 downto 0);signal lamp :std_logic_vector(2 downto 0);beginprocess(Clk) --产生1Hz 时钟的分频计数器beginif(Clk'event and Clk='1') thenif(Clk_Count1<10000) thenClk_Count1<=Clk_Count1+1;elseClk_Count1<="00000000000001";end if;end if;end process;Clk1Hz<=Clk_Count1(13);process(Clk1Hz,Rst)beginif(Rst='0') then --系统复位SEC1<=0;SEC10<=0;MIN1<=0;MIN10<=0;HOUR1<=0;HOUR10<=0;elsif(Clk1Hz'event and Clk1Hz='1') thenif(S1='0') then --调节小时if(HOUR1=9) thenHOUR1<=0;HOUR10<=HOUR10+1;elsif(HOUR10=2 and HOUR1=3) thenHOUR1<=0;HOUR10<=0;elseHOUR1<=HOUR1+1;end if;elsif(S2='0') then --调节分钟if(MIN1=9) thenMIN1<=0;if(MIN10=5) thenMIN10<=0;elseMIN10<=MIN10+1;end if;elseMIN1<=MIN1+1;end if;elsif(SEC1=9) thenSEC1<=0;if(SEC10=5) thenSEC10<=0;if(MIN1=9) thenMIN1<=0;if(MIN10=5) thenMIN10<=0;if(HOUR1=9) thenH OUR1<=0;H OUR10<=HOUR10+1;elsif(HOUR10=2 and HOUR1=3) thenH OUR1<=0;H OUR10<=0;elseHOUR1<=HOUR1+1;end if;elseMIN10<=MIN10+1;end if;elseMIN1<=MIN1+1;end if;elseSEC10<=SEC10+1;end if;elseSEC1<=SEC1+1;end if;end if;end process;process(Clk) --整点报时beginif(Clk'event and Clk='1') thenMusic_Count<=Music_Count+1;if(MIN10=5 and MIN1=9 and SEC10=5) thenif((SEC1 MOD 2)=0) thenSPK<=Music_Count(2);elseSPK<='0';end if;elsif(MIN10=0 and MIN1=0 and SEC10=0 and SEC1=0) then SPK<=Music_Count(1);elseSPK<='0';end if;end if;end process;process(clk1Hz) --LED灯beginlam<=lamp;if (rising_edge(clk1Hz)) thencount <= count + 1;if (count <= "10") thenif (count ="00") thenlamp <= "001" ;elsif (count = "01") thenlamp<= "010" ;elsif(count="10") thenlamp <= "100" ;end if;elsecount <= "00";end if;end if;end process ;process(SEG_SEL) --显示排序begincase (SEG_SEL+1) iswhen "111"=>Disp_Temp<=HOUR10;when "110"=>Disp_Temp<=HOUR1;when "101"=>Disp_Temp<=10;when "100"=>Disp_Temp<=MIN10;when "011"=>Disp_Temp<=MIN1;when "010"=>Disp_Temp<=10;when "001"=>Disp_Temp<=SEC10;when "000"=>Disp_Temp<=SEC1;end case;end process;process(Clk) --扫描累加beginif(Clk'event and Clk='1') thenSEG_SEL<=SEG_SEL+1;Display<=Disp_Decode;end if;end process;process(Disp_Temp) --显示转换begincase Disp_Temp iswhen 0=>Disp_Decode<="00111111";when 1=>Disp_Decode<="00000110";when 2=>Disp_Decode<="01011011";when 3=>Disp_Decode<="01001111";when 4=>Disp_Decode<="01100110";when 5=>Disp_Decode<="01101101";when 6=>Disp_Decode<="01111101";when 7=>Disp_Decode<="00000111";when 8=>Disp_Decode<="01111111";when 9=>Disp_Decode<="01101111";when 10=>Disp_Decode<="01000000";when others=>Disp_Decode<="00000000";end case;end process;end behave;2.实验流程图:七.系统的仿真调试;1.秒计数模块仿真:2.分计数模块仿真:3.时计数模块仿真:4.系统硬件测试:本次选用cyclone系列EP1C3T144C8芯片。