1、4.4乐曲硬件演奏电路顶层电路的设计和仿真 215实验总结与心得 246参考文献 25前 言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用
2、效率非常高的产品。本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,以“欢乐颂”乐曲为例,将音乐数据存储到音乐节拍器中,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改音乐节拍器所存储的音乐数据,将其换成其他乐曲的音乐数据,连接到程序中就可以实现其它乐曲的演奏。关键词:FPGA;EDA;VHDL;音乐乐曲硬件演奏电路EDA设计1设计要求利用可编程逻辑器件FPGA,设计一个乐曲硬件演奏电路。由键盘输入控制音响,同时可自动演奏乐曲。演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。其结构如图所示,该设计产生的音乐选自欢乐颂片段。图2
3、.1乐曲演奏电路结构方框图2设计方案利用FPGA来实现乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。3原理描述产生音乐的两个因素是音乐频率和音乐的持续时间(即音高和节拍),以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和
4、硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。根据设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。3.1 音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音与高音)之间的频率相差一倍在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。另外,音名(简谱中的低音)的频率为440Hz,音名B到C之间,E到F之
5、间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如下表所示.表3-1简谱中的音名与频率的关系音名频率/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由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。若基准频率
6、过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。本设计中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。各音阶频率及相应的分频系数如下表所示。为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。由于最大的分频系数为7644,故采用13位二进制计数器已能满足分频要求。在下面表中除给出了分频比以外,给出了对应于各个音阶频
7、率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为8191即可,此时扬声器将不会发声。对于不同的分频系数,加载不同的初始值即可。用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,也是同步计数器的一个常用设计技巧。3.2 控制音长的节拍发生器该演奏电路演奏的乐曲是“欢乐颂”片段,其最小的节拍为1拍。将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍(一定是拍的整数倍),如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复
8、1)。要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。4乐曲硬件演奏电路的层次化设计方案根据层次化的设计思路,可把乐曲硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块(speaker)。下面给出其EDA设计过程:4.1 音乐节拍发生器NoteTabs该模块将利用FPGA的片内ROM存放乐曲简谱真值表,由一个二进制计数器为乐曲数据存储器ROM的地址发生器。该计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,随着NoteTaba中计数器按4Hz的时
9、钟频率作加法计数时,即随地址值递增时,乐曲数据ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba,所存储乐曲就开始连续自然地演奏起来。二进制计数器的位数将根据所存放乐曲简谱基本节拍数来决定,对于乐曲“欢乐颂”片段其节拍数为138,即选择计数器的位数为8即可。其VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY NoteTabs IS PORT ( clk : IN STD_LOGIC; ToneIndex : OUT INTEGER RANGE 0 TO 15 );END;ARCHITECTURE one O
10、F NoteTabs IS SIGNAL Counter : INTEGER RANGE 0 TO 138;BEGIN CNT8 : PROCESS(clk) BEGIN IF Counter = 138 THEN Counter = 0; ELSIF (clkEVENT AND clk = 1) THEN Counter ToneIndex WHEN 02 = WHEN 03 = WHEN 04 = WHEN 05 = WHEN 06 = WHEN 07 = WHEN 08 = 11; WHEN 09 = WHEN 10 = WHEN 11 = WHEN 12 = 12; WHEN 13 =
11、 WHEN 14 = WHEN 15 = WHEN 16 = WHEN 17 = WHEN 18 = WHEN 19 = WHEN 20 = WHEN 21 = WHEN 22 = WHEN 23 = WHEN 24 = WHEN 25 = WHEN 26 = WHEN 27 = WHEN 28 = 9; WHEN 29 = WHEN 30 = WHEN 31 = WHEN 32 = 8; WHEN 33 = WHEN 34 = WHEN 35 = WHEN 36 = WHEN 37 = WHEN 38 = WHEN 39 = WHEN 40 = WHEN 41 = WHEN 42 = WHE
12、N 43 = WHEN 44 = WHEN 45 = WHEN 46 = WHEN 47 = WHEN 48 = WHEN 49 = WHEN 50 = WHEN 51 = WHEN 52 = WHEN 53 = WHEN 54 = WHEN 55 = WHEN 56 = WHEN 57 = WHEN 58 = WHEN 59 = WHEN 60 = WHEN 61 = WHEN 62 = WHEN 63 = WHEN 64 = WHEN 65 = WHEN 66 = WHEN 67 = WHEN 68 = WHEN 69 = WHEN 70 = WHEN 71 = WHEN 72 = WHE
13、N 73 = WHEN 74 = WHEN 75 = WHEN 76 = WHEN 77= WHEN 78 = WHEN 79 = WHEN 80 = WHEN 81 = WHEN 82 = WHEN 83 = WHEN 84 = WHEN 85= WHEN 86 = WHEN 87 = WHEN 88 = WHEN 89 = WHEN 90 = WHEN 91 = WHEN 92 = WHEN 93 = WHEN 94 = WHEN 95 = WHEN 96 = WHEN 97 = WHEN 98 = WHEN 99 = WHEN 100 = WHEN 101 = WHEN 102 = WH
14、EN 103 = WHEN 104 = WHEN 105 = WHEN 106 = WHEN 107 = WHEN 108 = WHEN 109 = WHEN 110 = WHEN 111 = WHEN 112 = WHEN 113 = WHEN 114 = WHEN 115 = WHEN 116 = WHEN 117 = WHEN 118 = WHEN 119 = WHEN 120 = WHEN 121 = WHEN 122 = WHEN 123 = WHEN 124 = WHEN 125 = WHEN 126 = WHEN 127 = WHEN 128 = WHEN 129 = WHEN
15、130 = WHEN 131 = WHEN 132 = WHEN 133 = WHEN 134 = WHEN 135 = WHEN 136 = WHEN 137 = WHEN 138 = WHEN OTHERS = NULL; END CASE;END PROCESS;音乐节拍发生器的仿真输出波形文件如图4.1(a)所示,分析可知仿真结果正确无误,将以上设计的音乐节拍发生器电路设置成可调用的元件,以备高层设计中使用,其元件符号如图4.1(b)所示(a)(b) 图4.1音乐节拍发生器 (a) 仿真输出波形(b)元件符号图图4.2欢乐颂曲谱4.2 音符译码电路Tonetaba模块音符译码电路即音调
16、发生器实际上是一个查表电路,放置21个音乐简谱对应的频率表,根据该表为数控分频模块(speaker)提供所发音符频率的初始值,而此数在数控分频模块入口的停留时间即为此音符的节拍数,不失一般性,以下VDHL程序中仅设置了“欢乐颂”乐曲全部音符所对应的音符频率的初始值,共16个,每个音符停留时间由音乐节拍发生器的时钟频率决定,在此为4Hz信号,这16个值的输出由对应于音符译码电路的4位输入值Index3.0确定,该值中音符的停留时间由音乐节拍发生器中的音符数据决定,该数据重复的次数为该音符的节拍数,如为2则为四二拍,如为4则为四四拍即全音符。ENTITY ToneTaba IS PORT ( In
17、dex : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC; Tone : OUT STD_LOGIC_VECTOR (12 DOWNTO 0) );ARCHITECTURE one OF ToneTaba ISPROCESS(Index) CASE Index IS WHEN 0000 = Tone=1111111111111 ; CODE; HIGH 在源程序中Index3.0是音乐节拍发生器输出的音符数据; TONE12.0是为数控分频模块提供的音符频率初始值,为方便测试,特设置一个音名代码显示输出CODE3.0和音高指示信号HIGH,可以通过一个数码管或LED来显示乐曲演奏时对应的音符和高音名。音符译码电路Tonetaba模块的仿真输出波形如图4.2(a)所示, 例如当输入Index=9,产生的分频系数便是6921,CODE输出对应该音阶简谱的显示数码2,high输出为高电平,指示音阶为高音,high输出为低电平时则指示音阶为中音,分析可知仿真结果正确无误。将以上设计的音符译码电路To
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1