视频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
数字时钟实验报告cc
2025-10-02 15:39:16 责编:小OO
文档
数字时钟实验报告

一、实验目的

1. 熟悉集成电路的引脚安排。

2. 掌握各芯片的逻辑功能及使用方法。

3. 了解实验台。

4. 了解数字钟的组成及工作原理。

5. 熟悉数字钟的设计与制作。

二、实验要求

一、  设计要求说明

  设计并实现具有一定功能的数字小系统(数字钟)

要求:1、对所有设计的小系统能够正确分析;

2、基于VHDL语言描述系统的功能;

3、在quartus 2环境中编译通过;

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

时间以24小时为一个周期;显示时和分;有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;直接由信号发生器提供表针时间基准信号。

三、实验原理

1.数字钟的构成

数字钟实际上是一个对标准频率(1/60HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路。 

2.时间计数器电路

时间计数电路由分个位和分十位计数器和时个位和时十位计数器电路构成,其中分个位和分十位计数器为60进制计数器,根据设计要求,时个位和时十位计数器为24进制计数器。

3.显示单元

此显示单元直接由做好的译码驱动电路和数码管组成。不需要另外设计。

4.校时电源电路

当重新接通电源或走时出现误差时都需要对时间进行校正。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数,校正好后,再转入正常计时状态即可。

四、  各模块设计

1、          秒计时器(second1)

Library ieee;

Use ieee.std_logic_11.all;

Use ieee.std_logic_arith.all;

Use ieee.std_logic_unsigned.all;

Entity second1 is

Port(clk,set,reset:in std_logic;

      S1:in std_logic_vector(7 downto 0);            ――置数端(秒)

      Sec:buffer std_logic_vector(7 downto 0);      ――秒输出端

      Ensec:out std_logic);              ――秒计时器的进位,用来驱动分计时器

End;

Architecture a of second1 is

  Begin

Process(clk,reset,set,s1)

  Begin

If reset='0' then sec<="00000000"; ――对秒计时器清0

Elsif set='0' then sec<=s1; ――对秒计时器置s1的数

  Elsif clk'event and clk='1' then

if sec=59 then sec<="00000000";ensec<='1'; ――重复计数并产生进位 else sec<=sec+1;ensec<='0'; 以驱动下一级

      end if;

end if;

End process;

End;  

2、          分计时器(minute1)

略.

3、              时计时器(hour1)

Library ieee;

Use ieee.std_logic_11.all;

Use ieee.std_logic_arith.all;

Use ieee.std_logic_unsigned.all;

Entity hour1 is

Port(clkh,set,reset:in std_logic;

      h1:in std_logic_vector(7 downto 0);              ――置数端(时)

      hour:buffer std_logic_vector(7 downto 0);        ――时输出端

      Enhour:out std_logic);              ――时计时器的进位,用来驱动星期计时器

End;

Architecture a of hour1 is

  Begin

Process(clkh,reset,set,h1)

  Begin

If reset='0' then hour<="00000000"; ――对时计时器清0

Elsif set='0' then hour<=h1; ――对时计时器置h1的数

    Elsif clkh'event and clkh='1' then

if hour=23 then hour<="00000000";enhour<='1'; ――重复计数      

else hour<=hour+1;enhour<='0'; 并产生进位以驱动下一级

      end if;

  end if;

End process;

End;  

4、          星期计时器(day1)

Library ieee;

Use ieee.std_logic_11.all;

Use ieee.std_logic_arith.all;

Use ieee.std_logic_unsigned.all;

Entity day1 is

  Port(clkd,set,reset:in std_logic;

d1:in std_logic_vector(2 downto 0);            ――置数端(星期)

day:buffer std_logic_vector(2 downto 0));        ――星期输出端

end;

Architecture a of day1 is

Begin

  Process(clkd,reset,set,d1)

  Begin

If reset='0' then day<="000"; ――对星期计时器清0

Elsif set='0' then day<=d1; ――对星期计时器置d1的数

    Elsif clkd'event and clkd='1' then

If day=6 then day<="000"; ――重复计数  

Else day<=day+1;

End if;

  End if;

End process;

End;

5、              报时模块(alarm1)

Library ieee;

Use ieee.std_logic_11.all;

Use ieee.std_logic_arith.all;

Use ieee.std_logic_unsigned.all;

Entity alarm1 is

  Port(reset:in std_logic;                

Min:in std_logic_vector(7 downto 0);

Alarm:out std_logic);                      ――输出的报时信号

End;

Architecture a of alarm1 is

Begin

Alarm<='1' when min="00000000" and reset='1' else ――当分为0且清0

          '0';                              信号无效时,输出高电平并持续至分不为0

end;

                                                    

四、  系统设计

  将上述5个程序作为底层文件,存放在同一个文件夹中,然后按下面的图将这几个文件连接起来,并用元件例化语句编写顶层文件的程序,如下:

见相册“EDA课程设计论文-数字钟-仿真波形”图2

Library ieee;

Use ieee.std_logic_11.all;

Use ieee.std_logic_arith.all;

Use ieee.std_logic_unsigned.all;

Entity topclock is

Port(clk,reset,set:in std_logic;

S1,m1,h1:in std_logic_vector(7 downto 0);

D1: in std_logic_vector(2 downto 0);

Alarm:out std_logic;

Sec,min,hour:buffer std_logic_vector(7 downto 0);

Day:out std_logic_vector(2 downto 0));

End;

Architecture one of topclock is

  Component second1                                        ――秒元件的例化

Port(clk,reset,set: in std_logic;

          S1: in std_logic_vector(7 downto 0);        

          Sec:buffer std_logic_vector(7 downto 0);

          Ensec:out std_logic);

    End Component;

  Component minute1                                        ――分元件的例化

Port(clkm,reset,set: in std_logic;

          m1: in std_logic_vector(7 downto 0);

          min:buffer std_logic_vector(7 downto 0);

          Enmin:out std_logic);

    End Component;

  Component hour1                                          ――时元件的例化

Port(clkh,reset,set: in std_logic;

          h1: in std_logic_vector(7 downto 0);

          hour:buffer std_logic_vector(7 downto 0);

          Enhour:out std_logic);

    End Component;

  Component day1                                          ――星期元件的例化

Port(clkd,reset,set: in std_logic;

          d1: in std_logic_vector(2 downto 0);

          day:buffer std_logic_vector(2 downto 0));

    End Component;

  Component alarm1                                        ――报时元件的例化

Port(reset: in std_logic;

          min: in std_logic_vector(7 downto 0);

          alarm:out std_logic);

  End Component;

signal enm,enh,enda:std_logic;                ――秒分、分时、时星期之间的连接信号

signal ena:std_logic_vector(7 downto 0);            ――分与报时之间的连接信号

begin

u1:second1 port map(reset=>reset,set=>set,s1=>s1,

sec=>sec,clk=>clk, ensec=>enm);

u2:minute1 port map(reset=>reset,set=>set,m1=>m1,

min=>min, clkm=>enm,enmin=>enh);

u3:hour1 port map(reset=>reset,set=>set,h1=>h1,

hour=>hour, clkh=>enh,enhour=>enda);

u4:day1 port map(reset=>reset,set=>set,d1=>d1,day=>day,clkd=>enda);

u5:alarm1 port map(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)为低电平,后面均为高电平;分重置端(m1)可设置数值为50分,保存波形图,进行仿真,产生如下波形:

见相册“EDA课程设计论文-数字钟-仿真波形”图4

由上述波形可以清楚的看到:当清0信号(reset)无效时,分计时器置数,从50分开始计数,到59秒时回到0,并且从enmin输出一个高电平。

3、          时计时器(hour1)(Endtime为1us)

在时计时器的clkh输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(100ns)为低电平,后面均为高电平;置数端(set)前面一小段(200ns)为低电平,后面均为高电平;时重置端(h1)可设置数值为20时,保存波形图,进行仿真,产生如下波形:

见相册“EDA课程设计论文-数字钟-仿真波形”图5

由上述波形可以清楚的看到:当清0信号(reset)无效时,时计时器置数,从20时开始计数,到23时回到0,并且从enhour输出一个高电平。

4、          星期计时器(day1)(Endtime为1us)

在星期计时器的clkd输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(100ns)为低电平,后面均为高电平;置数端(set)前面一小段(200ns)为低电平,后面均为高电平;星期重置端(d1)可设置数值为4(星期四),保存波形图,进行仿真,产生如下波形:

见相册“EDA课程设计论文-数字钟-仿真波形”图6

由上述波形可以清楚的看到:当清0信号(reset)无效时,星期计时器置数,从星期四开始计数,到星期六时回到0。

5、          报时模块(alarm1)

  清0端(reset)前面一小段(200ns)为低电平,后面均为高电平;设置min的值,使其分别为……58分、59分、00分、01分、02分、03分……,保存波形图,进行仿真,产生如下波形:

见相册“EDA课程设计论文-数字钟-仿真波形”图7

由上述波形可以清楚的看到:alarm在0分时输出高电平,并且持续至min不为0。

6、          系统总调试(topclock)(Endtime为10us)

      在秒计时器的clk输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(40ns)为低电平,后面均为高电平;置数端(set)前面一小段(60ns)为低电平,后面均为高电平;秒重置端(s1)可设置数值为50秒,分重置端(m1)可设置数值为57分, 时重置端(h1)可设置数值为23时, 星期重置端(d1)可设置数值为6(星期六);保存波形图,进行仿真,产生如下波形:

见相册“EDA课程设计论文-数字钟-仿真波形”图8

由上述波形可以清楚的看到:当reset为0时,数字钟清0;当set为1时,数字钟置数,其值为星期六、23时、57分、50秒。

见相册“EDA课程设计论文-数字钟-仿真波形”图9

由上述波形可以清楚的看到:秒计时器开始计时,当到达59秒后,秒计时器sec又从0开始计时,同时分钟min加了1,为58分。

见相册“EDA课程设计论文-数字钟-仿真波形”图10

由上述波形可以清楚的看到:分计时器开始计时,当到达59分后,分计时器min又从0开始计时,同时小时hour加了1,为24时,即时计时器hour也又从0开始计时,而此时星期计时器day也由6加1后回0,又从0开始计时。当分计时器min为0时,alarm输出一个高电平,持续直到分计时器min的值为1。

六、  结论

由上调试过程可知,该数字钟实现了计时、重置时间、整点报时三大功能。

在给数字钟重置时间后,数字钟便开始从所置的时间计时,到达59秒时,秒计时器回到0秒,并且给分钟加1;当到达59分时,分计时器回到0分钟,并且给小时加1;当到达23小时时,时计时器回到0小时,并且给星期加1;当到达星期六时,星期计时器又回到0。

当到达59分,分计时器回到0时,报时装置输出高电平,并且持续一段时间,直到分计时器的值不为0。

七、  感想

    通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,数字钟开始计数,但是始终看不到小时、星期的循环计数。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于小时、星期来说太短了。经过屡次调试,终于找到了比较合适的输入数值:分钟的初始值可以设为57(58、59都可以),小时的初始值可以设为23,星期的初始值可以设为6,这样,仿真之后,就能清楚的看出分钟、小时、星期的循环计数。另外,Endtime的值需要设置的长一点:10us左右,输入的时钟周期值要设置的短一点:5ns左右。

总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。下载本文

显示全文
专题