数字模拟混合语音实验多用开发板设计报告实验电路图程序_第1页
数字模拟混合语音实验多用开发板设计报告实验电路图程序_第2页
数字模拟混合语音实验多用开发板设计报告实验电路图程序_第3页
数字模拟混合语音实验多用开发板设计报告实验电路图程序_第4页
数字模拟混合语音实验多用开发板设计报告实验电路图程序_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验设计报告项目名称: 数字模拟混合(语音)实验多用开发板设计报告 作者姓名: 指导教师: 年级专业: 所在学院: 提交日期 摘要所谓语音,就是指语言的物质外壳,是语言符号系统的载体。它由人的发音器官发出,负载着一定的语言意义。语音的物理基础主要有音高、音强、音长、音色,这也是构成语音的四要素。一切声音都是由物体的振动发出的,物体振动,振荡它周围的空气,形成音波,音波扩散,刺激到人的听觉神经,人就听到了声音。在语音的四要素中,音色的不同,也就是指声音信号频率的不同。人耳能分辨出的声音频率大约在20Hz到20000Hz,而人所能发出的语音信号频率则大约在300到3000Hz范围之中。作为一个语音

2、信号的储存与回放系统,要解决的问题有:如何得到语音信号、如何处理语音信号、如何储存语音信号、如何回放语音信号。因此在本次实验中,我们将依次解决上述问题。作为实验的载体,值得一提的是,我们将使用一片FPGA数字芯片作为本次试验的核心元件。FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。它以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简

3、单的综合与布局,快速的烧录至 FPGA 上进行测试。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。由于FPGA数字芯片的强大作用,因此从数字电路的角度出发,可以通过它来控制数字芯片ADC、DAC、数字储存芯片以及LED显示和开关等等功能。另外从模拟电子的角度出发,可以另外焊接声音采集电路和声音播放电路,这两块电路中间由模数转换、储存、数模转换三部分相连接,最终即可得到想要的语音回放与储存系统。目 录

4、第一章:设计内容1第二章:方案论证2第三章:单元电路设计与计算13第四章:软件设计20第五章:系统测试36第六章:结论38参考文献39附录40第一章:设计内容1. FPGA控制DAC应用举例锯齿波发生器主要目的为提供FPGA控制DAC数字芯片的示范程序和电路的连接方法,并举一个简单例子,来示范DAC的应用。2.FPGA控制存储芯片应用举例数据存储器本开发板使用的数字存储芯片为HM628128D,此处给出FPGA控制数字存储芯片的示范程序和电路的连接方法,示范如何应用此数字存储芯片。3.模拟信号电压、电流、功率测量此处主要使用本开发板的ADC模块,并应用于对模拟信号的各种测量。4.模拟信号频率测

5、量5.语音储存与回放系统第二章:方案论证2.1 数字钟的基本组成数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路,其基本组成电路图如下所示:图中,秒脉冲发生器产生秒脉冲,作为图中各个计数器的脉冲信号。分、秒计数器要求设计为六十进制计数器;时计数器则设计为二十四进制计数器。时、分、秒的计时结果分别送入译码器中,经译码器翻译后,共由六个LED数码管显示出结果。因此,使用计数器作为计时电路是可以实现的。本次试验采用的是74LS163计数器。2.2 计数器不论想用计数器连接成多少进制的形式,都有两种方案可以进行选择,那就是同步连接方式和异步连接方式。2.2.1 同步连接方式同步连接方式就是把所

6、有的计数器的CP端都接上统一的秒脉冲信号,通过控制使能端等方法来实现控制进制的方法。由于计数器都带有使能端,只有使能时后,收到脉冲信号才能进行计时,而非使能的时刻,即使有脉冲信号,也不能计时。因此,通过低位信号来控制高位信号使能端的电位高低,来决定高位信号是否计时,就能够达到扩展技术范围,达到预定进制要求的目的。下图分别为同步六十进制和二十四进制计数器的连接图:2.2.2 异步连接方式而异步连接方式则是将不同的计数器CP端接上不同的脉冲信号,通常只有最地位的CP端才会直接加上秒脉冲信号,而高位CP端接低位的进位信号作为脉冲信号。此时不论高位还是低位,使能端统一接为高电平使能,当出现低位的进位信

