基于EDA的乐曲硬件演奏电路.doc

上传人:数据九部 文档编号:10374817 上传时间:2021-05-13 格式:DOC 页数:11 大小:146KB
返回 下载 相关 举报
基于EDA的乐曲硬件演奏电路.doc_第1页
第1页 / 共11页
基于EDA的乐曲硬件演奏电路.doc_第2页
第2页 / 共11页
基于EDA的乐曲硬件演奏电路.doc_第3页
第3页 / 共11页
基于EDA的乐曲硬件演奏电路.doc_第4页
第4页 / 共11页
基于EDA的乐曲硬件演奏电路.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《基于EDA的乐曲硬件演奏电路.doc》由会员分享,可在线阅读,更多相关《基于EDA的乐曲硬件演奏电路.doc(11页珍藏版)》请在三一文库上搜索。

1、6.4乐曲硬件演奏电路EDA设计6.4.1 设计要求利用可编程逻辑器件FPGA,设计一个乐曲硬件演奏电路。由键盘输入控制音响,同时可自动演奏乐曲。演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。其结构如图6-34所示,该设计产生的音乐选自梁祝片段。图6-34 乐曲演奏电路结构方框图6.4.2 原理描述 产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。根据6.4.1的设计要求,乐曲硬件演奏电路系统主要由数控分频器和

2、乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。1 音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音与高音)之间的频率相差一倍在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。另外,音名(简谱中的低音)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表6-3所示.表6-3 简谱中的音名与频率的关系

3、音名频率/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由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结

4、构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。本例中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。各音阶频率及相应的分频系数如表6-4所示。为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表6-4中的分频系数就是从4MHZ频率二分频得到的2MHZ频率基础上计算得出的。表6-4 各音阶频率对应的分频值音名分频系数初始值音名分频系数初始值音名分频系数初始值低音17644547中音138224369高音1

5、19116280低音268101381中音234054786高音212706921低音360672124中音330345157高音315176674低音457272464中音428645327高音414326759低音551023089中音525515640高音512566935低音645453646中音622735918高音611377054低音740504141中音720256166高音710137178由于最大的分频系数为7644,故采用13位二进制计数器已能满足分频要求。在表6-4,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0

6、,即初始值为8191即可,此时扬声器将不会发声。对于不同的分频系数,加载不同的初始值即可。用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,也是同步计数器的一个常用设计技巧。2 控制音长的节拍发生器该演奏电路演奏的乐曲是“梁祝”片段,其最小的节拍为1拍。将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍(一定是拍的整数倍),如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏

7、完成时,保证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。 6.4.3 乐曲硬件演奏电路的层次化设计方案根据层次化的设计思路,可把乐曲硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块(speaker)。下面给出其EDA设计过程:1 音乐节拍发生器NoteTabs 该模块将利用FPGA的片内ROM存放乐曲简谱真值表,由一个二进制计数器为乐曲数据存储器ROM的地址发生器。该计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,随着NoteTab中计数器按4Hz的时钟频率作加法计数时,即随地址值递增时,乐曲数据ROM中的音符

8、数据,将从ROM中的输出口输向音符译码电路Tonetaba,所存储乐曲就开始连续自然地演奏起来。二进制计数器的位数将根据所存放乐曲简谱基本节拍数来决定,对于乐曲“梁祝”片段其最小节拍数为138,即选择计数器的位数为8即可,另外在此模块上增加一手动/自动选择按扭auto,auto=1时为自动演奏,auto=0时为手动输入。其设计流程如下:1)利用MegaWizard Plug-In Manager定制音符数据存储器musica1在QuartusII主窗口“Tools”菜单中选择“MegaWizard Plug-In Manager”命令,选择“Create a new custom megafu

9、nction”项。单击Next按钮后,在产生的对话框左栏中选择“storage”项下的LPM_ROM,再选择cyclone和VHDL语言方式,在Browse下的栏中键入输出文件存放的路径“G:/chapter6/music/”和定制模块的文件名musica1。根据第5章例5-12给出的LPM_ROM的定制流程,即可完成musica1模块的定制工作,其VHDL源程序如下:LIBRARY IEEEE;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.altera_mf_components.all;ENTITY music1 I

10、SPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END music1;ARCHITECTURE SYN OF music1 ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (3 DOWNTO 0);COMPONENT altsyncramGENERIC (intended_device_family: STRING;width_a ,widthad_a,width_byteena_a,numwords_

11、a: NATURAL;operation_mode: STRING;outdata_reg_a: STRING;address_aclr_a: STRING;outdata_aclr_a: STRING;init_file : STRING;lpm_hint : STRING;lpm_type : STRING);PORT (clock0: IN STD_LOGIC ;address_a: IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;BEGINq Cyclone,wi

12、dth_a = 4,widthad_a = 8,numwords_a = 256,operation_mode = ROM,outdata_reg_a = CLOCK0,address_aclr_a = NONE,outdata_aclr_a = NONE,width_byteena_a = 1,init_file = DATA1.MIF,lpm_hint = ENABLE_RUNTIME_MOD=NO,lpm_type = altsyncram)PORT MAP (clock0 = clock,address_a = address,q_a = sub_wire0);END SYN;在定制中

