电子钟实验报告

实 验 报 告

实验课程名称 近代电子学实验

实验项目名称 多功能数字电子钟

年 级

专 业

学生姓名

学 号

理 学 院

实验时间: 2012 年 9月 15 日

电子钟实验报告

近代电子学实验报告

实验名称:多功能数字电子钟

设计内容及要求:

实验任务:设计并制作一个数字电子钟。

基本要求:①准确计时,以数字形式显示时、分、秒的时间。②小时为24进制,分和秒为60进制。③具有校时电路。

扩展功能:①定时控制。②整点报时。③仿电台整点报时。④报整点时数。 实验条件:用面包板组建实际电路

实验时间:20xx年9月29日至20xx年10月13日

实验地点:博学楼513S

使用仪器及元器件:面包板(1块),七段共阳数码管(6个),74LS47(6片),74LS90(6片),74LS20(1片),74LS00(4片),74LS08(1片),74LS74(1片),4060(1片),电阻(100欧/6个,3.3k欧/2个,1k欧/2个,1M欧/1个,27欧/1个),电容(51pF/2个),晶振(32768Hz/1个),LED(2个),电平开关(8控/1个),晶体管(9014/1个),扬声器/蜂鸣器(1个),导线(若干)

电子钟实验报告

时基和分频电路

由于4060为2^14分频器,其7,5,4,6,14,13,15,1,2,3管脚分别对应2^5,2^6,2^7,2^8,2^9, 2^10,2^11,2^12,2^13,2^14分频信号,此处选择32768Hz的晶振,故由4060的7脚可得1024Hz信号,由5脚可得512Hz信号,由3脚可得2Hz信号。考虑到电路系统需使用1Hz

的信号,故在4060后增加一个T’触发器(由D触发器改装)。而校时信号频率不宜选择过大(不易控制进行校时),也不宜选择过小(校时周期太长),且前面已经使用了一块74LS74,其中有一个D触发器还处于闲置状态,故将1Hz信号接入下一个T’触发器(由D触发器改装)获得0.5Hz信号,并选择了0.5Hz的信号作为校时信号。

2、60进制及24进制计数器的设计

用两片74LS90和两个2输入与门可组成60进制计数器或24进制计数器,构造60进制和24进制计数器采用了反馈清零法。当两片74LS90分别计数至5和9时,其输出状态分别为(QdQcQbQa)2=0101,(QdQcQbQa)1=1001,下一个时钟脉冲到来后瞬间,十位计数器状态翻转为(QdQcQbQa)2=0110。若将十位计数器的Qc2和Qb2接入与门输入端,并将与门输出端接十位计数器清零端(也可同时接个位计数器清零端),即可得到60进制计数器。同理,当两片74LS90分别计数至2和3时,其输出状态分别为(QdQcQbQa)2=0010,(QdQcQbQa)1=0011,下一个时钟脉冲到来后瞬间,十位计数器状态翻转为(QdQcQbQa)2=0100,若将Qb2和Qc1接入

电子钟实验报告

电子钟实验报告

24进制计数器 60进制计数器 60进制计数器

3、校时电路的设计

二选一数据选择器

当闭合SW1时,对小时进校校对,断开SW1后,小时进入正常计数,校时过程不影响分和秒的正常计时。当闭合SW2时,对分进校校对,断开SW2后,分进入正常计数,校时过程不影响秒的正常计时。

4、译码显示电路的设计

译码电路采用6片74LS47芯片搭建,与6个7段共阳数码管相接构成译码显示电路。7段共阳数码管应接限流电阻,此处选择100欧的电阻作为限流电阻,构成完整的译码显示电路如下图所示:

电子钟实验报告

电子钟实验报告

秒计数指示