7、号时,高位立即计数一次,这样也能够达到拓展计数范围的目的。下面是异步方式连接的六十进制和二十四进制图:2.2.3 方案比较根据上面的电路图进行初步比较,不难发现,异步连接方式比同步连接方式连线要简单许多。但是,异步连接相当于一种级联,上一级的信号变化对下一级的输出信号有很大的依赖性,并且很容易受到外接的干扰。也就是说其可靠性则比同步方式差很多。因此,出于时钟准确度以及后续功能添加的考虑,我决定所有计数器均连接为同步方式。而具体的六十进制和二十四进制的连线方法,将在下一章仔细阐述。2.3 秒脉冲发生器2.3.1 振荡电路的选择可以产生周期性信号的振荡电路有很多种,如RC振荡器、LC振荡器、石英晶

8、体振荡器、集成运放组成的非正弦波发生器、集成门电路构成的非正弦波振荡电路,以及利用555集成定时器组成的波形发生电路等。但是,在实验基本要求中,有着要实现每天误差不超过±1秒这项指标的要求,平均到每一秒钟,精确度要求大致在10-5次方数量级。这就决定了不能随便使用其他方法的振荡电路,而只能使用精度最高的以晶体振荡器作参考的振荡电路。原因是,晶振电路的振荡频率几乎与外界电路没有关系,而只与晶体本身的形状、密度等状态相关联,因此晶振电路能够有效地屏蔽掉外界干扰,能够达到实验中对精度的要求。常见的晶体振荡器及低频振荡电路如下图所示:2.3.2 分频电路直接用晶体振荡器合成的电路频率很高,没

9、法达到秒脉冲的要求,因此还需要分频电路来控制频率。分频电路,其实与计数电路的原理几乎完全形同。观察下面的基本计数器的波形图就可以发现,计数器的第n位,就能够将原本的脉冲波形将为原来的2的n次方分之一。这就是分频电路的基本原理。本次试验选择CD4060作为分频器使用,它是一个14级二进制计数器,配合我们选择的晶振频率最低的晶振电路,刚好能够将脉冲波形最终变为2Hz,此后只需要在可编程逻辑器件中再进行二分之一分频既能够达到电路的要求。基本的分频电路图如下所示:其具体设计方案会在下一章中详细讨论。2.4 校时电路作为一个时钟,显然应当具有校时的功能。由于时钟电路中,采用的是计数器来进行计时,那么利用

10、技术其引脚的功能,可以选择采用快速脉冲法和置入数据法两种方法来进行时间的调整。(注:其中每一种方法里面,同步连接方式和异步连接方式又会有一定的差别,由于上面已经确定选择用同步连接方式,因此下面都只会讨论同步连接方式中的电路内容。)2.4.1 快速脉冲法快速脉冲法,顾名思义,就是给时和分的计数器的CP端加上一个快速脉冲。由于设计的时钟电路是用计数器对脉冲计数来表示时间的进展,因此,如果加上一个比平时快得多的CP脉冲,那么就能够让它们以比平时快得多的速度进行计时,最终达到时间调整的目的。其基本电路图如下所示:2.4.2 置入数据法而置入数据法,则是利用计数器本身自带的置数端,利用外加的数据拨码盘,

11、将预先想调整的时间拨出,当计数器的置数端收到相应的信号之后,就把预定时间置入电路当中,从而一次性改变电路显示的时间,也能达到时间调整的目的。其基本电路图如下所示:2.4.3 方案选择上面两种方案可以说各有利弊:置入数据法使得调整时间的过程比较简单和直接,做到了用尽可能短的时间来调整,但是由于置入数据需要用拨码开关,因此要把需要的时间转换为二进制输入,而且电路连接也十分复杂。快速脉冲法连接简单,并且校时的方法也比较直观,通过两个按钮,就能直接改变时或者分的数值。缺点是校时过程比较费时,没有置入数据法那么直接。权衡利弊,最终我选择了快速脉冲法来进行校时。2.5 整点报时电路2.5.1 连续五声报时