13、选择ROM的数据位宽为8,地址位宽为8(共计256个字),ROM的类型选择为“Auto”,并指定ROM的初始化数据文件名为data1.mif,该数据文件指向文件夹G:/chapter6/music/。2)定制ROM模块的初始化数据文件data1.mif 在QuartusII中选择File | New命令,在New窗口中的选择Other Files页,再选择Memory Initialization File项。单击按OK按钮后,进入ROM初始化数据文件大小编辑窗。进入编辑窗后,在编辑窗中,根据设计的要求,可选ROM的数据数(Number of words)为256字,数据位宽度(Word si

14、ze)为8。在数据文件编辑窗中,单击按OK按钮,将出现图6-35所示的mif数据表格,在表格中将“梁祝”片段的音符数据(共138个)以十进制数形式填入此表中,最后保存此数据文件名为data.mif,存盘路径为G:/chapter6/music/。图6-35数据存储器musica1的初始化数据文件内容3)音乐节拍发生器NoteTabs的VHDL设计 其VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTa IS PORT ( clk4hz,auto : IN

15、STD_LOGIC; Index2 : IN STD_LOGIC_VECTOR (3 DOWNTO 0) Tone : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END;ARCHITECTURE one OF NoteTa ISCOMPONENT MUSIC1 -音符数据ROM PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); clock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT; SIGNAL Counter : STD

16、_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL INDEX1: STD_LOGIC_VECTOR (3 DOWNTO 0)BEGIN CNT8 : PROCESS(clk4hz ,Counter) IF Counter=138 THEN Counter = 00000000; ELSIF (clk4hzEVENT AND clk4hz = 1) THEN Counter Counter , clock=clk4hz,q=Index1 ); mux: PROCESS(auto)Begin IF auto=0 THEN Index2 = Tone ; END IF; ELSE

17、Index1 = Tone ; END PROCESS mux;END;END one;在源程序中Tone是音乐节拍发生器输出的音符数据; clk4hz是计数时钟输入端,该信号作为输出音符的快慢信号, 此处选择4Hz频率,即每一计数值的停留时间为0.25秒计1拍,四四拍的四分音符的持续时间为1秒,频率越高,时钟的输出节拍速度就快,演奏的速度就越快,反之演奏的速度就变慢;index2为手控输入的音符数据;auto为手动/自动选择按扭,auto=1时为自动演奏,auto=0时为手动输入。 音乐节拍发生器的仿真输出波形文件如图6-36(a)所示,分析可知仿真结果正确无误,将以上设计的音乐节拍发生器电

18、路设置成可调用的元件,以备高层设计中使用,其元件符号如图6-36(b)所示 (a) (b)图6-37音乐节拍发生器(a) 仿真输出波形;(b)元件符号图2 音符译码电路Tonetaba模块音符译码电路即音调发生器实际上是一个查表电路,放置21个音乐简谱对应的频率表,根据该表为数控分频模块(speaker)提供所发音符频率的初始值(该初始值可参照表6-4),而此数在数控分频模块入口的停留时间即为此音符的节拍数,不失一般性,以下VDHL程序中仅设置了“梁祝”乐曲全部音符所对应的音符频率的初始值,共16个,每个音符停留时间由音乐节拍发生器的时钟频率决定,在此为4Hz信号,这16个值的输出由对应于音符

19、译码电路的4位输入值Index3.0确定,该值中音符的停留时间由音乐节拍发生器中的音符数据决定,该数据重复的次数为该音符的节拍数,如为2则为四二拍,如为4则为四四拍即全音符。其VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ToneTaba IS PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC; Tone : OUT STD_LOGIC_VECTOR

20、 (12 DOWNTO 0) );END;ARCHITECTURE one OF ToneTaba ISBEGINPROCESS(Index) BEGIN CASE Index IS - 译码电路,查表方式,控制音调的预置数 WHEN 0000 = Tone=1111111111111 ; CODE=0000; HIGH Tone=1000100010001 ; CODE=0001; HIGH Tone=1001010110010 ; CODE=0010; HIGH Tone=1010000011111 ; CODE=0011; HIGH Tone=1011000001000 ; CODE=0

21、101; HIGH Tone=1011100011110 ; CODE=0110; HIGH Tone=1100000010110 ; CODE=0111; HIGH Tone=1100010001000 ; CODE=0001; HIGH Tone=1101100001001 ; CODE=0010; HIGH Tone=1101000010010 ; CODE=0011; HIGH Tone=1101001100111 ; CODE=0101; HIGH Tone=1101110001110 ; CODE=0110; HIGH Tone=1110001000010 ; CODE=0001;

