江西理工大学应用科学学院SOPC/EDA综合课程设计报告设计题目:硬件乐曲自动演奏电路设计设计者:学号:班级:指导老师:王忠锋完成时间:2012年01月6日设计报告综合测试总评格式(10)内容(40)图表(10)答辩(20)平时(20)目录前言....................................................3乐曲硬件演奏电路EDA设计..............................41.设计要求..............................................42.设计方案..............................................43.原理描述..............................................53.1音名与频率的关系..................................53.2控制音长的节拍发生器..............................74.乐曲硬件演奏电路的层次化设计方案......................74.1音乐节拍发生器NoteTabs............................74.2音符译码电路Tonetaba模块........................154.3数控分频模块(speaker)设计.......................184.4乐曲硬件演奏电路顶层电路的设计和仿真..............215.实验总结与心得.......................................246.参考文献.............................................25前言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,以“欢乐颂”乐曲为例,将音乐数据存储到音乐节拍器中,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改音乐节拍器所存储的音乐数据,将其换成其他乐曲的音乐数据,连接到程序中就可以实现其它乐曲的演奏。关键词:FPGA;EDA;VHDL;音乐乐曲硬件演奏电路EDA设计1.设计要求利用可编程逻辑器件FPGA,设计一个乐曲硬件演奏电路。由键盘输入控制音响,同时可自动演奏乐曲。演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。其结构如图所示,该设计产生的音乐选自"欢乐颂"片段。图2.1乐曲演奏电路结构方框图2.设计方案利用FPGA来实现乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符基准时钟12MHZ时钟电路数控分频器音乐节拍产生电路音符译码电路→→→→←→的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。3.原理描述产生音乐的两个因素是音乐频率和音乐的持续时间(即音高和节拍),以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。根据设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。3.1音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如下表所示.表3-1简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1532.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。本设计中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。各音阶频率及相应的分频系数如下表所示。为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。由于最大的分频系数为7644,故采用13位二进制计数器已能满足分频要求。在下面表中除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为8191即可,此时扬声器将不会发声。对于不同的分频系数,加载不同的初始值即可。用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,也是同步计数器的一个常用设计技巧。3.2控制音长的节拍发生器该演奏电路演奏的乐曲是“欢乐颂”片段,其最小的节拍为1拍。将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍(一定是拍的整数倍),如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。4.乐曲硬件演奏电路的层次化设计方案根据层次化的设计思路,可把乐曲硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块(speaker)。下面给出其EDA设计过程:4.1音乐节拍发生器NoteTabs该模块将利用FPGA的片内ROM存放乐曲简谱真值表,由一个二进制计数器为乐曲数据存储器ROM的地址发生器。该计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,随着NoteTaba中计数器按4Hz的时钟频率作加法计数时,即随地址值递增时,乐曲数据ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba,所存储乐曲就开始连续自然地演奏起来。二进制计数器的位数将根据所存放乐曲简谱基本节拍数来决定,对于乐曲“欢乐颂”片段其节拍数为138,即选择计数器的位数为8即可。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYNoteTabsISPORT(clk:INSTD_LOGIC;ToneIndex:OUTINTEGERRANGE0TO15);END;ARCHITECTUREoneOFNoteTabsISSIGNALCounter:INTEGERRANGE0TO138;BEGINCNT8:PROCESS(clk)BEGINIFCounter=138THENCounter=0;ELSIF(clk'EVENTANDclk='1')THENCounter=Counter+1;ENDIF;ENDPROCESS;Search:PROCESS(Counter)BEGINCASECounterISWHEN00=ToneIndex=10;WHEN01=ToneIndex=10;WHEN02=ToneIndex=10;WHEN03=ToneIndex=10;WHEN04=ToneIndex=10;WHEN05=ToneIndex=10;WHEN06=ToneIndex=10;WHEN07=ToneIndex=10;WHEN08=ToneIndex=11;WHEN09=ToneIndex=11;WHEN10=ToneIndex=11;WHEN11=ToneIndex=11;WHEN12=ToneIndex=12;WHEN13=ToneIndex=12;WHEN14=ToneIndex=12;WHEN15=ToneIndex=12;WHEN16=ToneIndex=12;WHEN17=ToneIndex=12;WHEN18=ToneIndex=12;WHEN19=ToneIndex=12;WHEN20=ToneIndex=11;WHEN21=ToneIndex=11;WHEN22=ToneIndex=11;WHEN23=ToneIndex=11;WHEN24=ToneIndex=10;WHEN25=ToneIndex=10;WHEN26=ToneIndex=10;WHEN27=ToneIndex=10;WHEN28=ToneIndex=9;WHEN29=ToneIndex=9;WHEN30=ToneIndex=9;WHEN31=ToneIndex=9;WHEN32=ToneIndex=8;WHEN33=ToneIndex=8;WHEN34=ToneIndex=8;WHEN35=ToneIndex=8;WHEN36=ToneIndex=8;WHEN37=ToneIndex=8;WHEN38=ToneIndex=8;WHEN39=ToneIndex=8;WHEN40=ToneIndex=9;WHEN41=ToneIndex=9;WHEN42=ToneIndex=9;WHEN43=ToneIndex=9;WHEN44=ToneIndex=10;WHEN45=ToneIndex=10;WHEN46=ToneIndex=10;WHEN47=ToneIndex=10;WHEN48=ToneIndex=10;WHEN49=ToneIndex=10;WHEN50=ToneIndex=10;WHEN51=ToneIndex=10;WHEN52=ToneIndex=10;WHEN53=ToneIndex=10;WHEN54=ToneIndex=9;WHEN55=ToneIndex=9;WHEN56=ToneIndex=9;WHEN57=ToneIndex=9;WHEN58=ToneIndex=9;WHEN59=ToneIndex=9;WHEN60=ToneInd