12、电路连续五声报时电路,即希望在整点到来之前,能够发出五声的迅响信号,在最后一次迅响信号结束的一瞬间,即为整点的时刻。用波形图来表示即如下图:由波形图可以看出,控制信号2的一次脉冲响应,应当能够引起报时电路的一些列响应,毫无疑问需要用到触发器来实现。当控制信号2使得触发器出发后,报时信号随着秒脉冲的进行而开始了每秒钟的报时。当5声报时结束后,达到整点时刻,也就是控制信号1清零的时刻,此时只需要用控制信号一对触发器清零,就可以停止报时信号的响应,最终达到五声报时的目的,其连接电路图如下所示:2.5.2 一声报时电路一声报时电路原理比较简单,只需要在整点的前后一秒中,发出一次迅响信号即可。只需要将秒

13、向分的进位信号以及分向时的进位信号用一个与门连接在一起,就代表了整点的信号。将这个信号作为蜂鸣器的控制信号,就可以方便的实现一声报时电路。其基本电路图如下所示:2.5.3 方案选择关于整点报时电路的选择,并没有特别大的影响,其实选择哪种方案对与电子钟的功能都没有什么太大的改变。因此我主要是从实际出发,感觉整点报时如果连续响五下的话,时间长了必定会让人感到厌倦,特别是晚上会影响人的休息。普通的电子表也全都是一次的整点报时。因此最终我选择的是一声整点报时的方案。2.6 闹钟电路作为一个多功能的数字钟,闹钟应当是一个必备的功能。根据一般闹钟的原理,应当能够控制闹钟是开还是关,同时要能够准确的设定闹钟

14、的时间,闹钟走到这一时刻时会发出持续一分钟的信号,时间过后,闹钟应当自动停止报时。根据上述的要求,首先闹钟应当有一个使能端来控制,就是闹钟的总开关。同时,应当有一个十六位的拨码开关用来输入想要预定的时间(八位设定时,八位设定分)。而在电路内部,无疑就要有一个十六位的数值比较器,用来检测时间是否走到了预定的时间,从而决定是否进行报时。其基本电路如下:注:图中秒脉冲的作用是使蜂鸣器能够每秒迅响一下,而不是一直不停的鸣响,这样效果更好,不会让人感到厌烦。2.7 译码器与显示电路上面已经阐述了计时电路的原理,用了六只计数器来实现。但是,每只计数器只有四个输出端,且输出端的内容是用二进制的形式来代表每一

15、位当前的时间信息。而作为一个数字钟,自然希望能够直接方便的使用十进制方式,用LED数码管来输出。这当然要考虑计数器与数码管之间的连接。2.7.1 译码器的工作原理所谓译码器,就是将一种编码编译成为另一种特定编码的器件。其分类多种多样,其中有一种是专门用于显示电路的,称为显示译码器,其译码结果能够作为LED等显示器件使用,使显示器件显示出特定的结果。但是,并非所有的显示译码器都能够直接作为显示器件的输入。因为显示器件显然是需要一定的功率驱动的,如果译码器本身没有驱动能力,虽然输出结果正确,但是没办法让显示器件显示出想要的结果,这就需要再加上特定的驱动器,才能够最终连接显示器显示结果。为了简便起见

16、,本次试验使用自带驱动器的74LS247显示译码器。74LS247是一种中规模集成译码器电路,它的输入是8421BCD码,输出可用于驱动7段LED共阳极数码管。其基本的引脚结构如下所示:2.7.2 LED数码显示器LED数码显示器的内外结构如下图所示:上面两图就是共阳极LED显示管的结构图。其内部有7段发光二极管,它们的公共端接上阳极,那么当某一路接上低电平时,对应的二极管就能够发光。这就是LED显示管的原理。而共阴极显示管的内部结构基本相同,只是方向变变而已。2.7.3 动态显示法所谓动态显示法,其实是一种利用人的视觉暂留效果,进行轮流显示的一种显示方法。在整个电路中,虽然有六个计数器以及分