至此,基本电路设计完毕。但在仿真测试时,发现电路中的晶振无法起振,在仔细检查电路确认无误后,将电路中的时基和分频电路部分更改为比较熟悉的555定时电路并进行仿真,电路一切正常。在询问了其他同学的情况后,发现都出现了这个问题,由此判断可能是时基电路的晶振部分出现了一些问题,或者是软件的晶振仿真部分有些缺陷,而后者可能性较大。若制成实际电路后仍不能正常工作,则应询问老师加以解决,因此此处遗留了一个待解决的问题。①

二、尽力发挥,力争给电路增加尽可能多的拓展功能

在仔细考虑电路可以搭载的拓展功能后,选择了为电路增加仿电台整点报时功能。

仿电台整点报时应在每个小时的第59分51、53、55、57秒分别让扬声器发出低音频,在每个小时的第59分59秒发出高音频,每个音频持续1s,并考虑到4060的分频特性,此处选择512Hz作为低音频,选择1024Hz作为高音频。由此得出,分十位和个位计数器状态分别为(QdQcQbQa)m2=0101,(QdQcQbQa)m1=1001,秒十位计数器的状态为(QdQcQbQa)s2=0101时,秒个位计数器的状态可用来控制低音频和高音频,下表为秒个位计数器的状态与送入扬声器的音频的关系表:

电子钟实验报告

电子钟实验报告

“0”时,扬声器发出低音频由表可得:Qds1=“1”时,扬声器发出高音频

只有当Qcm2Qam2Qdm1Qam1Qcs2Qas2Qas1=1111111时,扬声器电路才能工作,故将该七个数据通过7输入与门(由两个四输入与非门和两个由二输入与非门改装的反相器共同构成)后作为扬声器电路的开关控制信号,而Qds1则用作可控二选一数据选择器的控制信号。当Qds1=0时,控制二选一数据选择器让低音频通过,Qds1=1时,控制二选一数据选择器让高音频通过。据此可设计如下电路:

3210I/RBOBITABCDEFG54

至此,基本电路和功能拓展电路均设计完毕,下面是设计完毕后的整体电路图:

电子钟实验报告

整体电路图

三、软件仿真

由于本电路的时基模块存在问题(初步判断是由软件引起的),故仿真时将时基电路更改成了555定时电路,以下是一些仿真结果,与设计完全吻合:

1、开始仿真:

电子钟实验报告

开始仿真

说明:本次设计使用proteus 7 professional软件,图中各结点旁边的红色、蓝色和灰色小点表示该结点的当前电平值,红色表示高电平,蓝色表示低电平,灰色表示未知电平。

2、小时校对:

电子钟实验报告

小时校对

按下SW1,即进行小时校对,校时脉冲T=2s,上图为校时至03:00:10时的截图。

3、分校对:

电子钟实验报告

分校对

按下SW2,即进行分校对,校时脉冲T=2s,上图为校时至03:03:20时的截图。

4、仿电台整点报时(低音频):

电子钟实验报告

仿电台整点报时(低音频)

先按下SW2,将时间校对至03:59:XX,然后断开SW2,电路进入正常计时状态。上图是电路计时至03:59:51时的截图。由图中可看到:七输入与门输出高电平,使得扬声器电路打开,并且扬声器电路前级的可控二选一数据选择器的控制信号为低电平,使得低音频信号进入扬声器电路,扬声器发出低音频。

5、仿电台整点报时(高音频):

电子钟实验报告

仿电台整点报时(高音频)

上图是电路计时至03:59:59时的截图。由图中可看到:七输入与门输出高电平,使得扬声器电路打开,并且扬声器电路前级的可控二选一数据选择器的控制信号为高电平,使得高音频信号进入扬声器电路,扬声器发出高音频。

四、实物制作

在领到实验器件后,按照整体电路图搭建好了电路。接通电源后,电路能正常工作,说明基本电路部分设计无误。逐项调试了电路的功能,电路符合预期设计。至此,本次设计结束。