22、 HIGH Tone=1111111111111 ; CODE=0000; HIGH =0; END CASE; END PROCESS;END;在源程序中Index3.0是音乐节拍发生器输出的音符数据; TONE12.0是为数控分频模块提供的音符频率初始值,为方便测试,特设置一个音名代码显示输出CODE3.0和音高指示信号HIGH,可以通过一个数码管或LED来显示乐曲演奏时对应的音符和高音名。音符译码电路Tonetaba模块的仿真输出波形如图6-38(a)所示, 例如当输入Index=8,产生的分频系数便是6280,CODE输出对应该音阶简谱的显示数码1,high输出为高电平,指示音阶为高音

23、,high输出为低电平时则指示音阶为中音,分析可知仿真结果正确无误。将以上设计的音符译码电路Tonetaba设置成可调用的元件,以备高层设计中使用,其元件符号如图6-38(b)所示: (a) (b)图6-38音符译码电路Tonetaba(a) 仿真输出波形;(b)元件符号图3数控分频模块(speaker)设计数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。数控分频模块是由一个初值可变的13位加法计数器构成。该计数器的模为8192,当计数器计满时,产生一个进位信号FullSpkS,该信号就是用作发音的频率信号(其频率值参见表6-3)。在计数器的预置端给定不同的初值,其输出将

24、产生不同的频率信号,频率信号初值Tone就是前级音符译码电路Tonetaba的输出,它计满所需要的分频比可由下式决定: Tone12.0+ 分频比=8192+进位信号FullSpkS (6-7)结合表6-4,分析式(6-7)可知,低音时,Tone值小,分频比大,进位信号SpkS的周期长,扬声器发出的声音低,Tone随音乐的乐谱而变化,自动控制分频比,从而实现数控分频,发生信号的频率与Tone成正比,这就是利用数控分频器自动演奏音乐的原理。数控分频器的输入时钟频率为4MHz,通过分频后其进位信号FullSpkS是一周期脉冲信号,为有利于驱动扬声器,在音调输出时再进行二分频,将脉冲展宽,使之占空比

25、为50%,扬声器这样就有足够的发声功率。其VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Speakera IS PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC_VECTOR (12 DOWNTO 0); SpkS : OUT STD_LOGIC );END;ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC;BEGIN DivideC

26、LK : PROCESS(clk) VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN PreCLK 11 THEN PreCLK = 1; Count4 := 0000; ELSIF clkEVENT AND clk = 1 THEN Count4 := Count4 + 1; END IF; END PROCESS; GenSpkS : PROCESS(PreCLK, Tone)- 13位可预置计数器 VARIABLE Count13 : STD_LOGIC_VECTOR (12 DOWNTO 0);BEGIN IF PreCLK

27、EVENT AND PreCLK = 1 THEN IF Count13 = 16#1FFF# THEN Count13 := Tone ; FullSpkS = 1; ELSE Count13 := Count13 + 1; FullSpkS = 0; END IF; END IF; END PROCESS; DelaySpkS : PROCESS(FullSpkS)-将输出再2分频,展宽脉冲, VARIABLE Count2 : STD_LOGIC;BEGIN IF FullSpkSEVENT AND FullSpkS = 1 THEN Count2 := NOT Count2; IF C

28、ount2 = 1 THEN SpkS = 1; ELSE SpkS CLK8HZ, ToneIndex=ToneIndex);u2:ToneTaba PORT MAP(Index=ToneIndex,Tone=Tone,CODE=CODE,HIGH=HIGH);u3 : Speakera PORT MAP(clk=CLK,Tone=Tone, SpkS=Sp );END;该程序利用元件例化的方法,按图6-40进行元件连接,其编译成功后的仿真输出波形和元件符号如图6-41所示。 (a) (b)图6-41乐曲硬件演奏电路(a) 仿真输出波形;(b)元件符号图6.4.5 硬件测试 为了能对所设计的

29、乐曲硬件演奏电路进行硬件测试,应将其输入输出信号锁定在开发系统的目标芯片引脚上,并重新编译,然后对目标芯片进行编程下载,完成乐曲硬件演奏电路的最终开发,其硬件测试示意图如图6-42。不失一般性,本设计选用的EDA开发平台为GW48-SOPC,选择目标器件为EP1C6Q240C8芯片,电路工作模式为No.1。图6-42乐曲演奏电路硬件测试示意图锁定引脚时将CLK和CLK8HZ分别连至clock9(接受4MHz的时钟频率)和clock2(接受8Hz的时钟频率);Sp接扬声器SPEAKER;简谱码手动输入index3.0同键1(PIO3PIO0)相连;auto接键8(高低电平发生器); CODE3.0接数码管8(PIO31PIO28)显示输出的简谱码;HIGH接发光二级管D8,用于指示高8度音。综合适配后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK等引脚在FPGA芯片EP1C6Q240C8引脚中的序号,请参见附录的附表2),扬声器短接线短路(接入扬声器),即可MIDI音乐。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1