17、别与之对应的六个LED显示管,但是只使用一个74LS247显示译码器进行译码。其基本思想就是用一个数据选择器轮流选择相应的计数器结果送入译码器译码,然后再将译码结果送入相应的LED显示管显示,不停地循环。当循环次数足够快时,由于人眼的视觉暂留效果,就能使得六位结果清晰地显示出来。其基本电路图如下所示:2.7.4 静态显示法所谓静态显示法,就是每一个计数器后面,连接一个74LS247显示译码器,此后再连接一个LED显示译码管。这种连接方法应当不用多做解释,是最基本的连接方法。电路图如下所示:2.7.5 方案比较这两种方法也是各有利弊。动态法的内部连接更加复杂,但是大量节约了外部零件,有利于节约成

18、本。静态法则耗费了外部零件,使得电路简单易懂。另一方面,在使用寿命上,由于动态法采取了频闪的方法,因此不论是译码器还是LED显示管的使用寿命都会大幅度削减,因此,我最终选择了使用静态显示电路。2.8 二十四小时制与十二小时制的转换这个功能实现起来其实比较容易,在转变过程中,只有小时的8位数据可能会生一定的改变,而分钟和秒钟则完全不需要变化。因此,关于这个功能的实现方法,基本的设计思路就是首先判断小时的八位数据化为十进制是否超过13,当超过13时,就要减去12,然后再次输出。但是,考虑到前面的电路我都是用电路图连接方式搭成的,因此虽然原理上简单,但实际上想直接减去这个12并不是那么容易。中间需要

19、将八位独立的数据转化为10进制,减去后还要再次化为8个独立数据。因此,不如直接画卡诺图来进行逻辑运算。当确定了各个位的逻辑关系之后,用Quartus2中的Block tool功能,画出一个电路,设置输入端和输出端口后,用VHDL语言来实现。具体方法见下一章。2.9 倒计时电路倒计时功能首先需要的是一个置数端,需要使用者能够方便的将想要的倒计时时间输入到电路当中。为了节省元器件,我将闹钟电路中的16位拨码开关共用,同样也可以作为倒计时的数据输入端。同时,倒计时一般比较精确,因此这16位拨码开关用来控制分钟、和秒钟的输入,也就是说,最大的倒计时间为59分59秒。其次,要考虑的是如何在倒计时的过程中

20、不影响正常的数字钟计时,并且,只有一个LED数码管显示屏,要求能够在正常显示时间和倒计时之间切换。我的做法是在最终数据输出之前,加一个数据选择器,能够通过控制开关,对正常走时的输出端和倒计时的输出端进行选择,这样,及解决了二者互不影响的问题,同时能够方便的进行切换。至于数据选择器,显然需要在很多的位之间进行选择,用市场上通用的原件肯定要用很多块拼接才能够实现,因此,不如使用Block tool功能,自己用语言来编写。最后,就是关于倒计时模块的主体部分可逆计数器。由于市场上的倒计时计数器使用起来已经很方便,因此就不必自己来编写了。我选择的是集成可逆计数器74LS192,其电路图及功能表如下图所示

21、:与加法计数器的不同在于,加法计数器在遇到进位时刻,可以通过清零方式来进行处理,但是加法计数器显然是不行的,只能通过置数端来进行。也就是说,除了刚开始时候,由用户控制置入初始数据之外,还需要连线,使得作为秒钟的减法计数器在到达全0的时候,令分钟位减一,同时其自身能够自动置数为59秒。我设计的实现方案是:首先,在用户置数阶段,会一个专门的按钮,来开启16位拨动开关的置数。而用户置数阶段过后,此按钮弹起,将16位拨动开关锁住,不论其值是什么,到达减法计数器的时候都为0,电路如下所示:图中x即为控制端此后,就可以在减法计数器减为0的时候,更改特定的几位数据,使之成为59,同时开启置数状态即可。因此,

