最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于VHDL语言实现数字电子钟的设计

来源:动视网 责编:小OO 时间:2025-09-23 23:15:58
文档

基于VHDL语言实现数字电子钟的设计

基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计内容选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUSⅡ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。2、设计要求(1)具有时、分、秒计数显示功能。(2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。(3)小时为十二小时制。二.实验目的:1.通过这次EDA设计中,提高手动能力。2.深入了解时事时钟的工作
推荐度:
导读基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计内容选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUSⅡ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。2、设计要求(1)具有时、分、秒计数显示功能。(2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。(3)小时为十二小时制。二.实验目的:1.通过这次EDA设计中,提高手动能力。2.深入了解时事时钟的工作
基于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. 实验主控系统原理图 :     

        2.模块

设计原理图:

以上为方案原理图,秒计数、分计数模块为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_11.all; 

use ieee.std_logic_arith.all; 

use ieee.std_logic_unsigned.all; 

------------------------------------------------------------------------------------------------------------

entity daclk is 

   port( 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 is 

   signal 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);

   begin 

      process(Clk)                 --产生1Hz 时钟的分频计数器

        begin 

           if(Clk'event and Clk='1')  then 

if(Clk_Count1<10000)  then 

Clk_Count1<=Clk_Count1+1;

                else 

Clk_Count1<="00000000000001";

                end if; 

           end if; 

      end process; 

Clk1Hz<=Clk_Count1(13);

      process(Clk1Hz,Rst) 

        begin 

                if(Rst='0')  then            --系统复位

              SEC1<=0;

                 SEC10<=0;

                    MIN1<=0;

                 MIN10<=0;

                 HOUR1<=0;

                 HOUR10<=0;

              elsif(Clk1Hz'event and Clk1Hz='1')  then                      

                 if(S1='0')  then        --调节小时

                      if(HOUR1=9)  then 

                       HOUR1<=0;

                       HOUR10<=HOUR10+1;

                      elsif(HOUR10=2 and HOUR1=3) then 

                       HOUR1<=0;

                       HOUR10<=0;

                      else 

                       HOUR1<=HOUR1+1;

                      end if; 

                 elsif(S2='0') then         --调节分钟

                      if(MIN1=9) then 

                       MIN1<=0;

                           if(MIN10=5)  then 

                                MIN10<=0;

                           else 

                                MIN10<=MIN10+1;

                           end if; 

                      else 

                       MIN1<=MIN1+1;

                      end if; 

                     elsif(SEC1=9)  then 

                      SEC1<=0;

                      if(SEC10=5)  then 

                       SEC10<=0;

                       if(MIN1=9)  then 

                            MIN1<=0;

                            if(MIN10=5)  then 

                                 MIN10<=0;

                                 if(HOUR1=9)  then 

                                 HOUR1<=0;

                                 HOUR10<=HOUR10+1;

                                 elsif(HOUR10=2 and HOUR1=3)  then 

                                 HOUR1<=0;

                                 HOUR10<=0;

                                 else 

                                     HOUR1<=HOUR1+1;

                              end if; 

                             else 

                              MIN10<=MIN10+1;

                             end if; 

                         else 

                             MIN1<=MIN1+1;

                         end if; 

                     else 

                         SEC10<=SEC10+1;

                     end if; 

                 else 

                     SEC1<=SEC1+1;

                 end if; 

             end if; 

            end process; 

            process(Clk)         --整点报时

           begin 

               if(Clk'event and Clk='1')  then 

                 Music_Count<=Music_Count+1;

                if(MIN10=5 and MIN1=9 and SEC10=5)  then               

                     if((SEC1 MOD 2)=0)  then                

                         SPK<=Music_Count(2);

                     else 

                         SPK<='0';

                     end if; 

                 elsif(MIN10=0 and MIN1=0 and SEC10=0 and SEC1=0) then 

                     SPK<=Music_Count(1);

                 else 

                     SPK<='0';

                 end if; 

             end if; 

            end process;

            process(clk1Hz)          --LED灯

            begin

                lam<=lamp;

               if (rising_edge(clk1Hz))  then 

                        count <= count + 1;

                        if (count <= "10")  then

                            if (count ="00")  then

                                lamp <= "001" ;

                            elsif (count = "01")  then

                                lamp<= "010" ;

                            elsif(count="10")  then 

                                lamp <= "100" ;

                            end if;

                        else 

                        count <= "00";

                    end if;    

                end if;                 

            end process ;

            process(SEG_SEL)        --显示排序

           begin 

             case (SEG_SEL+1) is 

                   when "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)             --扫描累加

         begin 

            if(Clk'event and Clk='1')  then          

SEG_SEL<=SEG_SEL+1;

Display<=Disp_Decode;

            end if; 

      end process; 

      process(Disp_Temp)              --显示转换

         begin 

            case Disp_Temp is 

when 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芯片。外部需接2个不同频率的时钟信及几上升沿按键,并接扬声器和不许译码器的数码管。以上均由EDA试验箱提供。

    整个系统的构成的入端口有: 

clk1——用于送数及六选一选择器和整点报警的时序脉冲;

Stop——用于整点报时的停止控制;

clk——作为秒脉冲和整点报警的信声音号;

reset——用于各个模块复位;

setmin——调整分钟,接按键;

sethour——调整小时,接按键;

输出端口:

 speak——接扬声器,用于报时;

 led——接数码管,送字型码;

 dp——接数码管的小数点为,隔开时分秒位;

     sel——位选扫描信号输出口,接数码管位选接口

下载测试后的效果如下图所示,按复位键后数码管显示0时0分0秒开始计数,分秒时计数都正确。按动调分键或调小时键后,分位或小时位开始自加,再按键后停止。当时间到整点时会有十秒报时,按动停止键停止报时,不按此键时自动到十秒后停止报时。设计结果达到要求。

八.结束语:

     从这次EDA设计中,可以看我们的动手能力还有待提高。另一方面,我们更加对EDA从实践上更有深刻认识。从实践中发现问题,分析问题,解决问题在这次设计中很大的体现出来,提高了我们的能力和自信。同时,成功与积极查阅资料是分不开的。

     通过此次课程设计,让我对EDA这门技术有了更深的体会,并更好的学会了使用QuartusⅡ软件进行硬件设计。

    此次课程设计时基于VHDL语言进行的数字钟设计,在课程设计时,我更加掌握了VHDL语言的语句及语法等的使用。但在学习过程中,也遇到了很多困难,由于刚刚使用EDA不久,所以很多细节内容都不是很了解,尤其和VHDL语言一起的运用。我先上网找了一些资料和程序,慢慢摸索着学习写语句。最后在同学的帮助下,终于完成了数字钟的设计。以后我会利用更多时间来学习EDA技术。

EDA技术有着非常好的发展前景,是进几年电子工业的发展趋向,中国的EDA行业发展十分迅速,有着很大的潜力。

 

文档

基于VHDL语言实现数字电子钟的设计

基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计内容选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUSⅡ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。2、设计要求(1)具有时、分、秒计数显示功能。(2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。(3)小时为十二小时制。二.实验目的:1.通过这次EDA设计中,提高手动能力。2.深入了解时事时钟的工作
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top