①.电路能够正常工作,说明时基电路本身并无任何问题,由此证实了猜想(仿真出现问题是软件的原因造成的)的正确性,①处遗留的问题得以解决。

时分

LED闪烁

秒指示秒

电小

源时分

开校校

关对对

电源

晶体管

蜂鸣器

实物摄像

心得体会:

通过本次设计,我获得了许多心得体会。首先,电路的设计应遵循一定的次序,比如一般来说应首先设计时基电路等。在使用软件进行设计的过程中,会或多或少地遇到这样或那样的问题,在遇到这些问题时,不可盲目下结论,更不可慌张,应冷静对待。运用自己学到的知识去尝试解释问题产生的原因,并尝试解决问题,若尽到自己的最大努力仍无法解决问题,应及时向老师询问解决。其次,电路设计应分模块进行,这样在出现仿真错误时可以很快发现错误源,以便于及时纠正。如本次设计中时基电路在仿真时出现了晶振不起振的问题,但换用555定时电路却一切正常,而反复检查4060电路并无问题,由此才判定有很大的可能性是软件的原因造成的,而之后的实际电路验证了猜想的正确性。然后,在制作实际电路时,往往会遇到困难,一个不小心,几十上百条连线中有一条连接错误,就会导致整个电路无法正常工作,而事实上这是很常见的。在遇到此类问题时,电路设计分模块逐项进行就体现出了优势,我们可以迅速判断出错误出现在哪个模块,然后对该模块进行检查,大大减少了工作量和重复出错的机会。最后,学习专业知识,并不是只用于解一道道繁杂的计算题,而应用于实际电路的设计和制作,在实际设计和制作中体会书本知识的不足,并不断改进,积累经验,这样才能成为一名合格乃至优秀的电子专业人才。

 

第二篇:VHDL电子钟实验报告

期末大作业课程设计实验报告

设计题目:基于VHDL电子钟的设计

目录

一、   概述…………………………………………………………3

1.1目的……………………………………………………………3

1.2课程设计的要求和功能………………………………………3

二、总结…………………………………………………………..3

2.1课程设计进行过程及步骤……………………………………3

2.2所遇到的问题,如何解决问题……………………………….15

2.3体会收获以及建议…………………………………………….15

3.4参考资料(书,网络资料)………………………………….15

三、教师评语………………………………………………………16

四、成绩……………………………………………………………16

一、   概述

1.1目的

1. 基于CPLD系统模块板,设计一个电子钟。来熟悉CPLD的工作原理以及对VHDL的使用。

2. 通过设计出一个电子钟具有校时功能,来巩固分频,键盘扫描,计数,动态扫描等知识内容。

1.2课程设计的要求和功能

设计一个电子钟,能进行正常的时分秒计时功能,分别有六个数码管显示24小时,60分钟,60秒的计数器显示。

利用实验箱系统上的按键实现“校时”、“校分”功能:

(1)按下“SA”键时,计时器快速递增,按24小时循环,进行时校正;

(2)按下“SB”键时,计分器快速递增,按60分循环,进行分校正

(3)按下“SC”键时,秒清零,进行秒校正;

二、总结

2.1课程设计进行及步骤

1.设计提示

系统框图见下

                   

2.系统结构设计描述

(1)系统顶层文件

1.顶层原理图见下

2.各个模块的解释

      (1)五个输入量clk50MHz,SA,SB,SC,reset:

          其中clk50MHz为总体系统提供时钟,并且经过分频来分别对电子钟模块提供时钟,产生一秒一秒的进位信号,对显示模块的计数器提供时钟实现显示模块的扫描功能,对按键去抖动提供时钟,实现键盘扫描的功能。SA,SB,SC用来控制按键,实现按键控制,SA是实现“时”加一,SB是实现“分”加一,SC是实现“秒”清零。Reset是来控制按键功能的使能。

      (2)按键功能模块