22、一个60进制减法计数器电路应如下图:第三章:单元电路设计与计算3.1 计数器电路前面已经分析,时钟电路需要使用计数器连接为两个六十进制和一个二十四进制电路。因此,下面分别对于两种电路的连接方案进行分析。3.1.1 六十进制计数器由于实验中所用的计数器74LS163的最大计数范围是16进制,两片计数器合在一起最大计数范围是256,因此不论是六十进制还是二十四进制都需要用两片LS163才能满足要求。对于六十进制计数器,同时要求LED数码管能够准确的显示从0到59的数据,那么显然两片LS163,低位那一片应当连接成十进制计数,高位那一片应当连接成六进制计数。低位的九进制计数,可以采用清零法来实现。由

23、于是同步清零方式,因此在计数器输出1001时,就要做好清零的准备,当下一个脉冲上升沿到来的时候,使得计数器清零,就能够实现从0到9的十进制计数。因此,连接好的电路图应如下所示:同理对于高位的六进制,需要在出现0110的前一时刻准备好清零即可。但是要注意的是,因为采用的是同步连接方式,因此倘若像之前那样直接在0101时刻做好清零准备,那么计时器计时到51的瞬间就会发生高位清零,这样显然是错误的结果。正确的方法应当是高位和地位同时对高位清零端进行控制,在电路计数到59的瞬间做好清零准备,此后再收到一个秒脉冲,同时发生高位和低位的清零,就能够达到想要的结果了。因此,六十进制计数器电路图如下:上图的电

24、路,是秒计时的六十进制计数器连接,而分计数的计时器,由于每一次变化都相当于扩大了六十倍,因此,除了上述基本的连线之外,使能端都要加上秒计数器的进位信号进行控制。原本直接接电源的直接接上秒计数器进位信号;原本就是由信号控制的,应添加与门,与秒计数器进位信号相与,才能达到扩大六十倍的效果。六十进制计数器的连接和仿真结果如下图所示:3.1.2 二十四进制计数器其基本原理同六十进制计数器基本相同,也都是采用清零法来实现的。唯一不同的是,由于显示时间的需要,因此二十四小时计数器不能采用整循环来计数,低位仍然需要采用十进制计数,高位前两次循环可以进行到底,但当第三次循环,即高位为二时,低位计数到三,就要发

25、生整体的清零,因此接线会更复杂一点。首先将低位仍然连接成十进制的形式,同时,根据六十进制计数器里面的分析过程,当高位和低位达到23时,并且分、秒计数器都达到59的一瞬间,高位和低位都要做好清零的准备。因此,不仅要将分计数器的进位信号引入,并且低位的十进制计数器也需要做出一点改变,将清零端的非门改变成或非门来应对两种清零状态的需要。其最终的连接电路图如下:注:其中的秒脉冲信号与前面的分、秒计数器都采用相同的脉冲信号,而时使能端则是分计数器提供的进位信号。二十四进制电路的连接以及仿真结果如下图所示:3.2 校时电路在上一章里面,我已经确定了要选择快速脉冲法来进行电路的校时。同时,为了方便起见,我希

26、望能有两个按钮开关,来分别控制时和分计数器,能够使它们分别快速校时。又根据前面的电路连接情况不难发现,在同步连接方式下,让高位计数器计数缓慢的原因在于其使能端是否处于使能状态。倘若使能端总是处于使能状态,那么高位的计数器也能够像低位计数器一样每一秒都会发生计数。从这个角度出发,不难想出,首先让按钮开关按下时能够产生一个高电位,然后用连线将按钮开关与原本时和分计数器的是能控制端用一个或门连接起来。这样既不会影响到原本的计数器技术状态,又能够在按下开关的时候快速的调整时间。3.3 整点报时上一章中已经决定使用一次迅响信号来进行报时,报时电路的设计也非常简便,只需要确定整点到来的那一个瞬间就好了。关

27、于整点到来的位置确定,最简便的方法就是利用计时电路中的进位端。由于是同步连接方式,每当到达59秒那一刻时,秒计数器就会产生向分计数器的高电平进位信号;而到达59分时,分计数器也会产生向时计数器的高电平进位信号。因此,将秒和分的进位信号用一个与门连接起来,其合成信号就是每一个小时的59分59秒,即为整点时刻,可以控制蜂鸣器进行整点报时。其整点报时的响时结果仿真如下:3.4 闹钟电路根据前面提到的闹钟持续一分钟的报时要求,可以知道,每次设定闹钟只需要设定时和分的时间,当到达这一特定分钟时,进行报时。因此,首先需要的是一个十六位的拨码开关,用来输入小时和分钟的时间,到数字钟走时达此时间时就会开启闹钟

