视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
EDA数字钟实训报告VHDL程序
2025-10-02 04:30:31 责编:小OO
文档


EDA实训报告

  

指导教 师

朱小祥        田欢

专业电子信息工程技术
班级电信1301

姓名          郑登

日期2015年6月23日—27日

一、实训目的 

1、了解数字钟的工作原理。 

2、进一步熟悉用VHDL语言编写驱动七段码管显示的代码。 

3、掌握VHDL编写中的一些小技巧。

二、实训原理 

多功能数字钟应该具有的功能有:显示时-分-秒、整点报时、小时和分钟可调等基本功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。 

在实训中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。 

实训中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。 

对于整点报时功能,用户可以根据系统的硬件结构和自身的具体要求来设计。本实训设计的是当进行整点的倒计时5秒时,让LED来闪烁进行整点报时的提示。

三、实训内容 

本实验的任务就是设计一个多功能数字钟,要求显示格式为 小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在整点前5秒LED开始闪烁,过整点后,停止闪烁。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用按键作为系统时钟复位,复位后全部显示00-00-00。 

四、实训步骤 

     1、写出数码管显示的程序部分。

       2、写出数字钟的程序部分。

       3、写出调时和蜂鸣器程序部分。

       4、管脚分配和下载实验。

       5、修改程序,简化,写注释。

五、实训VHDL程序

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity shizhong is

port(sr:out std_logic_vector(0 to 6); 

     led:out std_logic_vector(0 to 3); 

     tr:out std_logic_vector(0 to 5);

     clk:in std_logic;

      c1,c2,c3,c4:in std_logic;

     speak:out std_logic);

end shizhong;

architecture behave of shizhong is----结构体

    signal disp_temp  :integer range 0 to 10;

    signal sec1m,sec10m  :integer range 0 to 9:=0;----秒的个位和十位信号

    signal sec1,sec10  :integer range 0 to 10:=0;----------

    signal hor1,hor10  :integer range 0 to 10:=0;

    signal clk1khz:std_logic;---1KHz信号

    signal clk1hz:std_logic;----1HZ信号

    signal st:std_logic;

    signal display :integer range 0 to 5;

    signal k1,k2:std_logic_vector(2 downto 0);

    signal k3:std_logic;

    signal f1:std_logic_vector(1 downto 0);

    signal cink: integer range 0 to 100;

    BEGIN

--------------------------------------------------------50MHz分频出1Hz信号

        PROCESS(clk)

            variable cnt:integer range 0 to 49999999;

        begin

          if clk='1' and clk'event then

            if cnt=49999999 then cnt:=0;

                else

                if cnt<25000000 then clk1hz<='1';

                    else clk1hz<='0';

                end if;

                cnt:=cnt+1;

            end if;

          end if;

        end process;

--------------------------------------------------------50MHz分频出1KHz信号    

        PROCESS(clk)

            variable cnt1:integer range 0 to 49999;

        begin

            if clk='1' and clk'event then

                if cnt1=49999 then cnt1:=0;

                    else

                    if cnt1<25000 then clk1khz<='1';cink<=cink+1 ;if cink>=100 then cink<=0;end if;

                        else clk1khz<='0';

                    end if;

                    cnt1:=cnt1+1;

                end if;

            end if;

        end process;

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

        process(clk1hz)

        variable s1,s2,s3,s4,s5,s6:integer range 0 to 9;

        

        begin                                               

            if clk1hz='1' and clk1hz'event then

              if s1>=9 and s2>=5 then s1:=0;s2:=0;

                  if s3>=9 and s4>=5 then s3:=0;s4:=0;

                      if s5>=3 and s6>=2 then s5:=0;s6:=0;

                      elsif s6>2  then s6:=0;

                      elsif s5>=9 then s5:=0;s6:=s6+1; 

                      else s5:=s5+1;end if;

                  elsif s3>=9 then s3:=0;s4:=s4+1;

                  else s3:=s3+1;end if;

              elsif s1>=9 then s1:=0;s2:=s2+1;

              else s1:=s1+1;end if;

            if s3>9 and s4>5 then s3:=0;s4:=0;end if;

            if s5>3 and s6>2 then s5:=0;s6:=0;end if;

            if s6>2  then s6:=0;end if;

            if s5>9 then s5:=0;end if;

            if s3>9 then s3:=0;end if;

            if s4>5 then s4:=0;end if;

            if c1='0' then s3:=s3+1;end if;

                        if c2='0' then s4:=s4+1;end if;

                        if c3='0' then s5:=s5+1;end if;

                        if c4='0' then s6:=s6+1;end if;

            sec1m<=s1;sec10m<=s2;sec1<=s3;sec10<=s4;hor10<=s6;hor1<=s5;

            end if;

            end if;

            if s3=0 and s4=0 and s1<5 and s2=0 then speak<='0';led<="1111"; 

            else speak<='1';led<="0000";end if;

     end process; 

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

       process(display)

            begin

                case(display) is

                    when 0=>disp_temp<=hor10;tr<="011111";

                    when 1=>disp_temp<=hor1;tr<="101111";

                    when 2=>disp_temp<=sec10;tr<="110111";

                    when 3=>disp_temp<=sec1;tr<="111011";

                    when 4=>disp_temp<=sec10m;tr<="111101";

                    when 5=>disp_temp<=sec1m;tr<="111110";

                    when others=>tr<="111111";

                end case;

        end process;

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

      process(clk1khz)

               begin

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

if display=5 then display<=0;

                          else

                              display<=display+1;

                    end if;

                      end if;

      end process;        

        process(disp_temp) 

              begin

                case disp_temp is

when 0=>sr<="1000000";

when 1=>sr<="1111001";

when 2=>sr<="0100100";

when 3=>sr<="0110000";

when 4=>sr<="0011001";

when 5=>sr<="0010010";

when 6=>sr<="0000010";

when 7=>sr<="1111000";

when 8=>sr<="0000000";

when 9=>sr<="0010000";

                        when others=>sr<="1111111";

                end case;

        end process;

end behave;

六、管脚分配

     

七、实训结果

     本实验的任务就是设计一个多功能数字钟,要求显示格式为 小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在整点前5秒LED开始闪烁,过整点后,停止闪烁。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用按键作为系统时钟复位,复位后全部显示00-00-00。 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

八、实训总结

通过本次实验对软件EDA软件有了更深的了解,掌握在Quartus Ⅱ中VHDL语句 VHDL语句的编写、仿真方法和层次设计的意义。  

在实现不同电路的功能时,使用不同的语句其实际电路是不一样的,在语句的编写过程中如果可以使用”=”,就尽量避免” >”或”<”的使用,这样可以减小对硬件的占用。类似的问题还有很多,在语句描写的时候,不仅仅要考虑功能的实现,减小对硬件的使用量也是非常重要的。

VHDL中尽量不要使用乘除法,避免消耗大量LE,一个进程中只能有一个边沿检测event,编写程序是要尤其注意,VHDL为顺序执行结构,编写程序时,尽可能多的使用进程能增加程序的执行效率。  

这次试验收获了很多,养成严谨以及对事物的细心观察的习惯,对问题的解决可以有很大的帮助。下载本文

显示全文
专题