三个输入chos ,date0,date1的功能是:chos接受来自按键的信号,若按键按下,则将date0的内容,也就是通过按键产生的脉冲来控制电子钟进行加一,若按键没有按下,则将“秒”分频信号接入电子钟的clk计数输入端,通过时钟脉冲来控制电子钟。

      (3)电子钟计数模块

有5个输入ci,nreset,load,clk,d[7..0],作用分别是ci是使能端,直接接高电位,nreset是复位,load和d[7..0]是用来置数的,clk提供计数时钟,也就是一秒一个脉冲。

输出端有三个,co是进位功能,只有“秒”和“分”模块有效,qh[3..0],ql[3..0]是分位的数字输出端,一个是十位,一个是个位。

      (4)显示模块

输入端有qcnt接受来自计数器的计数实现显示扫描,d0h,d1h,d0m,d1m,d0s,d1s分别是接收的来自“秒”“分”“时”个位十位的数据,seg输出LCD的段扫描结果,SCAN输出LCD位扫描结果。

(2)系统各个模块的VHDL程序

1.显示模块

Library ieee;

Use ieee.std_logic_1164.all;

Use ieee.std_logic_unsigned.all;

Use ieee.std_logic_arith.all;

entity display is

        port(

            qcnt: IN integer range 0 to 7;             --计数值输入

            d0h,d1h,d0m,d1m,d0s,d1s : IN integer range 0 to 9;

             --分位得到的十位数和个位数

            seg: OUT std_logic_vector(6 downto 0);   --7位段码输出

            scan: OUT std_logic_vector(7 downto 0)   --8为位码输出

      );

end display;

architecture a of display is

        signal data: integer range 0 to 10;

begin

    process(qcnt,d0h,d1h,d0m,d1m,d0s,d1s)

    begin

        case qcnt is

            when 0 => scan <= "11111110"; data <= d0h;

            when 1 => scan <= "11111101"; data <= d1h;

            when 2 => scan <= "11111011"; data<= 10;

            when 3 => scan <= "11110111"; data <= d0m;

            when 4 => scan <= "11101111"; data <= d1m;

            when 5 => scan <= "11011111"; data<= 10;

            when 6 => scan <= "10111111"; data <= d0s;

            when others => scan <= "01111111"; data <= d1s;

           

        end case;

    end process;

process(data)

  begin

      case data is

          when 0 => seg <= "0111111";  --0

          when 1 => seg <= "0000110";  --1

          when 2 => seg <= "1011011";  --2

          when 3 => seg <= "1001111";  --3

          when 4 => seg <= "1100110";  --4

          when 5 => seg <= "1101101";  --5

          when 6 => seg <= "1111101";  --6

          when 7 => seg <= "0000111";  --7

          when 8 => seg <= "1111111";  --8

          when 9 => seg <= "1100111";  --9

          when 10 => seg <="1000000";  --

          when others => seg <= "0000000";

       end case;

    end process;

end a;

动态显示计数器部分:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

--  Entity Declaration

ENTITY qcnt_display IS

    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!

    PORT

    (

        clk : IN STD_LOGIC;

        qcnt : buffer STD_LOGIC_VECTOR(2 downto 0)

    );

    -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

   

END qcnt_display ;

--  Architecture Body

ARCHITECTURE cnt_architecture OF qcnt_display IS

BEGIN