28、响时。因此,根据原理判断,肯定需要一个三十二位的数值比较器,来判断到底走时时间是否与闹钟设定时间相同。因为实际的数值比较器的位数都不能够达到如此之高,因此,我就自己画了一个数值比较器,其图如下所示:关于这个数值比较器内部的程序书写,我将在下一章里面详细解释。其功能,就是用A0到A15口接收时钟电路的小时和分钟数位,用B0到B15接收拨动开关提供的闹钟数位信息。当这两组信息按位相比较完全相同时,输出端Z为高电平,控制蜂鸣器响时。仿真结果如同下图所示:3.6 倒计时电路3.6.1 主体计数部分在上一章里面,我已经对倒计时电路的实现方法做了详细的说明,这一章里,就着重分析一下电路的具体链接。由于我所

29、用到的74LS192,本身就是一个十进制可逆计数器,也就是说,在没有其他干扰的情况下计数,就能够实现十进制。因此,倒计时的秒钟和分钟的个位都无需什么特别的连接,只需要让它正常倒计时即可。而十位方面,则需要将原本的十进制改变为六进制。观察74LS192的功能表可以发现,它是一个异步置数的逻辑器件,因此,需要在电路由0000变成1001的一瞬间,发生置数,使之变成0101即可。同时,我前面也已经提到,我已经用了一些列与门将拨码开关的置数端锁住,因此,中途产生置数状态时,不加干涉的数位会自动清零。那么我只需要把第一位和第三位设置为1,就能够达到所需的结果了。连接好的六进制减法计数器如下图所示:把上面

30、的电路图作为高位,再把另一片74LS192作为地位,并且将低位的借位输出端BO(BO = Q0 Q1 Q2 Q3 CPD)连接到高位的CPU作为使能端的控制,就能够最终实现啊60进制的减法计数器了。并且,当四片计数器倒计时都达到0时,应当使CPD由原来的时钟脉冲变成高电平1,这样就能够使计数器保持0不变,不至于再次从0变成59分59秒的状态。最终电路图及仿真结果如下所示: 切换LED显示器由于只有一块LED显示器,因此显然不能够同时显示倒计时和正常的数字钟计数,因此还需要一个显示器切换模块。其工作原理就是一个数据选择器,输入端包括正常数字钟的24位数据和倒计时的16位数据,还要有几个控制端作为

31、用户选择。而其输出端,则就是24位数据输出,这24位数据作为最终输出数据,送到LED显示器上,使其做出相应的显示。如此庞大的一个数据选择器,用标准逻辑器件肯定是不容易实现的,因此我采用Block tool功能,绘制一个数据选择器如下图所示:至于其内部的程序编写,则十分的简单。只需要判断当正常走时控制端为高电平时,输出数据选择计时电路的输入数据;当倒计时控制端为高电平时,输出数据选择倒计时电路的输入数据即可。具体程序在下一章列出。3.7 十二进制计时与二十四进制计时的转换前面已经分析了,对于我这样连电路图的方法,想要达成十二进制计时与二十四进制计时的转变,需要画出卡诺图,按位来进行转变,因此先要

32、画卡诺图。首先,当小时的高位为0001时,小时的第四位应发生如下变换:变换控制端变换前变换后H3H2H1H0H3H2H1H0000000000100010100110001101000010101010011101100100101110101110000110110010111不难发现,H3在变换后始终为0,因此只需做出210的卡诺图即可。做卡诺图如下:如果前面已经有了前提条件,即是在小时高位为0001,且变换控制端为1的前提下,那么图中空白处都是无关项,不会造成影响。由卡诺图不难得出:H2 = H3 + H2*H1,H1 = H3 + H2*H1,H0 = H0。在程序中写出此变换即可,只

