-
实验设计报告
项目名称: 多功能数字钟电路设计 作者姓名: 指导教师: 年级专业: 所在学院: 提交日期 - - 摘要
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。数码管显示的时间简单明了而且读数快、时间准确显示到秒。而机械式的依赖于机械震荡器,可能会导致误差。
数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。数字钟的精度、稳定度远远超过老式机械钟。在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。在此次设计中,电路具有显示时间的其
本功能,还可以实现对时间的调整。数字钟以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
数字钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。
因此,我们此次设计与制做数字钟就是为了了解数字钟的原理,从而学会制作数字钟.而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。且由于数字钟包括组合逻辑电路和时叙电路。通过它可以进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。
- - 目 录
第一章:设计要求„„„„„„„„„„„„„„„ 1 第二章:方案论证„„„„„„„„„„„„„„„ 2 第三章:单元电路设计与计算„„„„„„„„„„ 13 第四章:软件设计„„„„„„„„„„„„„„„ 20 第五章:系统测试„„„„„„„„„„„„„„„ 36 第六章:结论„„„„„„„„„„„„„„„„„ 38 参考文献„„„„„„„„„„„„„„„„„„„ 39 附录„„„„„„„„„„„„„„„„„„„„„ 40
- -
第一章:设计要求 1.1 基本要求 1.1.1 时钟功能
设计一个具有时、分、秒计时的数字钟电路,计时采用24小时制。数字钟用6位LED数码管显示时、分、秒的计时值。那么显然分、秒对应的两块LED数码管应分别设计为十进制和六进制以组成实际生活中的六十进制要求。而时对应的两块LED数码管则应当合在一起满足二十四进制的要求。
1.1.2 准确性要求
设计出的时钟电路要确保高精度的要求,每天的误差不得超过?1秒。 1.2 扩展要求 1.2.1 快速校时
设计出的电子钟应当具有快速校准时间的功能。要求能够快速的对时和分进行校准。 1.2.2 整点报时
每当电子钟走到整点时刻时候,能够发出特定的声音讯号来进行整点报时。 1.2.3 闹铃功能
要求能设定起闹时刻,响闹时间为1min,超过1min自动停止;具有人工止闹功能,止闹后不再重新操作,将不再发生起闹。
1.3 自创功能 1.3.1 倒计时
要求电路能够切换为倒计时状态,倒计时的时间可以自行控制,并且能够随时开启计时或者暂停计时。当倒计时为全零时保持不变。此功能不应该对正常的闹钟走时产生影响。
1.3.2 二十四小时计时制与十二小时计时制转换
要求设计电路,能够快速的在二十四小时制和十二小时计时制之间转变,并且在十二小时制状态,设计一定的区分功能,以便于区别是上午还是下午。
- -
第二章:方案论证 2.1 数字钟的基本组成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路,其基本组成电路图如下所示:
图中,秒脉冲发生器产生秒脉冲,作为图中各个计数器的脉冲信号。分、秒计数器要求设计为六十进制计数器;时计数器则设计为二十四进制计数器。时、分、秒的计时结果分别送入译码器中,经译码器翻译后,共由六个LED数码管显示出结果。因此,使用计数器作为计时电路是可以实现的。本次试验采用的是74LS163计数器。
2.2 计数器
不论想用计数器连接成多少进制的形式,都有两种方案可以进行选择,那就是同步连接方式和异步连接方式。
2.2.1 同步连接方式
同步连接方式就是把所有的计数器的CP端都接上统一的秒脉冲信号,通过控制使能端等方法来实现控制进制的方法。由于计数器都带有使能端,只有使能时后,收到脉冲信号才能进行计时,而非使能的时刻,即使有脉冲信号,也不能计时。因此,通过低位信号来控制高位信号使能端的电位高低,来决定高位信号是否计时,就能够达到扩展技术范围,达到预定进制要求的目的。下图分别为同步六十进制和二十四进制计数器的连接图:
- - U3A
12VCCU1161VCCU3BVCCRSTSN74LS14N9PE341510TCCETVCCU27CEP161VCC2VCCRSTCLKSN74LS14N9U4APE15101143TCCETQ0P073134CEPQ1P122125U4CCLKQ2P29116U4BQ3P3SN74LS08N高位使能
84143Q0P01061348Q1P1GND5125Q2P2SN74LS08N116SN74LS163ANQ3P3SN74LS08N秒脉冲8GND
SN74LS163AN
U5A21U3B3VCCU134161VCCVCCRSTSN74LS02N9PESN74LS14N1510TCCETVCCU27时使能
21CEP161VCCU4A2VCCRSTCLKU6A9SN74LS11N6PESN74LS21N1510143TCCETQ0P07134CEPQ1P12125CLKQ2P21211631Q3P3143Q0P012451348Q1P1GND125时使能Q2P2时使能116SN74LS163ANQ3P3秒脉冲8GND
SN74LS163AN
2.2.2 异步连接方式
而异步连接方式则是将不同的计数器CP端接上不同的脉冲信号,通常只有最地位的CP端才会直接加上秒脉冲信号,而高位CP端接低位的进位信号作为脉冲信号。此时不论高位还是低位,使能端统一接为高电平使能,当出现低位的进位信号时,高位立即计数一次,这样也能够达到拓展计数范围的目的。下面是异步方式连接的六十进制和二十四进制图:
VCCU1161VCCVCCRST9PE1510TCCETVCCU27CEP161VCC2秒脉冲
VCCRSTCLK9PE1510143U3ATCCETQ0P072134CEPQ1P123125CLKQ2P21116U3BQ3P35143Q0P0SN74LS00N分脉冲61348Q1P1GND4125Q2P2116SN74LS163ANQ3P3SN74LS00N
8GND SN74LS163AN - -
U5A23U6B134SN74LS08N
SN74LS14NVCCU1213VCCU2161VCCVCCRST161VCC9VCCRSTPE91510PETCCET15107TCCETCEP7U3A2时脉冲
CEPCLK12122SN74LS00N31CLK143Q0P0143134Q0P0Q1P1134U4A125Q1P1Q2P2125SN74LS10N116Q2P2Q3P3116Q3P38GND8GNDSN74LS163ANSN74LS163AN
2.2.3 方案比较
根据上面的电路图进行初步比较,不难发现,异步连接方式比同步连接方式连线要简单许多。但是,异步连接相当于一种级联,上一级的信号变化对下一级的输出信号有很大的依赖性,并且很容易受到外接的干扰。也就是说其可靠性则比同步方式差很多。
因此,出于时钟准确度以及后续功能添加的考虑,我决定所有计数器均连接为同步方式。而具体的六十进制和二十四进制的连线方法,将在下一章仔细阐述。
2.3 秒脉冲发生器 2.3.1 振荡电路的选择
可以产生周期性信号的振荡电路有很多种,如RC振荡器、LC振荡器、石英晶体振荡器、集成运放组成的非正弦波发生器、集成门电路构成的非正弦波振荡电路,以及利用555集成定时器组成的波形发生电路等。
但是,在实验基本要求中,有着要实现每天误差不超过?1秒这项指标的要求,平均
-5到每一秒钟,精确度要求大致在10次方数量级。这就决定了不能随便使用其他方法的振荡电路,而只能使用精度最高的以晶体振荡器作参考的振荡电路。原因是,晶振电路的振荡频率几乎与外界电路没有关系,而只与晶体本身的形状、密度等状态相关联,因此晶振电路能够有效地屏蔽掉外界干扰,能够达到实验中对精度的要求。常见的晶体振荡器及低频振荡电路如下图所示:
- -
2.3.2 分频电路
直接用晶体振荡器合成的电路频率很高,没法达到秒脉冲的要求,因此还需要分频电路来控制频率。分频电路,其实与计数电路的原理几乎完全形同。观察下面的基本计数器的波形图就可以发现,计数器的第n位,就能够将原本的脉冲波形将为原来的2的n次方分之一。这就是分频电路的基本原理。
本次试验选择CD4060作为分频器使用,它是一个14级二进制计数器,配合我们选择的晶振频率最低的晶振电路,刚好能够将脉冲波形最终变为2Hz,此后只需要在可编程逻辑器件中再进行二分之一分频既能够达到电路的要求。基本的分频电路图如下所示:
其具体设计方案会在下一章中详细讨论。 2.4 校时电路
作为一个时钟,显然应当具有校时的功能。由于时钟电路中,采用的是计数器来进行计时,那么利用技术其引脚的功能,可以选择采用快速脉冲法和置入数据法两种方法来进行时间的调整。
(注:其中每一种方法里面,同步连接方式和异步连接方式又会有一定的差别,由于上面已经确定选择用同步连接方式,因此下面都只会讨论同步连接方式中的电路内容。)
2.4.1 快速脉冲法
快速脉冲法,顾名思义,就是给时和分的计数器的CP端加上一个快速脉冲。由于设计的时钟电路是用计数器对脉冲计数来表示时间的进展,因此,如果加上一个比平时快得多的CP脉冲,那么就能够让它们以比平时快得多的速度进行计时,最终达到时间调整的目的。其基本电路图如下所示:
- -
VCC2选1选择器 R1VCC5.1kX1 Y分(时)计数器 S1分(时)使能X2PBS 2.4.2 置入数据法
而置入数据法,则是利用计数器本身自带的置数端,利用外加的数据拨码盘,将预先想调整的时间拨出,当计数器的置数端收到相应的信号之后,就把预定时间置入电路当中,从而一次性改变电路显示的时间,也能达到时间调整的目的。其基本电路图如下所示:
VCCU1U4116116RSTVCCRSTVCC99PEPER1710151015CETTCCETTC5.1k77CEPCEP秒脉冲2秒脉冲2CLKCLK
314314P0Q0P0Q0S5413413P1Q1P1Q1PB512512P2Q2P2Q2611611P3Q3P3Q3 88GNDGND
SN74LS163ANSN74LS163AN
S1S418182727363545
SW-DIP4SW-DIP4R1~R4R13~R165.1k×45.1k×4 VCCVCC
2.4.3 方案选择
上面两种方案可以说各有利弊:置入数据法使得调整时间的过程比较简单和直接,做到了用尽可能短的时间来调整,但是由于置入数据需要用拨码开关,因此要把需要的时间转换为二进制输入,而且电路连接也十分复杂。快速脉冲法连接简单,并且校时的方法也比较直观,通过两个按钮,就能直接改变时或者分的数值。缺点是校时过程比较费时,没有置入数据法那么直接。权衡利弊,最终我选择了快速脉冲法来进行校时。
2.5 整点报时电路 2.5.1 连续五声报时电路
连续五声报时电路,即希望在整点到来之前,能够发出五声的迅响信号,在最后一次迅响信号结束的一瞬间,即为整点的时刻。用波形图来表示即如下图:
- -
由波形图可以看出,控制信号2的一次脉冲响应,应当能够引起报时电路的一些列响应,毫无疑问需要用到触发器来实现。当控制信号2使得触发器出发后,报时信号随着秒脉冲的进行而开始了每秒钟的报时。当5声报时结束后,达到整点时
刻,也就是控制信号1清零的时刻,此时只需要用控制信号一对触发器清零,就可以停止报时信号的响应,最终达到五声报时的目的,其连接电路图如下所示:
2.5.2 一声报时电路
一声报时电路原理比较简单,只需要在整点的前后一秒中,发出一次迅响信号即可。只需要将秒向分的进位信号以及分向时的进位信号用一个与门连接在一起,就代表了整点的信号。将这个信号作为蜂鸣器的控制信号,就可以方便的实现一声报时电路。其基本电路图如下所示:
LS1VCC单脉冲发生电路
蜂鸣器R1Q1时脉冲CPINCPOUT901310k CLK秒脉冲 2.5.3 方案选择
关于整点报时电路的选择,并没有特别大的影响,其实选择哪种方案对与电子钟的功能都没有什么太大的改变。因此我主要是从实际出发,感觉整点报时如果连续响五下的话,时间长了必定会让人感到厌倦,特别是晚上会影响人的休息。普通的电子表也全都是一次
-
- 的整点报时。因此最终我选择的是一声整点报时的方案。 2.6 闹钟电路
作为一个多功能的数字钟,闹钟应当是一个必备的功能。根据一般闹钟的原理,应当能够控制闹钟是开还是关,同时要能够准确的设定闹钟的时间,闹钟走到这一时刻时会发出持续一分钟的信号,时间过后,闹钟应当自动停止报时。
根据上述的要求,首先闹钟应当有一个使能端来控制,就是闹钟的总开关。同时,应当有一个十六位的拨码开关用来输入想要预定的时间(八位设定时,八位设定分)。而在电路内部,无疑就要有一个十六位的数值比较器,用来检测时间是否走到了预定的时间,从而决定是否进行报时。其基本电路如下:
数值比较器 Q30A0LS1VCC Q63A15
U1BA=B4蜂鸣器R17Q169013510kD30B0SN74LS08N D63B15 秒脉冲
注:图中秒脉冲的作用是使蜂鸣器能够每秒迅响一下,而不是一直不停的鸣响,这样效果更好,不会让人感到厌烦。
2.7 译码器与显示电路
上面已经阐述了计时电路的原理,用了六只计数器来实现。但是,每只计数器只有四个输出端,且输出端的内容是用二进制的形式来代表每一位当前的时间信息。而作为一个数字钟,自然希望能够直接方便的使用十进制方式,用LED数码管来输出。这当然要考虑计数器与数码管之间的连接。
2.7.1 译码器的工作原理
所谓译码器,就是将一种编码编译成为另一种特定编码的器件。其分类多种多样,其中有一种是专门用于显示电路的,称为显示译码器,其译码结果能够作为LED等显示器件使用,使显示器件显示出特定的结果。
但是,并非所有的显示译码器都能够直接作为显示器件的输入。因为显示器件显然是需要一定的功率驱动的,如果译码器本身没有驱动能力,虽然输出结果正确,但是没办法让显示器件显示出想要的结果,这就需要再加上特定的驱动器,才能够最终连接显示器显示结果。
为了简便起见,本次试验使用自带驱动器的74LS247显示译码器。74LS247是一种中规模集成译码器电路,它的输入是8421BCD码,输出可用于驱动7段LED共阳极数码管。其基本的引脚结构如下所示:
- -
2.7.2 LED数码显示器
LED数码显示器的内外结构如下图所示:
上面两图就是共阳极LED显示管的结构图。其内部有7段发光二极管,它们的公共端接上阳极,那么当某一路接上低电平时,对应的二极管就能够发光。这就是LED显示管的原理。而共阴极显示管的内部结构基本相同,只是方向变变而已。
2.7.3 动态显示法
所谓动态显示法,其实是一种利用人的视觉暂留效果,进行轮流显示的一种显示方法。在整个电路中,虽然有六个计数器以及分别与之对应的六个LED显示管,但是只使用一个74LS247显示译码器进行译码。其基本思想就是用一个数据选择器轮流选择相应的计数器结果送入译码器译码,然后再将译码结果送入相应的LED显示管显示,不停地循环。当循环次数足够快时,由于人眼的视觉暂留效果,就能使得六位结果清晰地显示出来。其基本电路图如下所示:
- - VCC R85.1kEN1
LED1Q1739012aA68bA4c2d1e9VCCf显示扫描电路
10g5DPQ10Q10VCCU6VCCR95.1kVCCQ11Q11416BS204EN2BI/RBOVCCQ12Q125RBIQ13Q133LED2Q2LTR110013739012aaAQ071268A0bbAQ11114A1ccQ22102A2ddQ3691A3ee159ffQ60Q60Y0EN181410GNDggQ61Q61Y1EN25R7100DPQ62Q62SN74LS247NVCCQ63Q63BS204Y5EN6CP
CPVCC R135.1kEN6
LED6Q6739012aA68bA4c2d1e9f10g5DPVCCBS204 2.7.4 静态显示法
所谓静态显示法,就是每一个计数器后面,连接一个74LS247显示译码器,此后再连接一个LED显示译码管。这种连接方法应当不用多做解释,是最基本的连接方法。电路图如下所示:
VCCU1VCC416BI/RBOVCC5RBI3LED1VCCLTR115101373aaAQ1071268A0bbAQ111114A1ccQ122102A2ddQ13691A3ee159ff81410GNDgg5R17510DPSN74LS247NVCCBS204
VCCU6VCC416BI/RBOVCC5RBI3LED6VCCLTR615101373aaAQ6071268A0bbAQ611114A1ccQ622102A2ddQ63691A3ee159ff81410GNDgg5R67510DPSN74LS247NVCCBS204
-
- 2.7.5 方案比较
这两种方法也是各有利弊。动态法的内部连接更加复杂,但是大量节约了外部零件,有利于节约成本。静态法则耗费了外部零件,使得电路简单易懂。另一方面,在使用寿命上,由于动态法采取了频闪的方法,因此不论是译码器还是LED显示管的使用寿命都会大幅度削减,因此,我最终选择了使用静态显示电路。
2.8 二十四小时制与十二小时制的转换
这个功能实现起来其实比较容易,在转变过程中,只有小时的8位数据可能会生一定的改变,而分钟和秒钟则完全不需要变化。因此,关于这个功能的实现方法,基本的设计思路就是首先判断小时的八位数据化为十进制是否超过13,当超过13时,就要减去12,然后再次输出。
但是,考虑到前面的电路我都是用电路图连接方式搭成的,因此虽然原理上简单,但实际上想直接减去这个12并不是那么容易。中间需要将八位的数据转化为10进制,减去后还要再次化为8个数据。因此,不如直接画卡诺图来进行逻辑运算。当确定了各个位的逻辑关系之后,用Quartus2中的Block tool功能,画出一个电路,设置输入端和输出端口后,用VHDL语言来实现。具体方法见下一章。
2.9 倒计时电路
倒计时功能首先需要的是一个置数端,需要使用者能够方便的将想要的倒计时时间输入到电路当中。为了节省元器件,我将闹钟电路中的16位拨码开关共用,同样也可以作为倒计时的数据输入端。同时,倒计时一般比较精确,因此这16位拨码开关用来控制分钟、和秒钟的输入,也就是说,最大的倒计时间为59分59秒。
其次,要考虑的是如何在倒计时的过程中不影响正常的数字钟计时,并且,只有一个LED数码管显示屏,要求能够在正常显示时间和倒计时之间切换。我的做法是在最终数据输出之前,加一个数据选择器,能够通过控制开关,对正常走时的输出端和倒计时的输出端进行选择,这样,及解决了二者互不影响的问题,同时能够方便的进行切换。至于数据选择器,显然需要在很多的位之间进行选择,用市场上通用的原件肯定要用很多块拼接才能够实现,因此,不如使用Block tool功能,自己用语言来编写。
最后,就是关于倒计时模块的主体部分——可逆计数器。由于市场上的倒计时计数器使用起来已经很方便,因此就不必自己来编写了。我选择的是集成可逆计数器74LS192,其电路图及功能表如下图所示:
- -
与加法计数器的不同在于,加法计数器在遇到进位时刻,可以通过清零方式来进行处理,但是加法计数器显然是不行的,只能通过置数端来进行。也就是说,除了刚开始时候,由用户控制置入初始数据之外,还需要连线,使得作为秒钟的减法计数器在到达全0的时候,令分钟位减一,同时其自身能够自动置数为59秒。
我设计的实现方案是:首先,在用户置数阶段,会一个专门的按钮,来开启16位拨动开关的置数。而用户置数阶段过后,此按钮弹起,将16位拨动开关锁住,不论其值是什么,到达减法计数器的时候都为0,电路如下所示:
图中x即为控制端
此后,就可以在减法计数器减为0的时候,更改特定的几位数据,使之成为59,同时开启置数状态即可。因此,一个60进制减法计数器电路应如下图:
- -
第三章:单元电路设计与计算 3.1 计数器电路
前面已经分析,时钟电路需要使用计数器连接为两个六十进制和一个二十四进制电路。因此,下面分别对于两种电路的连接方案进行分析。
3.1.1 六十进制计数器
由于实验中所用的计数器74LS163的最大计数范围是16进制,两片计数器合在一起最大计数范围是256,因此不论是六十进制还是二十四进制都需要用两片LS163才能满足要求。
对于六十进制计数器,同时要求LED数码管能够准确的显示从0到59的数据,那么显然两片LS163,低位那一片应当连接成十进制计数,高位那一片应当连接成六进制计数。
低位的九进制计数,可以采用清零法来实现。由于是同步清零方式,因此在计数器输出1001时,就要做好清零的准备,当下一个脉冲上升沿到来的时候,使得计数器清零,就能够实现从0到9的十进制计数。因此,连接好的电路图应如下所示:
同理对于高位的六进制,需要在出现0110的前一时刻准备好清零即可。但是要注意的是,因为采用的是同步连接方式,因此倘若像之前那样直接在0101时刻做好清零准备,那么计时器计时到51的瞬间就会发生高位清零,这样显然是错误的结果。正确的方法应当是高位和地位同时对高位清零端进行控制,在电路计数到59的瞬间做好清零准备,此后再收到一个秒脉冲,同时发生高位和低位的清零,就能够达到想要的结果了。因此,六十进制计数器电路图如下: U3A
12VCCU1161VCCU3BVCCRSTSN74LS14N9PE341510TCCETVCCU27CEP161VCC2VCCRSTCLKSN74LS14N9U4APE15101143TCCETQ0P073134CEPQ1P122125U4CCLKQ2P29116U4BQ3P3SN74LS08N高位使能
84143Q0P01061348Q1P1GND5125Q2P2SN74LS08N116SN74LS163ANQ3P3SN74LS08N秒脉冲8GND
SN74LS163AN
上图的电路,是秒计时的六十进制计数器连接,而分计数的计时器,由于每一次变化
-
- 都相当于扩大了六十倍,因此,除了上述基本的连线之外,使能端都要加上秒计数器的进位信号进行控制。原本直接接电源的直接接上秒计数器进位信号;原本就是由信号控制的,应添加与门,与秒计数器进位信号相与,才能达到扩大六十倍的效果。
六十进制计数器的连接和仿真结果如下图所示:
3.1.2 二十四进制计数器
其基本原理同六十进制计数器基本相同,也都是采用清零法来实现的。唯一不同的是,由于显示时间的需要,因此二十四小时计数器不能采用整循环来计数,低位仍然需要采用十进制计数,高位前两次循环可以进行到底,但当第三次循环,即高位为二时,低位计数到三,就要发生整体的清零,因此接线会更复杂一点。
首先将低位仍然连接成十进制的形式,同时,根据六十进制计数器里面的分析过程,当高位和低位达到23时,并且分、秒计数器都达到59的一瞬间,高位和低位都要做好清零的准备。因此,不仅要将分计数器的进位信号引入,并且低位的十进制计数器也需要做出一点改变,将清零端的非门改变成或非门来应对两种清零状态的需要。其最终的连接电路图如下:
U5A21U3B3VCCU134161VCCVCCRSTSN74LS02N9PESN74LS14N1510TCCETVCCU27时使能
21CEP161VCCU4A2VCCRSTCLKU6A9SN74LS11N6PESN74LS21N1510143TCCETQ0P07134CEP
Q1P12125CLKQ2P21211631Q3P3143Q0P012451348Q1P1GND125时使能Q2P2时使能116SN74LS163ANQ3P3秒脉冲8GND
SN74LS163AN - -
注:其中的秒脉冲信号与前面的分、秒计数器都采用相同的脉冲信号,而时使能端则是分计数器提供的进位信号。
二十四进制电路的连接以及仿真结果如下图所示:
3.2 校时电路
在上一章里面,我已经确定了要选择快速脉冲法来进行电路的校时。同时,为了方便起见,我希望能有两个按钮开关,来分别控制时和分计数器,能够使它们分别快速校时。
又根据前面的电路连接情况不难发现,在同步连接方式下,让高位计数器计数缓慢的原因在于其使能端是否处于使能状态。倘若使能端总是处于使能状态,那么高位的计数器也能够像低位计数器一样每一秒都会发生计数。从这个角度出发,不难想出,首先让按钮开关按下时能够产生一个高电位,然后用连线将按钮开关与原本时和分计数器的是能控制端用一个或门连接起来。这样既不会影响到原本的计数器技术状态,又能够在按下开关的时候快速的调整时间。
3.3 整点报时
上一章中已经决定使用一次迅响信号来进行报时,报时电路的设计也非常简便,只需要确定整点到来的那一个瞬间就好了。
关于整点到来的位置确定,最简便的方法就是利用计时电路中的进位端。由于是同步连接方式,每当到达59秒那一刻时,秒计数器就会产生向分计数器的高电平进位信号;而到达59分时,分计数器也会产生向时计数器的高电平进位信号。因此,将秒和分的进位信号用一个与门连接起来,其合成信号就是每一个小时的59分59秒,即为整点时刻,可以控制蜂鸣器进行整点报时。
其整点报时的响时结果仿真如下:
-
- 3.4 闹钟电路
根据前面提到的闹钟持续一分钟的报时要求,可以知道,每次设定闹钟只需要设定时和分的时间,当到达这一特定分钟时,进行报时。
因此,首先需要的是一个十六位的拨码开关,用来输入小时和分钟的时间,到数字钟走时达此时间时就会开启闹钟响时。因此,根据原理判断,肯定需要一个三十二位的数值比较器,来判断到底走时时间是否与闹钟设定时间相同。因为实际的数值比较器的位数都不能够达到如此之高,因此,我就自己画了一个数值比较器,其图如下所示:
关于这个数值比较器内部的程序书写,我将在下一章里面详细解释。其功能,就是用A0到A15口接收时钟电路的小时和分钟数位,用B0到B15接收拨动开关提供的闹钟数位信息。当这两组信息按位相比较完全相同时,输出端Z为高电平,控制蜂鸣器响时。仿真结果如同下图所示:
3.6 倒计时电路 3.6.1 主体计数部分
在上一章里面,我已经对倒计时电路的实现方法做了详细的说明,这一章里,就着重分析一下电路的具体链接。
由于我所用到的74LS192,本身就是一个十进制可逆计数器,也就是说,在没有其他干扰的情况下计数,就能够实现十进制。因此,倒计时的秒钟和分钟的个位都无需什么特别的连接,只需要让它正常倒计时即可。而十位方面,则需要将原本的十进制改变为六进制。
观察74LS192的功能表可以发现,它是一个异步置数的逻辑器件,因此,需要在电路由0000变成1001的一瞬间,发生置数,使之变成0101即可。同时,我前面也已经提到,我已经用了一些列与门将拨码开关的置数端锁住,因此,中途产生置数状态时,不加干涉的数位会自动清零。那么我只需要把第一位和第三位设置为1,就能够达到所需的结果了。连接好的六进制减法计数器如下图所示:
- -
把上面的电路图作为高位,再把另一片74LS192作为地位,并且将低位的借位输出端BO(BO = QQQQCP)连接到高位的CP作为使能端的控制,就能够最终实现啊60进制0 1 2 3 DU
的减法计数器了。并且,当四片计数器倒计时都达到0时,应当使CP由原来的时钟脉冲D
变成高电平1,这样就能够使计数器保持0不变,不至于再次从0变成59分59秒的状态。最终电路图及仿真结果如下所示:
3.6.2 切换LED显示器
由于只有一块LED显示器,因此显然不能够同时显示倒计时和正常的数字钟计数,因此还需要一个显示器切换模块。其工作原理就是一个数据选择器,输入端包括正常数字钟
-
- 的24位数据和倒计时的16位数据,还要有几个控制端作为用户选择。而其输出端,则就是24位数据输出,这24位数据作为最终输出数据,送到LED显示器上,使其做出相应的显示。
如此庞大的一个数据选择器,用标准逻辑器件肯定是不容易实现的,因此我采用Block tool功能,绘制一个数据选择器如下图所示:
至于其内部的程序编写,则十分的简单。只需要判断当正常走时控制端为高电平时,输出数据选择计时电路的输入数据;当倒计时控制端为高电平时,输出数据选择倒计时电路的输入数据即可。具体程序在下一章列出。
3.7 十二进制计时与二十四进制计时的转换
前面已经分析了,对于我这样连电路图的方法,想要达成十二进制计时与二十四进制计时的转变,需要画出卡诺图,按位来进行转变,因此先要画卡诺图。
首先,当小时的高位为0001时,小时的第四位应发生如下变换: 变换控变换前 变换后 制端 HHHHHHHH3 2 1 0 3 2 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1
不难发现,H在变换后始终为0,因此只需做出,,,的卡诺图即可。 3210 做卡诺图如下: - -
如果前面已经有了前提条件,即是在小时高位为0001,且变换控制端为1的前提下,那么图中空白处都是无关项,不会造成影响。由卡诺图不难得出:H2 = H3 + H2*H1,H1 = H3 + H2*H1,H0 = H0。在程序中写出此变换即可,只要别忘记要将高位的H4从1变为0即可。
而当小时的高位为0010时,低位只有0000、0001、0010、0011四种情况,分别变换为1000、1001、0000、0001,同时,小时的高位在前两种情况应变为0000,后两种情况变为0001即可,十分简单。具体程序将在下一章里书写。
同时,为了不再继续增加前面编写的数据选择器的位数,我决定将这个程序直接写在数据选择器的模块里面,成为一个多功能的选择器。
3.8 LED显示电路
前面已经详细分析了LED显示器的工作原理,在这里我就只说明一下关于电阻大小的计算。
由于内部发光器件为放光二极管,因此控制流经放光二极管中的电流大小是一件很重要的事情,如果电流太小,那么放光二极管可能亮度过低,不容易分辨;电流过大,则容易将其烧坏。
我在网上查找到,LED数码管点亮时的电流应在0.018A左右。同时,当点亮时,由于输出高电平在5V左右,减去数码管分到的电压(约为0.7V),再除以电流大小,最终应当串联的电阻大小为240Ω左右。因此,最终焊接的LED数码显示管如下图所示:
- -
第四章:软件设计 4.1 数值比较器电路
前面已经提到,在闹钟电路中,需要用到一个32位数值比较器,以便于确定到底什
么时候应该响时,用Block Tool画出的电路图就如下所示:
程序流程图如下所示: 按位判断32位输 入数据是否分别相再再 次次同 判判是 否 断断 Z输出为高Z输出为低电 电平 平 其内部程序为: ENTITY alarm1 IS PORT (
A0 : IN STD_LOGIC; A1 : IN STD_LOGIC; A2 : IN STD_LOGIC; A3 : IN STD_LOGIC; A4 : IN STD_LOGIC; A5 : IN STD_LOGIC; A6 : IN STD_LOGIC; A7 : IN STD_LOGIC; A8 : IN STD_LOGIC; A9 : IN STD_LOGIC; A10 : IN STD_LOGIC;
A11 : IN STD_LOGIC; A12 : IN STD_LOGIC; - -
A13 : IN STD_LOGIC; B0 : IN STD_LOGIC; B1 : IN STD_LOGIC; B2 : IN STD_LOGIC; B3 : IN STD_LOGIC; B4 : IN STD_LOGIC; B5 : IN STD_LOGIC; B6 : IN STD_LOGIC; B7 : IN STD_LOGIC; B8 : IN STD_LOGIC; B9 : IN STD_LOGIC; B10 : IN STD_LOGIC; B11 : IN STD_LOGIC; B12 : IN STD_LOGIC; B13 : IN STD_LOGIC; CAN : IN STD_LOGIC; Z : OUT STD_LOGIC );
END alarm1;
-- Architecture Body
ARCHITECTURE alarm1_architecture OF alarm1 IS BEGIN
PROCESS(CAN,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,B0,B1,B2,B3,B4,
B5,B6,B7,B8,B9,B10, B11,B12,B13) BEGIN
IF(CAN = '1')THEN
Z <= (A0 XNOR B0)AND(A1 XNOR B1)AND(A2 XNOR B2)AND(A3 XNOR B3)AND(A4 XNOR
B4)AND(A5 XNOR B5)AND(A6 XNOR B6)AND(A7 XNOR B7)AND(A8 XNOR B8)AND(A9
XNOR B9)AND(A10 XNOR B10)AND(A11 XNOR B11)AND(A12 XNOR B12)AND(A13 XNOR B13); ELSE Z <= '0'; END IF; - -
END PROCESS;
END alarm1_architecture;
这个程序比较简单,因此只作简单说明。首先可以发现在process中的敏感信号列表中,罗列出了很多的信号。这是因为刚开始的时候我只将使能端CAN设置为敏感信号,但是在编译过程中出现了很多很多的warning,警告我说我对输入端口
的数据进行了操作,但是这些端口没有在敏感信号列表当中,于是我将其添加进去就解决了问题。而程序的主体部分,只是将A与B的所有对应位进行异或操作,同时输出端是所有这些异或结果的与。这样,只要有一位数据不对应,那么Z输出端输出就为0,闹钟不会响。只有全部相同时,输出才为1。而CAN是闹钟的开关,上述功能是在CAN为高电平时才能工作,若CAN为低电平,则闹钟永远不会响。至于CAN的控制端,将在下一个模块中提到。
4.2 数据选择器
前面已经提到,这个数据选择器已经经过了我的改造,使得它成为了整个电路的显示控制模块,通过控制两个总的控制开关,可以控制数字钟显示正常的走时、倒计时、十二进制与二十四进制转换以及闹钟的功能之间的转变。其基本的流程图如下所示:
- -
根据两个总控制 端的信息进行四 选一
twelve= 0 twelve= 1 twelve= 0 twelve= 1 CHAN=0 CHAN=0 CHAN=1 CHAN=1
显示倒计时。直显示闹钟调整。显示正常走时结采用12进制计时 接输出倒计时电直接输出16位拨果。直接输出走显示。对正常走时
路中的16位结码开关的结果,时电路的24位数数据结果进行预 果,小时的8位秒钟8位输出始据。并控制按钮定的处理,然后再 输出始终为零。终为零。并控制开关A和B为快输出,并控制按钮 并控制按钮开关按钮开关A为闹速校时功能。 开关A和B为快 ,和,为置数和钟的总开关 速校时功能 倒计时控制功能
下面先列出它的引脚,然后我会分模块对它的功能进行分析。USE ieee.std_logic_11.all; ENTITY choice IS
-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT (
A0 : IN STD_LOGIC; A1 : IN STD_LOGIC; A2 : IN STD_LOGIC; A3 : IN STD_LOGIC; A4 : IN STD_LOGIC; A5 : IN STD_LOGIC; A6 : IN STD_LOGIC; A7 : IN STD_LOGIC; A8 : IN STD_LOGIC; A9 : IN STD_LOGIC; A10 : IN STD_LOGIC; A11 : IN STD_LOGIC;
LIBRARY ieee; A12 : IN STD_LOGIC; A13 : IN STD_LOGIC; A14 : IN STD_LOGIC; - -
A15 : IN STD_LOGIC; A16 : IN STD_LOGIC; A17 : IN STD_LOGIC; A18 : IN STD_LOGIC; A19 : IN STD_LOGIC; A20 : IN STD_LOGIC; A21 : IN STD_LOGIC; A22 : IN STD_LOGIC; A23 : IN STD_LOGIC; B0 : IN STD_LOGIC; B1 : IN STD_LOGIC; B2 : IN STD_LOGIC; B3 : IN STD_LOGIC; B4 : IN STD_LOGIC; B5 : IN STD_LOGIC; B6 : IN STD_LOGIC; B7 : IN STD_LOGIC; B8 : IN STD_LOGIC; B9 : IN STD_LOGIC;
B10 : IN STD_LOGIC; B11 : IN STD_LOGIC; B12 : IN STD_LOGIC; B13 : IN STD_LOGIC; D0 : IN STD_LOGIC; D1 : IN STD_LOGIC; D2 : IN STD_LOGIC; D3 : IN STD_LOGIC; D4 : IN STD_LOGIC; D5 : IN STD_LOGIC; D6 : IN STD_LOGIC; D7 : IN STD_LOGIC; D8 : IN STD_LOGIC; D9 : IN STD_LOGIC; D10 : IN STD_LOGIC; D11 : IN STD_LOGIC; D12 : IN STD_LOGIC; D13 : IN STD_LOGIC; D14 : IN STD_LOGIC; D15 : IN STD_LOGIC; CHAN : IN STD_LOGIC; twelve : IN STD_LOGIC; PUSHA: IN STD_LOGIC; -
-
PUSHB: IN STD_LOGIC; S0 : OUT STD_LOGIC; S1 : OUT STD_LOGIC; S2 : OUT STD_LOGIC; S3 : OUT STD_LOGIC; S4 : OUT STD_LOGIC; S5 : OUT STD_LOGIC; S6 : OUT STD_LOGIC; S7 : OUT STD_LOGIC; M0 : OUT STD_LOGIC; M1 : OUT STD_LOGIC; M2 : OUT STD_LOGIC; M3 : OUT STD_LOGIC; M4 : OUT STD_LOGIC; M5 : OUT STD_LOGIC; M6 : OUT STD_LOGIC; M7 : OUT STD_LOGIC; H0 : OUT STD_LOGIC; H1 : OUT STD_LOGIC; H2 : OUT STD_LOGIC; H3 : OUT STD_LOGIC; H4 : OUT STD_LOGIC; H5 : OUT STD_LOGIC;
H6 : OUT STD_LOGIC; H7 : OUT STD_LOGIC; SETMINUTES : OUT STD_LOGIC; SETHOURS : OUT STD_LOGIC; OPENALARM : OUT STD_LOGIC; ADVICE : OUT STD_LOGIC; DOWNIN : OUT STD_LOGIC; DOWNCAN : OUT STD_LOGIC );
END choice;
-- Architecture Body
ARCHITECTURE choice_architecture OF choice IS SIGNAL a: STD_LOGIC; SIGNAL b: STD_LOGIC; SIGNAL c: STD_LOGIC; BEGIN - -
PROCESS(CHAN,twelve,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15
,A16,A17,A18,A19,A20,A21,A22,A23,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,
D13,D14,D15,PUSHA,PUSHB,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,a,b,c)
BEGIN
这里面,A0到A23这24位数据是正常时钟的24位数据输入端;D0到D15这16位数据是倒计时电路的16位数据输入端;B0到B13是拨码开关的其中14位,还有两位我作为了功能开关,分别对应CHAN与twelve;S0到S7,M0到M7,H0到H7是最终输出到LED显示器的24位数据;PUSHA与PUSHB则是两个按钮开关,同样也属于控制开关;SETMINUTES与SETHOURS是内部控制端,控制是否快速校时。下面分模块对程序进行分析
4.2.1显示倒计时 其基本流程如下图所示: 倒计时模块 小时8位清零,分 钟和秒钟直接输 出倒计时电路中 的16个输出结果
如果按钮B为高如果按钮B始终为 电平 低电平
发出置数信号,产无操作 生一次置数 当接收到按钮A 一次正跳变,开始 倒计时;再次接 收,会暂停 当倒计时到0分0 秒,保持不变
-
- 程序如下:
IF(CHAN='1' AND twelve = '0') THEN --当CHAN=1,twelve=0,开启倒计时 ADVICE <= '0';
S0 <= D0; --此时,显示器最高两位输出都为0,其他几 S1 <= D1; --位则分别输出倒计时计数器的16位数据 S2 <= D2; S3 <= D3; S4 <= D4; S5 <= D5; S6 <= D6; S7 <= D7; M0 <= D8; M1 <= D9; M2 <= D10; M3 <= D11; M4 <= D12; M5 <= D13; M6 <= D14; M7 <= D15; H0 <= '0'; H1 <= '0'; H2 <= '0'; H3 <= '0';
H4 <= '0'; H5 <= '0'; H6 <= '0'; H7 <= '0';
IF(PUSHB = '1')THEN --用PUSHB作为用户的置数控制端,当按下 DOWNIN <= '0'; --PUSHB时,就会发生置数操作 ELSE
DOWNIN <= '1'; END IF;
IF(PUSHA'event AND PUSHA = '1')THEN --用PUSHA作为倒计时开始与暂停的控制端
IF(c = '0')THEN c <= '1'; ELSE c <= '0'; END IF; END IF;
IF(c = '0')THEN --当倒计时结束,都为0时,保持0状态不 DOWNCAN <= '0'; --变
ELSIF(D0 = '0' AND D1 = '0' AND D2 = '0' AND D3 = '0' AND D4 = '0' AND D5 = '0'
- -
AND D6 = '0' AND D7 = '0' AND D8 = '0' AND D9 = '0' AND D10 = '0' AND D11
= '0' AND D12 = '0' AND D13 = '0' AND D14 = '0' AND D15 = '0')THEN DOWNCAN <= '0'; ELSE
DOWNCAN <= '1'; END IF;
由于倒计时的主体部分已经在外边连接完毕,在这个控制模块中,仅仅用于控制其显示以及开始和暂停。因此这一部分的程序是比较简单的。
4.2.2 十二进制计时与二十四进制计时转变 其基本流程图如下所示: 12小时计时制 制
分钟和秒钟直接输 出计时电路的结果
其他 如果小时的高位如果小时的高 为0001,且地位位为0010 大于0010 无需转换,直
按计算好的转换按计算好的方接输出小时位 结果进行转换 式转换 的所有数据 程序如下:
ELSIF(twelve = '1' AND CHAN = '0')THEN --当twelve= 1,CHAN = 0时,切换到
S0 <= A0; --此模块 S1 <= A1; S2 <= A2;
S3 <= A3; --首先秒钟和分钟都不需要变化,因此 S4 <= A4; --输出都为原时钟计数器直接输出 S5 <= A5; S6 <= A6; S7 <= A7; M0 <= A8; M1 <= A9; - -
M2 <= A10; M3 <= A11; M4 <= A12; M5 <= A13; M6 <= A14; M7 <= A15;
IF(A20 = '1')THEN --根据上一章计算的卡诺图进行变换
IF((A19 = '1') OR ((A19 = '0') AND (A18 = '1')) OR ((A17 = '1') AND (A16 =
'1')))THEN H4 <= '0'; H3 <= '0';
IF((A19 = '1') OR ((A18 = '1') AND (A17 = '1')))THEN H2 <= '1'; ELSE H2 <= '0'; END IF;
IF((A19 = '1') OR ((A18 = '1') AND (A17 = '0')))THEN H1 <= '1'; ELSE H1 <= '0'; END IF;
IF(A16 = '1')THEN H0 <= '1'; ELSE H0 <= '0'; END IF;
IF( --为了区分上午和下午,我让时钟在12 进制计时状态下,在下午时刻,每到半点 也会发出一声的报时信号。
A0 = '0' AND A1 = '0' AND A2 = '0' AND A3 = '0' AND A4 = '0' AND A5 =
'0' AND A6 = '0' AND A7 = '0' AND A8 = '0' AND A9 = '0' AND A10 = '0'
AND A11 = '0'AND A12 = '1' AND A13 = '1'AND A14 = '0' AND A15 = '0')THEN
ADVICE <= '1'; ELSE
ADVICE <= '0'; END IF; ELSE H0 <= A16; H1 <= A17; H2 <= A18; H3 <= A19; H4 <= A20; H5 <= A21; H6 <= A22; - -
H7 <= A23; END IF;
ELSIF(A21 = '1')THEN H5 <= '0';
IF((A19 = '0')AND(A18 = '0')AND(A17 = '0'))THEN H4 <= '0'; H3 <= '1'; H2 <= '0'; H1 <= '0'; H0 <= A16;
ELSE H4 <= '1'; H3 <= '0'; H2 <= '0'; H1 <= '0'; H0 <= A16; END IF; IF
(A0 = '0' AND A1 = '0' AND A2 = '0' AND A3 = '0' AND A4 = '0' AND A5 =
'0' AND A6 = '0' AND A7 = '0' AND A8 = '0' AND A9 = '0' AND A10 = '0' AND
A11 = '0' AND A12 = '1' AND A13 = '1'AND A14 = '0' AND A15 = '0')THEN
ADVICE <= '1'; ELSE
ADVICE <= '0'; END IF; ELSE H0 <= A16; H1 <= A17; H2 <= A18; H3 <= A19; H4 <= A20;
H5 <= A21; H6 <= A22; H7 <= A23; END IF;
IF(PUSHB = '1')THEN --这是快速校时的控制,当PUSHB = 1 SETMINUTES <= '1'; --时,能够快速对分钟校时 ELSE
SETMINUTES <= '0'; END IF;
IF(PUSHA = '1')THEN --当PUSHA = 1时,能对小时快速校时 SETHOURS <= '1'; - - ELSE
SETHOURS <= '0'; END IF;
由于要对各个位分别进行逻辑运算,因此程序十分复杂。 在12小时计时制,用校时电路对小时进行快速校时,得到的结果如下图所示:
4.2.3 闹钟电路控制 其基本流程图如下所示: 显示闹钟
秒钟输出全为0,分 钟和小时直接输出16
位拨码开关结果 检测到到一个按 钮A正向跳变 闹钟使能端设定为开, 并在A为高电平期间开 启蜂鸣器响声
如果再次检测到如果再次检测到 A的正向跳变 A的正向跳变 闹钟使能端设定为关, 并在A为高电平期间关 闭蜂鸣器响声 - -
程序如下所示:
ELSIF(twelve = '1' AND CHAN = '1') THEN --当twelve和CHAN同时为1时,开启
S0 <= '0'; --对闹钟的控制 S1 <= '0';
S2 <= '0'; --秒钟全部清零,小时和分钟显示拨 S3 <= '0'; --码开关的数值 S4 <= '0'; S5 <= '0'; S6 <= '0'; S7 <= '0';
M0 <= B0; M1 <= B1; M2 <= B2; M3 <= B3; M4 <= B4; M5 <= B5; M6 <= B6; M7 <= B7; H0 <= B8; H1 <= B9; H2 <= B10; H3 <= B11; H4 <= B12; H5 <= B13; H6 <= '0'; H7 <= '0';
IF(PUSHA'event AND PUSHA = '1')THEN --用PUSHA来控制闹钟的总开关,上 IF(a = '1')THEN --升沿有效 a <= '0'; ELSE a <= '1'; END IF; END IF;
IF(a = '1' AND PUSHA = '1')THEN --当闹钟处于开启状态时,长按PUSHA
b <= '0'; --蜂鸣器会发声作为提醒。若闹钟关闭 ELSE --长按PUSHA,蜂鸣器不会响 b <= '1'; END IF;
IF(a = '1' AND b = '0' AND PUSHA = '1')THEN ADVICE <= '1'; ELSE
ADVICE <= '0'; - - END IF;
IF(a = '1')THEN OPENALARM <= '1'; ELSE
OPENALARM <= '0'; END IF;
由于闹钟的主体电路在别处(前面已经详细讲解),因此此处也仅仅作为控制端,程
序也较简单。
4.2.4 正常的时钟显示
ELSE --剩下一种情况,用于显示正常走时 ADVICE <= '0'; S0 <= A0; S1 <= A1;
S2 <= A2; S3 <= A3; S4 <= A4; S5 <= A5; S6 <= A6; S7 <= A7; M0 <= A8; M1 <= A9; M2 <= A10; M3 <= A11; M4 <= A12; M5 <= A13; M6 <= A14; M7 <= A15; H0 <= A16; H1 <= A17; H2 <= A18; H3 <= A19; H4 <= A20; H5 <= A21; H6 <= A22; H7 <= A23;
IF(PUSHB = '1')THEN --同样应当有校时的控制程序 SETMINUTES <= '1';
ELSE
SETMINUTES <= '0'; END IF; - -
IF(PUSHA = '1')THEN SETHOURS <= '1'; ELSE
SETHOURS <= '0'; END IF; END IF; END PROCESS;
END choice_architecture;
这里基本不用做过多的解释,只是完全输出计时电路的输出而已,同时加上前面已经提到过的校时控制即可。
4.3 二分频电路
在设计秒脉冲电路的时候已经提到,能够实现的频率最小的脉冲信号为2Hz,因此还需要在电路中设计一个虚拟的二分频电路。如下图:
CP信号输入后,先通过这个二分频电路,最终可以得到1Hz的信号。这个二分频电路里面的程序如下:
LIBRARY ieee;
USE ieee.std_logic_11.all; ENTITY f2to1 IS
PORT (
CP2 : IN STD_LOGIC; CP1 : OUT STD_LOGIC ); END f2to1;
ARCHITECTURE f2to1_architecture OF f2to1 IS SIGNAL a: STD_LOGIC; --为了方便描述,定义一个内部 --信号a BEGIN
PROCESS(CP2,a) - - BEGIN
IF(CP2'event AND CP2 = '1')THEN --每一个输入CP的上升沿,使 IF(a = '1')THEN --输出的信号波形翻转 a <= '0'; ELSE a <= '1'; END IF; CP1 <= a; END IF; END PROCESS;
END f2to1_architecture; 得到的结果如下图所示:
- -
第五章:系统测试
在平常的实验室环境下,对电路加上5V的电压,按照电路的各项功能,进行下列测试。
测试的顺序为,控制电路的2个总的控制端,可以调整电路显示出4种不同的状态(正常走
时、12小时制计时、倒计时、闹钟),按照顺序,依次测试每个状态中的所有的功能。
测试步骤和测试结果如下所示: 测试内容 测试结果 编号 测试内容 一 正常走时电路
1 接上电源后电路接上电源的一瞬间,时钟自动从0时0点0分开始 启动情况 启动,并能够按照每秒钟,秒位加一的方式计时。 启动正常。
2 各个位的进位情经过观察,发现秒钟低位每次计时到9后,下一秒 况 清零,同时高位自动加一。当秒钟走时到59时, 下一秒自动清为全0,同时会让分钟低位加一。分 钟情况与秒钟相同。小时两位也都能够满足24小 时的要求,时钟从23小时59分59秒,会自动变 为全0。因此,各位进位都正常。
3 快速校时功能 在任一时刻,长按按钮A,就能够让小时位以每秒
加一的速度进行校时;长按按钮B,能够让分钟位 以每秒加一的速度进行校时。功能正常。
4 整点报时功能 将时钟调整到任意小时的59分,当秒钟也走到59 秒得时候,会发出一声迅响信号。功能正常。 二 12小时计时制 1 观察走时是否正在电路进行12小时计时制和24小时计时制切换的 常 时候,只有小时位会按照正确的方式变化,分钟和 秒钟位都没有受到任何影响,功能正常。
2 快速校时功能 在12小时计时制的状况下,任意时刻,长按按钮A 或B,也都能够得到与之前相同的快速校时功能, 正常。
3 区分上午和下午 当24小时制显示为上午(0点到12点之间)时, 切换到12小时制,当时钟走时到半点时,没有任 何特殊情形发生。但当走时到下午时,每到半点,
数字钟会发出一声迅响信号,作为区分。功能正常。 三 倒计时电路 1 置数的准确性 调整拨码盘的拨码开关,按下按钮B,LED显示器 上能够正确的显示出对应的分钟和秒钟,而小时端 显示全部为0。由于拨码开关的最高两位被我用作 总的功能按钮使用,因此最大的置入数据为39分 - -
59秒。功能正常。
2 开始和暂停倒计在进行置数后的任一时刻按下按钮A,会开始正确 时 的倒计时。而在此按下按钮A,倒计时可以暂停。
3 倒计时的结束状不论从何时开始倒计时,当倒计时计到全0的时候,
态 电路会保持0不变。正常。
4 对于正常走时电在倒计时的任意时刻,切换回原来的走时电路,发 路的影响 现走时电路没有收到任何干扰,仍旧按照原本的走 时规则进行走时。正确。 四 闹钟
1 定时的显示 在闹钟状态下,显示器的小时位和分钟位时钟都会 显示此时拨码开关所拨出的时间,而秒钟位则显示 为0,功能正常。
2 闹钟的开关控制 在闹钟状态下,长按按钮A,如果蜂鸣器发出响声, 表示闹钟为开,此时当时钟走到预定时间时,会产 生报时;如果长按按钮A,没有警告声音,则表示 闹钟为关,不会响时。但是,由于按钮会产生抖动, 因此有时候想调整为开,但是按钮抖动又会使其关 闭。因此,闹钟的开关控制功能不够理想。
3 闹钟的响时 在没有干扰的情况下,闹钟到达预定时间会发出持 续1分钟的报警信号。同时,在响时的任意时刻, 通过上述方法,按按钮A也能够将其关闭。功能正 常。
五 走时精度测量 将振荡电路产生的方波信号直接接到示波器进行 测量,得到的结果为2.0000Hz,证明其准确度至少 在10的负5次方数量级,达到了预定的要求 - -
第六章:结论
最终设计出的数字钟电路经过测试,具备了走时、快速校时、闹钟、整点报时、12进制计时与24进制计时转换、倒计时的功能。各项功能都可以由功能按钮来进行调整,在不同的显示状态下,相同的按钮会有不同的功能,大大节省了元器件的使用量。各个功能之间也没有冲突和影响,特别是对于闹钟的走时不会造成任何干扰,最大限度保证了其走时的精确度。并且数字钟的精准度也达到了标准,产生的振荡波形为准确的2Hz。因此,可以说这个多功能数字钟的最终成果是令人满意的。
存在的不足之处有:1.快速校时的速度不够令人满意,应当接上频率更高的方波,从而做到真正的快速校时。2.没有整点报时功能的开关控制端。3.倒计时结束时,虽然能够控制其保持全零状态不变,但是没有更加有力的提醒措施,最好能够再加上蜂鸣器报警,等有力措施。以上是有待改进的方向。
- - 参考文献
【1】《电子技术综合实践》,浙江大学电工电子基础实验教学中心,阮秉涛,樊伟敏 【2】《集成电子技术基础教程(下册)》,高等教育出版社,王小海,阮秉涛 【3】《基于Quartus ?的FPGA/CPLD设计》电子工业出版社
【4】《EDA技术基础》湖南大学出版社
【5】《EDA技术及应用》清华大学出版社,朱正伟
【6】《EDA技术及可编程器件应用实训》科学出版社,沈明山 【7】《电子技术与课程设计》,电子科技出版社,高吉祥
【8】《电子技术基础数字部分(第四版)》 高等教育出版社,康华光 - -
附录 元器件清单
STALEDDIS.PRJPCB(静态显示板):
品名 型号/参数 数量 备注 独石电容 0.1uF 6 独石电容 1uF 1 电解电容 47uF 1
电阻 510 42 共阳数码管 LG5011BSR 6 用DIP-32插座 插座 DIP-32 2
双排针 2×13 1 显示译码驱动器 74LS247 6 用DIP-16插座 插座 DIP-16 6 连接线 2芯 1 连接线 4芯 6 线路板 StaLedDis 1
ScanLedDis.PRJPCB(动态显示板):
品名 型号/参数 数量 备注 独石电容 1uF 1 电解电容 47uF 1 电阻 100 7 电阻 5.1k 6
三极管 9012 6 共阳数码管 LG5011BSR 6 用DIP-32插座 插座 DIP-32 2
单排针 1×12 1 显示译码驱动器 74LS247 1 用DIP-16插座 插座 DIP-16 1 连接线 2芯 2 连接线 4芯 2 线路板 ScanLedDis 1 CPLD_A.PRJPCB(CPLD_A板):
品名 型号/参数 数量 备注 CPLD板 CPLD_A 1 成品 - -
秒脉冲电路:
品名 型号/参数 数量 备注 独石电容 0.1uF 1 瓷片电容 20pF 2 电阻 20M 1 电阻 510k 1 晶振 32.768k 1 计数器 CD4060 1 用DIP-16插座 插座 DIP-16 1
迅响电路:
品名 型号/参数 数量 备注 电阻 10k 1 三极管 9013 1 蜂鸣器 5V 1 校时与闹铃电路:
品名 型号/参数 数量 备注 电阻 5.1k 2 按钮 6×6×5 2 排阻 5.1k×8 2 拨动开关 DIP8位 2 用DIP-16插座 插座 DIP-16 2 单排针 1×8 2 连接线 4芯 4
实验板:
品名 型号/参数 数量 备注 实验板 SiYanBanA 1 单排针 1×10 1 单排座 1×20 2 导线 1×0.5 1 自取 焊锡丝 1.0 1 -
-
电路图图纸: - -
-
- 最终成品图:
使用说明
电路有两个按钮开关,记为A、B;两个功能拨动开关,记为a、b;还有14个拨动开关,作为置数使用。功能如下:
拨动开关a 拨动开关b 电路状态 按钮A功能 按钮B功能 指数开关 关 关 正常显示时对小时快速对分钟快速无用
间,24小时校时 校时 计时制
开 关 倒计时 开始或者暂置入初始倒设定初始倒 停倒计时 计时数据 计时的分钟
和秒钟 关 开 显示12小时对小时快速对分钟快速无用 计时制 校时 校时
开 开 闹钟 设定闹钟的无用 设定闹钟的 总开关 小时和分钟 位 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务