PROCESS (clk)

    BEGIN

        IF (clk'EVENT AND clk = '1') THEN

            qcnt <= qcnt+1;

        END IF;

    END PROCESS;

END cnt_architecture;

2. 分位计数模块

“秒”,“分”部分:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_unsigned.all;

--  Entity Declaration

ENTITY counter60 IS

       -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!

       PORT

       (

           ci: in std_logic;

              nreset : IN STD_LOGIC:='1';

              load: IN STD_LOGIC;

              clk : IN STD_LOGIC;

              d   :in std_logic_vector(7 downto 0);

              co: out std_logic;

              qh: buffer std_logic_vector(3 downto 0);

              ql : buffer std_logic_vector(3 downto 0)

       );

       -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

      

END counter60;

--  Architecture Body

ARCHITECTURE counter_architecture OF counter60 IS

      

BEGIN

 co<='1' when ( qh ="0101" and ql ="1001" and ci ='1') else '0';

  process (clk,nreset)

    begin

     if (nreset='0') then

      qh <="0000";

      ql <="0000";

     elsif rising_edge(clk) then

        if (load ='1') then

          qh<= d(7 downto 4);

          ql<= d(3 downto 0);

     elsif(ci='1') then

       if(ql=9) then

        ql<="0000";

       if(qh=5) then

          qh<="0000";

        else

          qh<=qh+1;

        end if;

         else

     ql<=ql+1;

     end if;

   end if;

 end if;

 end process;      

END counter_architecture;

“时”部分:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_unsigned.all;

--  Entity Declaration

ENTITY counter24 IS

       -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!

       PORT

       (

           ci: in std_logic;

              nreset : IN STD_LOGIC:='1';

              load: IN STD_LOGIC;

              clk : IN STD_LOGIC;

              d   :in std_logic_vector(7 downto 0);

              co: out std_logic:='0';

              qh: buffer std_logic_vector(3 downto 0);

              ql : buffer std_logic_vector(3 downto 0)

       );

       -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

      

END counter24;

--  Architecture Body

ARCHITECTURE counter_architecture OF counter24 IS

      

BEGIN

 --co<='1' when ( qh ="0010" and ql ="0011" and ci ='1') else '0';

  process (clk,nreset)

    begin

     --if (nreset='0') then

      --qh <="0000";

     -- ql <="0000";

     if rising_edge(clk) then

        if (load ='1') then

          qh<= d(7 downto 4);

          ql<= d(3 downto 0);

     elsif(ci='1') then

              if(qh=0 or qh=1) then

                     if(ql=9) then

                            ql<="0000";

                            if(qh=2) then

                                   qh<="0000";

                            else

                                   qh<=qh+1;

                            end if;

                     else

                            ql<=ql+1;

                     end if;

              else

                     if(ql=3) then

                            ql<="0000";

                                   if(qh=2) then

                                          qh<="0000";

                                   else

                                          qh<=qh+1;

                                   end if;

                     else

                            ql<=ql+1;

                     end if;

              end if;

   end if; 

end if;   

 end process;       

END counter_architecture;

3. 分频模块

Library ieee;

Use ieee.std_logic_1164.all;

Use ieee.std_logic_unsigned.all;

Use ieee.std_logic_arith.all;

Entity fdiv_duo is

  port(

        clkin:        IN std_logic;

        clkout_200HZ:  buffer  std_logic;--键盘去抖动

        clkout_1KHZ :  buffer  std_logic;--显示模块计数器

        clkout_10HZ :  buffer  std_logic;--按键选择

        clkout_1HZ  :  buffer  std_logic --计数器模块

        );

End fdiv_duo;

Architecture a of fdiv_duo is

  signal cnt_1HZ   : natural range  0 to 24999999 ;

  signal cnt_10HZ  : natural range  0 to 249999999;

  signal cnt_1KHZ  : natural range  0 to 24999;

  signal cnt_200HZ : natural range  0 to 124999;

 

Begin

  process(clkin)

  begin

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

          if cnt_1HZ=24999999 then

            cnt_1HZ<= 0;

            clkout_1HZ<= not clkout_1HZ;

          else

             cnt_1HZ<= cnt_1HZ + 1;

          end if;

          if cnt_10HZ=249999999 then

            cnt_10HZ <= 0;

            clkout_10HZ <= not clkout_10HZ;

          else

             cnt_10HZ <= cnt_10HZ + 1;

          end if;

          if cnt_1KHZ=24999 then

            cnt_1KHZ<= 0;

                 clkout_1KHZ <=not clkout_1KHZ;

               else

                  cnt_1KHZ <=cnt_1KHZ + 1;

               end if;

               if cnt_200HZ=124999 then

                  cnt_200HZ <= 0;

                 clkout_200HZ<= not clkout_200HZ;

               else

                  cnt_200HZ <= cnt_200HZ + 1;

               end if;

            end if;

       end process;

End a;

4. 键盘控制模块

时钟和分钟的键盘去抖动和“增益”,“清零”控制部分:

Library ieee;

Use ieee.std_logic_1164.all;

Use ieee.std_logic_unsigned.all;

Use ieee.std_logic_arith.all;

Entity debounce is

  port(

        clk200hz ,reset  :  IN std_logic;  --200HZ时钟

        din         :  IN std_logic;

        dout        :  OUT  std_logic);

End debounce;

architecture  a of debounce is

     type  state  is (S0, S1, S2);--定义状态机类型

     signal  current : state;

begin

    process (clk200hz,reset,din)

      begin

        if(reset='1') then  --状态机复位 dout输出信号复位 

           current<=S0;

           dout<='1';      

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

           case current is

             when S0=>

                 dout<='1';

                 if(din='0') then

                   current<=S1;

                 else

                   current<=S0;

                 end if;

              when S1=>

                  dout<='1';

                  if(din='0')then

                    current<=S2;

                  else

                    current<=S0;

                  end if;

              when S2=>

                  dout<='0';

                if(din='0') then

                  current<=S2;

                else

                  current<=S0;

                end if;

              when others=>

                 dout<='1';

                current<=S0;

            end case;

        end if;      

     end process;

 end a;        

作用解释:当检测到按键被按下时,将按键的输出直接给计数模块的时钟控制通过按键控制计数时钟从而实现“增益”功能,如果没有检测到有效按键,“时”和“分”计数模块就受进位信号的控制。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity choose is

port

(chos: in std_logic;

       date0,date1:in std_logic;

       dout:out std_logic);

end choose;

architecture behave of choose is

begin

       with chos select

              dout <=date0 when '0',

                        date1 when others;

end behave;

“清零”功能的实现利用按键信号去控制“秒”模块的“复位”。

(3)实验效果图

22-01-27时按下秒钟清零

继续按分钟增益按钮,使分钟从1加到9

然后按时钟增益,使时钟从22加到下一轮的9时

2.2所遇到的问题,如何解决问题

(1)在分频时,如果键盘去抖动频率设计不合适会造成按键不灵敏,如果显示部分频率设置不好也会造成显示时音频率过快数字不清楚。

解决办法:虽然实现分频的程序很多,但是有些程序的分频效果并不是很好,我这里用的是偶数分频器的第二种方法(取反或加一

(2)在设计时分秒的模模块时,因为我采用的是BCD计数器,所以在实现“分秒”的60进位比较容易,但是在实现“24小时”要注意,不然很容易出现时位为“1,2,3,11,12,13”的变化。

解决办法:

设计一个进位清零判断,是个位到了9需要清零还是到了3需要清零,取决于十位0和1还是2.

2.3体会收获以及建议

通过设计电子钟,重温了动态显示的设计、模计数器的设计以及按键去抖动设计,这里面主要的部分在于对电子钟按键控制,通过设计一个模块来判断按键是否有效后利用进位变量去触发计数器实现增益功能,或者利用判断按键是否有效将模计数器结果清零来实现置零功能。

在设计中,有很多细节问题会决定实验效果,所以一定要认真,多思考,并且要善于和同学交流讨论,可能自己在设计时会遇到盲区,需要别的同学的指点,比如我在设计按键功能判断时就向夏良飞同学请教了他的设计思路,然后再根据自己的理解设计出来选择器来实现按键控制功能。

3.4参考资料(书,网络资料)

《现在电子系统设计》

三、教师评语

四、成绩

相关推荐