33、要别忘记要将高位的H4从1变为0即可。而当小时的高位为0010时,低位只有0000、0001、0010、0011四种情况,分别变换为1000、1001、0000、0001,同时,小时的高位在前两种情况应变为0000,后两种情况变为0001即可,十分简单。具体程序将在下一章里书写。同时,为了不再继续增加前面编写的数据选择器的位数,我决定将这个程序直接写在数据选择器的模块里面,成为一个多功能的选择器。3.8 LED显示电路前面已经详细分析了LED显示器的工作原理,在这里我就只说明一下关于电阻大小的计算。由于内部发光器件为放光二极管,因此控制流经放光二极管中的电流大小是一件很重要的事情,如果电流太小

34、,那么放光二极管可能亮度过低,不容易分辨;电流过大,则容易将其烧坏。我在网上查找到,LED数码管点亮时的电流应在0.018A左右。同时,当点亮时,由于输出高电平在5V左右,减去数码管分到的电压(约为0.7V),再除以电流大小,最终应当串联的电阻大小为240左右。因此,最终焊接的LED数码显示管如下图所示:第四章:软件设计4.1 数值比较器电路前面已经提到,在闹钟电路中,需要用到一个32位数值比较器,以便于确定到底什么时候应该响时,用Block Tool画出的电路图就如下所示:程序流程图如下所示:按位判断32位输入数据是否分别相同Z输出为高电平Z输出为低电平是否再次判断再次判断其内部程序为:EN

35、TITY alarm1 ISPORT(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

36、 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 BodyA

37、RCHITECTURE alarm1_architecture OF alarm1 ISBEGINPROCESS(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)BEGINIF(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(A

38、7 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,警告我说我对输入端口的数据进行了操作,但是

39、这些端口没有在敏感信号列表当中,于是我将其添加进去就解决了问题。而程序的主体部分,只是将A与B的所有对应位进行异或操作,同时输出端是所有这些异或结果的与。这样,只要有一位数据不对应,那么Z输出端输出就为0,闹钟不会响。只有全部相同时,输出才为1。而CAN是闹钟的开关,上述功能是在CAN为高电平时才能工作,若CAN为低电平,则闹钟永远不会响。至于CAN的控制端,将在下一个模块中提到。4.2 数据选择器前面已经提到,这个数据选择器已经经过了我的改造,使得它成为了整个电路的显示控制模块,通过控制两个总的控制开关,可以控制数字钟显示正常的走时、倒计时、十二进制与二十四进制转换以及闹钟的功能之间的转变。

40、其基本的流程图如下所示:根据两个总控制端的信息进行四选一twelve= 0CHAN=0twelve= 1CHAN=0twelve= 0CHAN=1twelve= 1CHAN=1显示正常走时结果。直接输出走时电路的24位数据。并控制按钮开关A和B为快速校时功能。采用12进制计时显示。对正常走时数据结果进行预定的处理,然后再输出,并控制按钮开关A和B为快速校时功能显示倒计时。直接输出倒计时电路中的16位结果,小时的8位输出始终为零。并控制按钮开关和为置数和倒计时控制功能显示闹钟调整。直接输出16位拨码开关的结果,秒钟8位输出始终为零。并控制按钮开关A为闹钟的总开关下面先列出它的引脚,然后我会分模块

41、对它的功能进行分析。LIBRARY ieee;USE ieee.std_logic_1164.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 :

42、IN STD_LOGIC;A11 : IN STD_LOGIC;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 :

43、 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_

44、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

45、 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 :

46、 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

47、 choice;- Architecture BodyARCHITECTURE choice_architecture OF choice IS SIGNAL a: STD_LOGIC; SIGNAL b: STD_LOGIC; SIGNAL c: STD_LOGIC;BEGINPROCESS(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,

48、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是内部控制端,控制是否快速校时。下面分模块对程序进行分析显示倒计时其基本流程如下

49、图所示:倒计时模块小时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

50、 <= 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' H

51、6 <= '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 <= '

52、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

53、' 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 十二进制计时与二十四进制计时转变其基本流程图如下所

54、示: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;

55、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

56、<= '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(A1

57、6 = '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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论