1、泉 州 师 范 学 院毕业论文(设计)题目 基于 FPGA 的电子琴 设计物理与信息工程 学院 电子信息科学与技术 专业 2007 级学生姓名 吴丽萍 学号 070303051 指导教师 曾永西 职称 讲师 完成日期 2011 年 3月 30日 教务处 制1基于 FPGA 的电子琴 设计泉州师范学院 电子信息科学与技术专业 070303051 吴丽萍指导教师 曾永西 讲师【摘要】介绍了基于 FPGA 的电子琴的工作原理和设计过程。用 Altera 公司的 EP2C8Q208C8N 芯片为核心器件,通过 运用硬件编程语 言 VHDL 描述, 在 Quartus II 平台上,实现了电子琴的手动弹
2、奏和自动演奏功能。本系统 主要由音频发生模 块, 键盘控制模块和存储器模块组 成。选择手动弹奏模式按键时,按下音符键后就会选通相应的频率输出;选择自动演奏模式按键时,储存器会将编写好的音乐信息依次取出,去选通各个对应的频率输出,实现自 动演奏。音 频发生器由分频器来实现 ,可产生 16 个频率,这些频率经放大后驱动喇叭,从而 发出声音。【关键词 】FPGA;Quartus II ;VHDL;电子琴; 音符2目录第 1 章 引言 31.1 课题分析 31.2 VHDL 语言和 QUARTUS II 环境简介 .31.2.1 VHDL 简介 31.2.2 Quartus II 简介 .3第 2 章
3、 方案选择及原理分析 42.1 方案比较 .42.2 电子琴设计原理 .42.2.1 分频模块设计方法 52.2.2 按键模块设计方法 .62.2.3 顶层模块设计方法.62.3 系统设计的主要组成部分 6第 3 章 硬件设计 63.1 现场可编程门阵列 FPGA 简介 .63.2 按键模块及其功能 73.3 显示电路模块及功能 7第 4 章 软件设计 74.1 系统的流程 74.2 设计模块 74.2.1 自动演奏模块 .94.2.2 音阶发生器模块 .94.2.3 数控分频模块 .10第 5 章 软硬件的系统测试 10结论 10参考文献 11致谢 11附录 I歌谱 12附录电路图 14附录
4、 III程序 143第一章 引言电子琴作为音乐与科技的产物,在电子化和信息化的时代,为音乐的大众化做出了很大的贡献,歌曲的制作大多数都要由电子琴来完成,然后通过媒介流传开来,电视剧和电影的插曲、电视节目音效、甚至你的手机铃声,都很可能包含电子琴的身影。1.1课题分析随着电子技术的高速发展,由于 FPGA/CPLD 具有高速、高可靠性、串并行工作方式等突出优点,所以在电子设计中受到广泛的应用,并且它代表着未来 EDA 设计的方向。FPGA/CPLD 的设计采用了高级语言,例如 VHDL 语言,AHDL 语言。从而进一步打破了软硬件之间的界限,加速了产品的开发过程,缩短了设计周期。所以采用 FPG
5、A/CPLD 取代传统的标准集成电路、接口电路已经成为电子技术发展的必然趋势。EDA(电子设计自动化) 代表了当今电子设计技术的最新发展方向,它的基本特征是:设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片集成电路(FPGA/CPLD) 实现。电子琴是数字电路中的一个典型应用。在实际的硬件设计中用到的器件非常多,连线比较复杂,同时会产生比较大的延时,从而造成测量误差较大,可靠性不好。以 EDA 工具作为开发手段,运用 VHDL 硬件描述语言将使整个系统大大简化,提高了电子琴整体的性能和可靠性。1.2 VHDL语言和 QUARTUS II环境简介1
6、.2.1 VHDL语言简介VHDL 是超高速集成电路硬件描述语言,是一种用于电路设计的高级语言。它出现于80 年代后期,最初是由美国国防部开发出来的,是为了供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。VHDL 主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在 FPGA/CPLD/EPLD 的设计中,同时也被一些实力较为雄厚的单位用来设计 ASIC。VHDL 具有多层次描述系统硬件功能的能力,支持自顶向下和基于库的设计特点。其开发流程:在顶层用方框图或硬件语言对电路的行为进行描述后,进行系统仿真验证和纠错。再用逻辑综合优化工具生成具体的门级逻辑电路的网表。
7、然后通过适配器将网表文件配置于指定的目标器件,产生最终下载文件或配置文件。最后把适配后生成的下载或配置文件通过编程器或编程电缆下载到具体的 FPGA/CPLD 器件中去,以便进行硬件调试和验证,而实现可编程的专用集成电路 ASIC 的设计。VHDL 主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL 的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL 系统设计与其他硬件描述语言相比,VHDL 具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统
8、的重要保证。 11.2.2 Quartus II 简介Quartus II 是 Altera 公司的综合性 PLD 开发软件,支持原理图、VHDL、VerilogHDL以及 AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综4合器以及仿真器,可以完成从设计输入到硬件配置的完整 CPLD 设计流程。Quartus II 支持 Altera 的 IP 核,包含了 LPM/MegaFunction 宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。Maxplus II 作为 Altera 的上一代 PLD
9、 设计软件,由于其出色的易用性而得到了广泛的应用。目前 Altera 已经停止了对 Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera 在 Quartus II 中包含了许多诸如 SignalTap II、Chip Editor 和 RTL Viewer 的设计辅助工具,集成了 SOPC 和 HardCopy 设计流程,并且继承了 Maxplus II 友好的图形界面及简便的使用方法。Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。 2
10、第 2章 方案选择及原理分析2.1 方案比较方案一:采用数字逻辑电路制作,用 IC拼凑焊接实现。其特点是直接用现成的 IC组合而成,简单方便,但本系统需用到许多分频器,这就使得需要用到相当多的 IC,从而造成了体积过于庞大,而且连线也会比较复杂。方案二:采用单片机实现,通过软件编程,仿真后将程序用编程器写入到单片机芯片上,该方案成本低,稳定度也比较好,但外围电路多,特别是播放音乐时需要用到大容量的外部存储器,这样就增加了编程难度,调试不够直观,也不够灵活方便。方案三:采用可编程逻辑器件(FPGA)制作,将所有器件集成在一块芯片上,大大减小了电子琴的体积,用 VHDL编程实现时更加方便,而且易于
11、进行功能扩展,并可调试仿真,制作时间大大缩短,因此选用了方案三进行设计。 2.2 电子琴设计原理 乐曲都是由一连串的音符组成,按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。为了准确地演奏出一首乐曲,仅仅让扬声器能够发出声音是远远不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率以及音符持续的时间是乐曲能够连续演奏的两个关键因素。乐曲的 12 平均率规定:每 2 个八度音之间的频率要相差 1 倍,比如简谱中的中音 2 与高音 2。在 2 个八度音之间,又可分为 12 个半音。另外,音符 A(简谱中的低音 5)的频率
12、为 392Hz,音符 E 到 F 之间、 B 到 C 之间为半音,其余为全音。由此可以计算出简谱中从低音 l 至高音 1 之间每个音符的频率。简谱音名与频率对应关系如图 2-1 所示:音名 频率/Hz 音名 频率/Hz 音名 频率/Hz低音 1 262 中音 1 523 高音 1 1047低音 2 296 中音 2 587 高音 2 1175低音 3 330 中音 3 659 高音 3 1319低音 4 350 中音 4 698 高音 4 1397低音 5 392 中音 5 784 高音 5 1568低音 6 440 中音 6 880 高音 6 1760低音 7 494 中音 7 988 高音
13、 7 1976表 2-1 简谱音名与频率的对应关系产生各音符所需的频率使用一分频器来实现,由于各音符对应的频率多为非整数,而分频系数又不能为小数,所以必须将计算得到的分频数四舍五入取整数。若分频器时钟频率5过低,则由于分频系数过小,四舍五入取整数后的误差较大;若时钟频率过高,虽然误差变小,但分频数将会变大。在实际的设计中应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。设计的音乐电子琴选取 12MHZ 的系统时钟频率。在数控分频器模块,首先对时钟频率进行 12 分频,得到 1MHZ 的输入频率,然后再次
14、分频得到各音符的频率。由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动扬声器发声,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频,频率变为原来的二分之一即 0.5MHZ。因此,分频系数的计算可以按照下面的方法进行。以中音 1 为例,对应的频率值为523Hz,它的分频系数应该为:至于其他音符,可由上式求出对应的分频系数,这样利用程序可以很轻松地得到相应的乐声。各音名对应的分频系数如图 2-2 所示:音名 频率/Hz 分频系数 音名 频率/Hz 分频系数中音 1 523 956 高音 1 1047 478中音 2 578 865 高音
15、 2 1175 425中音 3 659 759 高音 3 1319 379中音 4 698 716 高音 4 1397 358中音 5 784 668 高音 5 1586 315中音 6 880 568 高音 6 1760 284中音 7 988 506 高音 7 1976 253低音 5 392 1276 低音 6 440 1136表 2-2 各音名对应的分频系数音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此,要控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数。如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为 0.25 秒,则只需要提供一个 4HZ
16、的时钟频率即可产生四分音符的时长。至于音长的控制,在自动演奏模块,每个乐曲的音符是按地址存放的,播放乐曲时按4HZ 的时钟频率依次读取简谱,每个音符持续时间为 0.25 秒。如果乐谱中某个音符为三拍音长,那又该如何控制呢?其实只要在 3 个连续地址存放该音符,这时就会发三个 0.25 秒的音长,即持续了三拍的时间,通过这样一个简单的操作就可以控制音长了。 32.2.1分频模块设计方法方法一:使用加法计数器。在计数器值小于分频系数值时,保持分频的时钟信号不变,当计数器加到分频系数值时,令分频时钟信号发生跳变,同时将零设为此时的计数器值,这样分频时钟信号就会再次发生跳变。但是这种占空比不等于 50
17、%的信号是无法驱动实验板上的扬声器发声的。方法二:使用减法计数器,计数器的数值由分频系数值向下递减,在减为零时跳变并重新赋值,原理与第一种类似。方法三:先对时钟脉冲进行分频得到 1MHZ的脉冲,然后按照输入的分频系数对 1MHZ的再次分频,得到所需的音符频率,最后在音调输出时再进行二分频,将脉冲展开能够直接得到占空比为 50%的分频信号,将脉冲展宽,使扬声器有足够发生功率。在思索一番后,6最终确定了这一个方案,相比较与以上两种实现方法,这种方法的好处在于能够直接得到占空比为 50%的分频信号。2.2.2按键模块设计方法按键模块在这个系统中的作用是每按下实验板上的一个键,该模块要相应的输出一个分
18、频系数,用程序将该分频系数送到分频模块后将会产生一个特定频率的信号,传送到实验板上的扬声器里,并发出不同频率的声音即音符。由于每输入一个信号,就产生一个特定的输出信号,且每种情况均能罗列,再加上情况总数(电子琴音调个数)不是很大,故我们使 case语句来实现。2.2.3 顶层模块设计方法 顶层模块的设计就是要设计一个顶层模块将各模块进行例化连接,再组成一个协同发挥功能的的整体。我们注意到,分频模块需要一个分频系数,而键入模块将会产生一个分频系数,因此分频系数在整个系统中将既不输入也不输出,在例化时,我们使用一个信号与之相连,这样它就能在模块间传递。2.3系统设计的主要组成部分本设计采用 VHD
19、L 语言编程设计实现,音频发生部分、键输入部分和数码显示部分以外,其余全部在一片 FPGA 芯片上实现。其系统结构如下图 2.3 所示:琴键(16 个)FPGA芯片音乐控制键MUSIC预存储歌曲扬声器发光二极管音阶显示图 2-3 音乐电子琴的系统设计框图硬件系统主要由 FPGA 模块,显示模块,按键模块以及扬声器电路组成。系统结构精简、可靠,而且灵活性高。第 3章 硬件设计3.1 Cyclone II 芯片简介在 Cyclone I 器件系列非常成功的基础上,Altera 公司的 Cyclone II 系列扩大了 FPGA的密度,最多可以达到 68416 个逻辑单元,并且还提供了 622 个可
20、用的输入/输出引脚和1.1M 比特的嵌入式寄存器。Cyclone II 器件的制造基于 300mm 晶圆,采用台积电 90nm、低 K 值电介质工艺,这种工艺技术采用了低绝缘体过程,确保了快速性、有效性和低成本。Cyclone II 器件通过使硅片的面积最小化,所以可以在单芯片上支持复杂的数字系统,而且在成本上还可以和 ASIC 进行竞争。Altera 最新一代低价位的 FPGAcyclone II FPGA7系列,和同类 90nmFPGA 器件相比,它提高了百分之六十的性能和降低了一半的功耗。它的低成本和优化特征使 Cyclone II 系列为各种各样的汽车、消费、通讯、视频处理、测试以及测
21、量、和其他最终市场提供了理想的解决方案。Cyclone II 设备系列拥有以下的特点 :4608 到 68416 LEs 的高密度的结构;嵌入式乘法器;先进的 I/O 口支持;灵活的时钟管理电路;设备的配置; 43.2按键模块及其功能独立式键盘输入电路的 VHDL 程序设计主要包括:键盘去抖电路、输入信息译码电路和 LED 显示被按下等电路组成,其中重点为输入信息译码电路的设计。如图所示独立式键盘电路接口信息为独立的译码电路,译码时只对单键输入进行,该系统中用到了 16 个独立键。如图 3-1 所示是独立式键盘电路图:图 3-1 独立式键盘电路图3.3显示电路模块功能 显示模块主要是由 1 块
22、 74LS48 译码芯片和 1 个共阴极七段 LED 显示器及 1 个发光二极管组成,由七段 LED 显示测量的频率值,发光二极管显示高音的音符。74LS48 是输出高电平有效的中规模集成 BCD 七段显示译码驱动器,74LS48 的输入端是四位二进制信号(8421BCD 码),a 、b、c、d、e、f、g 是七段译码器的输出驱动信号,高电平有效。可直接驱动共阴极七段数码管,使能端全部悬空。74LS48 简图 3-2:图 3-2 74LS48 简图第 4章 软件设计84.1系统的流程本设计采用 Altera 公司的 EDA 软件系统 EP2C8Q208C8 来完成。采用自顶向下的设计方法。图
23、4-1 为其软件流程图:4-1 系统的流程图软件设计采用结构化程序设计方法,功能模块各自独立,实际上在设计中将键盘输入和乐曲存储放在了一个自动演奏模块中,软件设计的核心部分是数控分频器,键盘输入和乐曲储存都是提供给它相应的分频比。对输入的基准时钟进行多次分频,最终输出的就是想得到的音阶的频率。4.2 设计模块本系统主要由三个功能模块组成:music.vhd、tone.vhd 和 speaker.vhd。系统顶层设计原理图如图 4-2 所示,该系统有 4 个输入,3 个输出端口。其原理图如 4-2:9图 4-2 音乐电子琴的系统框图4.2.1自动演奏模块自动演奏模块的作用是产生 8 位发声控制输
24、入 index,handauto 为 0 或 1 时可以选择自动演奏或者键盘输入,如果 auto 为 0,则而由存储在此模块中的 2 位二进制数来作为发声控制输入,由此便可自动演奏乐曲。此模块的 VHDL 语言中包括两个进程,首先是对基准脉冲进行分频得到 4Hz 的脉冲,作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是 1/4=0.25s,第二个进程是音乐的存储,可根据需要编写不同的乐曲,在这里编写了四首歌曲(“世上只有妈妈好” 、 “两只老虎” 、 “小兔子乖乖” 、 “梁祝” ) 。自动演奏模块如图 4-3 所示:图 4-3 自动演奏模块4.2.2 音阶发生器模块音
25、阶发生器的作用是产生获得音阶的分频预置值。当 16 位发声控制输入 index 中的某一位为高电平时,则对应某一音阶的数值将以端口 tone 输出,作为获得该音阶的分频预置值,该值作为数控分频器的输入,来对 0.5MHz 的脉冲进行分频,由此得到每个音阶相应的频率,例如输入 index=“0000000000000010“,即对应的按键是 2,产生的分频系数便是865 由 code 输出对应该音阶简谱的显示数码;由 high 输出指示音阶高 8 度的显示,低电平10有效。音阶发生器如图 4-4 所示:图 4-4 音阶发生器4.2.3数控分频模块数控分频模块的目的是对基准脉冲分频,得到 1,2,
26、3,4,5,6,7 七个音符对应频率。该模块的 VHDL 描述中包含了三个进程。首先对 12MHz 的基准脉冲进行分频得到 1MHz 的脉冲,然后按照 tone1 输入的分频系数对 1MHz 的脉冲再次分频,得到的便是所需要的频率。而第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,以使扬声器有足够功率发音。数控分频模块如图 4-5 所示:图 4-5 数控分频器第 5章 软硬件的系统测试把写好的VHDL程序进行引脚锁定,综合,适配,编程下载,完成之后将FPGA模块、显示模块、按键模块及电源模块连接好,然后通过JTAG 下载模式在线将生成的配置文件写入芯片中。通过不断的反复调试,修改,最终
27、完成本项方案设计。通过设置不同的工作模式,测试手动演奏和自动演奏各个功能,都能正常完成,且有较好音质,各模式之间的切换也正确无误。结论本设计利用硬件描述语言 VHDL 实现了电子琴的自动演奏和键盘输入发音的简易功能,经过编程,综合,仿真,下载,调试,电路板制作,最终做出成品,测试情况良好,能够准确实现音阶的发音功能,可切换到自动演奏存储好的乐曲,可根据需要更改程序从而实现不同乐曲的存储。在设计过程,由于对音乐知识不够熟悉,所以没有实现电子琴那么完美的音乐。在本系统设计调试过程中,软件和硬件都出现了一些小错误。例如在焊接电路时,由于不够细心,把 FPG 的插槽错焊成排针。在软硬件结合调试时,自动
28、弹奏音乐出现了噪音现象,经过仔细检查所有程序,发现了问题出现在分频模块的编写上,最终把这问题解决了。11参考文献1 潘松 黄继业.EDA 技术与 VHDLM.北京:清华大学 2004,1 (2):347-292 潘松 黄继业. EDA 技术实用教程(第三版) M.北京:科学出版社,2006.3 求是科技编著.PLD/FPGA 应用开发技术与工程实践M. 北京:人们邮电出版社,2005.4 黄正谨,徐坚,章小丽等.CPLD 系统设计技术入门与应用【M】. 北京:电子工业出版社.2002.致谢本论文的设计是在我的导师曾老师的亲切关怀和悉心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工
29、作作风,深深地感染和激励着我。从课题的选择到课题的最终完成,曾老师都始终给予我细心的指导和不懈的支持。在此谨向曾老师致以诚挚的谢意和崇高的敬意。同时也要感谢我的同学,当我遇到困难时他们总会给予我帮助,正是由于你们的支持,我才能克服一个一个的困难和疑惑,直至本设计的顺利完成。The keyboard design based on FPGA Institute of Physics and Information EngineeringElectronic Information Science and Technology070303051 LiPingWu Lecturer YongXi Z
30、engAbstract:This paper introduces keyboards on FPGA working principle and design process. Altera company with EP2C8Q208C8N chips for the core device, by using hardware programming language, in Quartus II described VHDL, realized the keyboards on the platform of the manual play and automatic play fun
31、ction. Design main have audio producing module, the keyboard control module and memory modules. Select manual play mode button, press notes key will choose the proper frequency output; Select the auto play mode button, storage containers will be writing good music information in general to choose an
32、d removed every corresponding frequency output, the realization of automatic instrument. Audio generator frequency device to achieve by points, can produce 16 frequency, these frequencies after enlargement drive horn, can sound. Keywords: FPGA; Quartus II; VHDL; Keyboard; Notes 12附录:1.简谱13142.电路图3.程
33、序存储模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUSIC ISPORT ( CLK :IN STD_LOGIC; HANDTOAUTO : IN STD_LOGIC; TONEKEY :IN STD_LOGIC_VECTOR(15 DOWNTO 0); SEL : IN STD_LOGIC_VECTOR(1 DOWNTO 0); TONE_KEY_0 : OUT STD_LOGIC_VECTOR(15 DOWNT
34、O 0); END MUSIC;ARCHITECTURE BEHAVIORAL OF MUSIC IS15COMPONENT LAOHUPORT ( CLK :IN STD_LOGIC; AUTO: IN STD_LOGIC; TONE_KEY2:IN STD_LOGIC_VECTOR(15 DOWNTO 0); TONE_KEY_0: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END COMPONENT;COMPONENT ABCPORT ( CLK :IN STD_LOGIC; AUTO: IN STD_LOGIC; TONE_KEY2:IN STD_LOGIC
35、_VECTOR(15 DOWNTO 0); TONE_KEY_0: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END COMPONENT;COMPONENT mamaPORT ( CLK :IN STD_LOGIC; AUTO: IN STD_LOGIC; TONE_KEY2:IN STD_LOGIC_VECTOR(15 DOWNTO 0); TONE_KEY_0: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END COMPONENT;COMPONENT lianzhuPORT ( CLK :IN STD_LOGIC; AUTO: IN
36、STD_LOGIC; TONE_KEY2:IN STD_LOGIC_VECTOR(15 DOWNTO 0); TONE_KEY_0: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END COMPONENT;COMPONENT MUX21PORT ( a,b,c,d :IN STD_LOGIC_VECTOR(15 DOWNTO 0);S: IN STD_LOGIC_VECTOR(1 DOWNTO 0);16Y: OUT STD_LOGIC_VECTOR(15 DOWNTO 0) ); END COMPONENT;SIGNAL S1,S2,S3,S4:STD_LOGIC_
37、VECTOR(15 DOWNTO 0);BEGINU0:LAOHU PORT MAP(CLK=CLK, TONE_KEY2= TONEKEY, TONE_KEY_0=S1,AUTO=HANDTOAUTO);U1:ABC PORT MAP(CLK=CLK, TONE_KEY2= TONEKEY, TONE_KEY_0=S2,AUTO=HANDTOAUTO);U2:mama PORT MAP(CLK=CLK, TONE_KEY2= TONEKEY, TONE_KEY_0=S3,AUTO=HANDTOAUTO);U3:lianzhu PORT MAP(CLK=CLK, TONE_KEY2= TONE
38、KEY, TONE_KEY_0=S4,AUTO=HANDTOAUTO);U4:MUX21 PORT MAP(a=S1, b= S2,c=S3,d=S4, S=SEL, Y=TONE_KEY_0);END BEHAVIORAL;按键模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TONE ISPORT ( INDEX : IN STD_LOGIC_VECTOR(15 DOWNTO 0); -音符输入信号TUNE_SEG :
39、 out integer range 0 to 15; -音符显示信号HIGH : OUT STD_LOGIC; -高低音显示信号TONE0 : OUT INTEGER RANGE 0 TO 2047); -音符的分频系数END TONE;ARCHITECTURE BEHAVIORAL OF TONE ISBEGINSEARCH :PROCESS(INDEX) -此进程完成音符到音符的分频系数译码,音符的显示,高低音阶17BEGINCASE INDEX ISWHEN “0000000000000000“ = TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 T
40、ONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE0 TONE011 THEN PRECLK=1; COUNT:=0;ELSIF CLK1EVENT AND CLK1=1 THEN COUNT:=COUNT+1;END IF;END PROCESS P1;P2:PROCESS(PRECLK,TONE1) -对 0.75MHZ 的脉冲再次分频,得到所需要的音符频率VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;BEGINIF PRECLKEVENT AND PRECLK=1 THENIF COUNT
41、11=2047 THEN COUNT11:=TONE1 ; FULLSPKS=1; ELSE COUNT11:=COUNT11+1; FULLSPKS=0;END IF;END IF;END PROCESS P2;P3:PROCESS(FULLSPKS) -此进程对 FULLSPKS 进行 2 分频VARIABLE COUNT2: STD_LOGIC:=0;BEGINIF FULLSPKSEVENT AND FULLSPKS=1 THEN COUNT2:=NOT COUNT2;19IF COUNT2=1 THEN SPKS=1;ELSE SPKS=0;END IF;END IF;IF TONE1=2047 THEN COUNT2:=1;END IF;END PROCESS P3;END BEHAVIORAL;