具有自动乐曲演奏功能的电子琴设计说明_第1页
具有自动乐曲演奏功能的电子琴设计说明_第2页
具有自动乐曲演奏功能的电子琴设计说明_第3页
具有自动乐曲演奏功能的电子琴设计说明_第4页
具有自动乐曲演奏功能的电子琴设计说明_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、具有自动乐曲演奏功能的电子琴设计先给出设计结果视频:具有自动乐曲演奏功能的电子琴-视频实录本文为本人于2012年下学期做的EDA数字系统设计,文章详细介绍了“具有自动乐曲演奏功能的电子琴”的FPGA设计原理与方法,使用了ROM存储音符和节拍,矩阵键盘控制整个系统。一、选题目的电子设计自动化,简称EDA(ElectronicDesignAutomation),发展迅速,应用围日益扩大。它以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。E

2、DA技术的出现,极提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。本文应用VHDL硬件描述语言,以Quartusn8.0为开发工具设计了一个具有自动演奏乐曲功能的电子琴系统,它能将预先存储在ROM中的多首乐曲自动播放出来,并同时显示音符,此外,还具有电子琴弹奏的功能。选题新颖、实用,趣味性、综合性较强。二、设计目标1 .采用44矩阵键盘作为:电子琴按键,高、中、低音选择键,自动播放和电子琴弹奏功能选择键,乐曲选择键。2 .使用ROM存储乐曲,达到只要在其中存储乐曲音符节拍的信息即可自动播放的目的,对乐曲的编码要简单易用。3 .可自动播放世上只有妈妈好、长亭送别、十年三首歌曲,带选歌和自

3、动循环播放的功能。4 .实时显示正在播放的音符。5 .设计要具有模块化,层次化的特点。6 .波形仿真时采用时序仿真,以更加贴近实际,使系统的实际效果达到最佳。三、实现方案1 .原理框图具有自动乐曲演奏功能的电子琴系统的原理结构框图如下:图1硬件系统结构框图键盘 控制 模块图2软件系统结构框图1 2HB匕匕 俗临时钟信胃键盘码= http ./音符码音符发声及显示模块节拍据取制 数读控器节拍 =L氏HOM存储 模块:uadir iitrt/enjoyyl音符ROM存储模块音符码音符发 声及显 示模块音频输出图3乐曲自动播放模块结构框图时钟信号 使能.扫抖模 盘消码 键摘编块键盘码盘转符块键码音模

4、音符码音符发 声及显 示模块音频输出图4乐曲弹奏模块结构框图2 .设计流程图具有自动乐曲演奏功能的电子琴系统的VHDL程序设计流程图如下图5:扫描键盘图5程序设计流程图四、设计过程1 .音乐基础知识简谱应该说是一种比较简单易学的音乐记谱法。它的最大好处是仅用7个阿拉伯数字-1234567,就能将万千变化的音乐曲子记录并表示出来,并能使人很快记住而终身不忘;同时涉及其他的音乐元素也基本可以正确显示。简谱虽然不是出现在中国,但是好像只有在中国得到非常广泛的传播。乐音的特性:它由四个方面组成:音高、音值、音量、音色。音高:由物体在一定的时间震动的次数决定,震动次数多,因则高,反之,则低。音值:即音的

5、长短,是由音的延续时间的不同而决定的,音的延续时间长,音则长,反之,则短。音量:即音的强与弱,由震幅的大小决定,震幅大,音则强,反之,则弱。音色:有发音体的性质决定,发音体的形状及泛音的多少决定音色的不同,例如,小提琴、钢琴等各种乐器的音色都是不同的,在合奏时,人们可清楚地辨认。乐音体系:在音乐使用中有固定音高的音的总和叫乐音体系。音级:乐音体系中的各音叫音级,音级有基本音级与变化音级两种。基本音级:在音乐中经常使用的七个具有独立名称的音叫基本音级。基本音级的名称用字母或唱名两种方式来标记。音名:用C、D、E、F、G、A、B来标记基本音级的叫音名,它表示一定的音高,简谱中用1,2,3,4,5,

6、6,7来标记。唱名:用do、re、mi、fa、sol、la、si作为音级名称的叫唱名。音符:用以记录音的长短高低的符号叫音符(以符头在谱表上的位置来表示音的高低,以形状表示音的长短,音符有符头、符干、符尾三部分或其中某些部分组成,而在简谱中以1234567或其上下加点来表示不同音高,以短下划线(_)或横(一)来表示音的长短)。下面重点介绍组成音乐的两个最基本的要素:每个音符发音的频率及其持续的时间。1.1 音符和频率的关系乐曲的十二平均律规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为隼。另外,简谱中的低音6的频率为4

7、40Hz,音符7到1之间、3到4之间为半音,其余为全音。由此可计算出简谱中从低音1至高音7之间每个音符的频率,如下表1所示:表1简谱中音符与频率的关系音名频率(Hz)音名频率(Hz)音名频率(Hz)1261.6中音1523.3局首11046.52293.7中音2587.3局首21174.73329.6中音3659.3局首31318.54349.2中音4698.5局首41396.95392中音5784局首515686440中音6880局首617607493.9中音7987.8局首71975.51.2 音符的长短表示音乐的长短需要有一个相对固定的时间概念。简谱里将音符分为全音符、二分音符、四分音符

8、、十六分音符、三十二分音符等,如下表2。在这几个音符里面最重要的是四分音符,它是一个基本参照度量长度,即四分音符为一拍。这里一拍的概念是一个相对时间度量单位。一拍的长度没有限制,可以是1秒也可以是2秒或半秒。假如一拍是一秒的长度,那么二拍就是两秒;一拍定为半秒的话,两拍就是一秒的长度。一旦这个基础的一拍定下来,那么比一拍长或短的符号就相对容易了。正如五线谱的附点一样,数字后方加一点会将音符长度增加一半。表2简谱中音符长度音符名称记法时值编码全音符5四拍16二分音符5二拍8四分音符5一拍4八分音符V半拍2十六分音符5四分之一拍1三十二分音符5八分之一拍2 .VHDL程序设计2.1 顶层文件采用原

9、理图输入法设计,其原理图如下:图6music_player原理图各模块的设计如下。2.2 音符的编码及音乐的存储2.2.1 音符的编码休止符的编码为:0;音符长度的编码见表2。音名的编码如下表3所示:表3音名的编码音名编码音名编码音名编码111中音11高音121低音212中音22高音222低音313中音33高音323414中音44局首424515中音55高音525低音616中音66高音626717中音77高音7272.2.2 音乐的存储以十进制将音乐分别存储于note_rom和tick_rom两个模块中,前者为音符,后者为音符的长度,下面给出世上只有妈妈好的存储过程。在QuartusII主窗体

10、中选择ToolsMegaWizardPluge-InManager,弹出如下对话框,单击Next继续。MegaWizardPlug-TnManagerpage1IheMegaWizardFlug-lnMar*agerheyoucreateDiModifydesignMa士thatcontaincustoinvariationsc4megafunctions.WhichactKndoyouwanttoperfoim?Cieafteane冉custommegafundtiorivariationEdit3nexistingcustommegafunctionvariation广Copyanexis

11、tingcustemmegafunctionvartcnCopyright?1991-2008AlteraCoiporalion图7MegaWizardPluge-InManager第一页按下图选择并填入文件名,点击Next。图8MegaWizardPluge-InManager第二页由于音符编在16到32之间,所以q选为5位即可,容量选为1024个字如下图所示图9数据和地址宽度的选择前面的勾,,Next继续。在下图中取消qoutputport图10寄存器信号的选择在下图中,按图示选择并填入note_rom.mif,点击Next继续。图11指明ROM初始化文件ROM: 1-PORTAboutD

12、ocurnentationPF! Summarynote rem,目阅 resqg.ai L,!FLrTirn on the files you wish to generate. A grair ctieckfnark ndiatEs a 同e that 德 ajtomatically generated; and a red checkmarkindicates an optional file. Click Finish to generate the selected files. Tlie state of eadi checkboM is mamtanftd in sl)eeque

13、nt Mega Wizard Plug-In Manager sessions.The MegaWizard Hug-In Mariager creates the sclectied files in tie foltGWing directory;ClockC: W sens Ueskto p 痘子琴 Vnu sic_pJa ver FileD&scriplionnoie_rom. +id riote_rom. iric notjrcinr cmp riote_roni. tef note rom inst.YhdVoriationfieAHDL Include fie/HDL ccmpc

14、nenl dechrtcin fileQurtu? II smbal fieIritantiation template file回口目0回回not 6口吓匚科3 eforiina.HitirilJ n ote_r win_wa ve51. pg5 ample vvefomnsin ummryS ample 则avekirnnResource Usage2 M4KCancelFinish图12 完成ROM的定制2.2.3 建立ROM初始化文件初始化ROM的数据文件有.mif格式和.hex格式,这里采用.mif格式,可以用文本编 辑器编辑,也可以用Quartus II自带的功能产生 ROM数据文

15、件。定制一个512*8的ROM的初始化.mif文件可按下列步骤进行:选择菜单 File | New , 在对话框中选择 Memory Initialization File ,然后输入512和8,如下图13 (a)所示, 点击OK随即打开.mif文件,如下图13 (b)所示,然后可在其中输入数据,默认为十进 制。MegaWizardPlug-nVanger-ROM;1-PORTtpage1of7Surninary(a)ROM的初始化设置(b)初始化的空的ROM文件图13ROM初始化2.2.4在ROM中存储音乐以世上只有妈妈好为例,其简谱如下图所示:蜂同修能7:孝就灌世上只有妈妈好鞍片,世上只有

16、妈妈好去输玳 = so1= c3进升2-报前 -2富单53一修幕16723千千5tttt国的的3由汽 一6瓯圾6树蚂H科第5南有3只只5- 6-世世5* Ttt 6V不粤.1-2节建3- S51幸 一123 诉U6-ft的5-舞姆5蟾H图14世上只有妈妈好简谱1-根据前述对音符的编码规则,可知第一个音为中音6,时值为2拍,存储为6和6;再如第二个音符为中音5,时值上拍,存储为5和2;又如第五个音符为高音5,时值1拍,存储为21和4。依此类推,可将整首乐曲存储如下:AddrH)也+4+5与+7|Addr+0+1+2+3可+F_C000000000|q|1D1010163E21&5&624442a

17、1635653211616422+工2224S32D250242280-62a立6321S3232226286二240116115e&35JO222E2442165&3465四422&4224乩m215322223之22435国3215a4242之5g3722_115115007222222东22(a)note_rom.mif文件(b)tick_rom.mif文件图15世上只有妈妈好简谱在ROM中的存储其它两首乐曲的存储与此类似,且存储在同一个note_rom.mif和tick_rom.mif文件中即可。3 .键盘控制模块3.1 扫描及编码矩阵式键盘是一种常见的输入装置,根据其电路连接有共阴极

18、和共阳极两种连接方式,可以采用逐行或逐列扫描法获得按键值。本文根据实验室提供的共阳极矩阵键盘设计,其示意图如图16所示,定义各功能键如下图17所示,其中17对应简谱的17音符,H、M、L分别为高、中、低音选才i键,AP(AutoPlay)为自动播放选择键,EO(ElectronicOrgan)为电子琴弹奏选择键,Song为自动播放时的歌曲选择键,三个短“-”代表休止符。olll)o行=图16共阳极矩阵式键盘示意图图17本系统矩阵键盘功能键示意下面介绍扫描原理,采取逐行扫描法,以0111、1011、1101、1110的顺序依次扫描,然后读取列引脚的电平信号即可判断哪个按键按 表示在扫描第二行,若

19、列读出的电平信号为11013列的键“7”被按下,其它按键依次类推,下表表4按键扫描信息对照表Fo例如,当扫描信号为1011 时,则可知第3列的键被按下,即第二行第4中列出了 4*4矩阵键盘扫描时的情况列 行0111101111011110111101111234无:1011567H无1101APEOSong PM无1110-卜L无:对该矩阵键盘按从上到下、从左至右的顺序编码,依次为:123,4,5,6,7,8,9,10,11,12,13,14,15,16扫描时,选取的扫描频率为1KHz ,由1MHz分频得到,具体见源程序。3.2消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于

20、机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如右图。抖动时间的长短由按键的机械特性决定,一般为5ms10ms。这是一个很重要的时间参数,在很多场合都要用到。图18按键抖动型触发器、移位寄存器、计数器,结合常见的消抖方法有采样型防抖微分电路、各消抖法的特点,本文采用计数器法。3.3键盘控制模块如右图9所示:KeyControl!D1CIstart7-图19键盘控制模块键盘控制模块(Key_Control.vhd)仿真波形如下图20所示:MmIIisII3nsH0os21?口21Jin胃5不3H时刈讨了2K图20

21、键盘控制模块仿真波形为方便仿真及观察仿真结果,仿真时采用周期为100ns的clk,且将Key_Control.vhd中的获得clk_kb信号的程序中的ift=499then,(即具体见源程序中斜体注释部分)改为ift=10then,再将延时近程中clk_kb改为clk,count改为3位,然后对KBCol0.3赋值(如图),即可得到上图所示结果。注意观察图中圈圈的部分,可以看出,第一个圈,对应“AP”键,他不在音符围,故Key_Note为0,且play,sel均为1,表示选择自动播放;第二个圈,对应5键,在音符围,故Key_Note为5;第三个圈,对应“EO”键,他不在音符围,故Key_Not

22、e为0,且play,sel均为0,表示选择电子琴弹奏;第四个圈,对应“Song”键,产生一个脉冲,仔细分析还应当发现由于消抖,使输出迟了1个扫描时钟(0.001s),但对本系统无影响。4 .乐曲自动播放模块此模块的框图如图3所示,元件符号如右图下21所示,包含以下模块:ROM数据读取控制、音符ROM、节拍ROM,如下图22所示:(muilc_piay,=nstl图21乐曲自动播放模块符号tick rom廿oL送3口3:add3 KBmi clack图22乐曲自动播放模块4.1 ROM数据读取控制该分模块从tick_rom 中读取节拍,控制读取 数据的速度,从而实现音乐的节奏。该模块通过可调模值

23、计 数器实现,具体参见源程序。乐曲自动播放模块仿真波形如下:图23乐曲自动播放模块仿真波形为方便仿真,将counter_rom.vhd源程序中的CLK_FREQ这一常量的值改为仿真时的时钟信号频率100Hz,三首乐曲的前几个音符如右图所示,第一首的起始音符为中音6,时值一又二分之一拍;第二首的起始音符为中音5,时值为1拍;第三首的起始音符为0,接着为1,2,时值分别为二分之一拍、四分之一拍、四分之一拍。对照仿真结果,可知仿真结果正确,程序正确。6-535Ii656-世上只有蚂喝此|5J_51-|15-长丁川古道地,Q123323I217go36|如果那两个字没有质或彳,图24三首乐曲的第一句简

24、谱5 .电子琴模块此模块主要完成将上一级键盘控制模块送来的音符按键进行译码输出,元件符号如右图11所示。如图12所示,使能有效后,开始输出音符码:2,第一个圈中key值为8,说明下面的音符将转为高音,如后面的23,26;第二个圈中key值为12,说明下面的音符将转为中音,如其后的6。可见,程序正确无误。JirniilinfaiiiriiiliiHfaiiIirsiiiiinillir4iiid-iiii-iiiln-iilfli-tiilidnillirB-iiiii-sB.;EIkIteiQ.K区yg打d;rw5t&_DodeJ+pl可ENkey=1andkey=7then-17note_c

25、ode=key+10*sign;elsenote_code=0;-stopendif;endif;elsenote_code=0;sign:=0;endif;endprocess;但仿真结果令人惊讶,只能输出高音,仿真波形如下,错误处已经用叉号标记出来图29未加入clk时钟信号时的仿真结果解决办法:给该模块加入时钟驱动,用上升沿触发事件,结果得到了想要的结果,如下图,程序见该模块源代码。图30加入clk时钟信号时的仿真结果六、实现结果1 .拨动开关,使start为1,此时数码管显示短横,扬声器不发声;2 .按下矩阵键盘的“AP”键,系统开始自动播放乐曲,顺序:世上只有妈妈好、长亭送别、十年循环

26、播放;3 .按下歌曲选择键:Song:自动切换到下一首播放;4 .按下“EO”键,扬声器不发声,按数字键17,发出dosi的音符;5 .按下“H、M、L”键,可切换高、中、低音;6 .拨动开关,使start为0,此时数码管显示短横,扬声器不发声;本文设计的具有自动演奏乐曲功能的电子琴系统,实现了所有设计目标,效果优秀,极具综合性、趣味性!此系统的功能还可以进一步完善,如增加手动改变音乐播放的节奏、长时间无按键系统自动关闭、手动输入音符再自动播放(当然需将ROM换成RAM)等功能。此系统是我独立开发的一个小型系统,且实现的效果很好,很有成就感,更加激发我搞科研的热情!七、编程调试1 .具有自动演

27、奏乐曲功能的电子琴系统的所有VHDL源代码1.1 顶层文件music_player.bdf如下:图31music_player.bdf文件1.2 键盘控制模块(Key_Control.vhd)VHDL源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityKey_Controlisport(clk,start:instd_logic;KBCol:instd_logic_vector(0to3);song:bufferstd_logic;play:outstd_logic;-1music_

28、play;0:Elc_keyboard;sel:outstd_logic;-1:music_play;0:Elc_keyboard;Key_Note:bufferintegerrange0to16;KBRow:bufferstd_logic_vector(0to3);endentity;architecturecontrolofKey_Controlissignalclk_kb:std_logic;signalt:integerrange0to1000;signaltemp:STD_LOGIC_VECTOR(7downto0);signalstate:std_logic_vector(1dow

29、nto0):=00;signalcount:std_logic_vector(1downto0):=00;signalkey:integerrange0to16;signalkeynum:integerrange0to16;signalTempKey:integerrange0to16;signalsong_chg:std_logic:=0;beginprocess(clk)-产生键盘扫描beginifrising_edge(clk)thenifstart=1thenift=499then-仿真时改为ift=10thenclk_kb=notclk_kb;t=0;elset=cnt+1;endi

30、f;endif;endif;endprocess;process(clk_kb)beginifrising_edge(clk_kb)thenifstate=11thenstate=00;elsestateKBRowKBRowKBRowKBRowKBRow=1111;endcase;endprocess;temp=KBRow&KBCol;process(clk_kb)beginifstart=1theniffalling_edge(clk_kb)thenifKBCol=1111thenifcount=11thenkey=0;count=00;elsecount=count+1;endif;els

31、e-countkeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykey=0;endcase;endif;endif;elsekey=0;endif;endprocess;process(clk)variablecount:std_logic_vector(4downto0);-仿真时改为(1downto0)beginifrising_edge(clk)thenifkey/=TempKeythenTempKey=key;count:=00000;-仿真时改为”00”elseifcount=11111then-仿真时改为”11”keynum=key;c

32、ount:=00000;-仿真时改为”00”elsecount:=count+1;endif;endif;endif;endprocess;process(clk_kb)beginifstart=1thenif(rising_edge(clk_kb)thenif(keynum9orkeynum=12orkeynum=16)thenKey_Note=keynum;song=0;elseKey_Note=0;ifkeynum=11thensong=1;-产生脉冲elsesong=0;if(keynum=9)thenplay=1;sel=1;elsif(keynum=10)thenplay=0;se

33、l=0;endif;endif;endif;endif;elseplay=1;sel=0;Key_Note=0;-stopsong=1andkey=7then-17note_code=key+10*sign;elsenote_code=0;-stopendif;endif;elsenote_code=0;sign:=0;endif;endprocess;endElc_keyBoard;1.4 乐曲自动演奏模块(music_Play.bdf)文件)源文件图32music_Play.bdf文件2 .4.1ROM数据读取控制模块(counter_rom.vhdlibraryieee;useieee.

34、std_logic_1164.all;entitycounter_romisport( tick_numclksong play ENq:inintegerrange0to31;:instd_logic;:instd_logic;:instd_logic;:instd_logic;:outintegerrange0to511);endentity;architecturertlofcounter_romisconstantCLK_FREQ:integer:=1000000;-1MHzconstantSONG1_ADDR:integer:=7;-乐曲1存储地址constantSONG2_ADDR

35、:integer:=80;-乐曲2存储地址constantSONG3_ADDR:integer:=184;-乐曲3存储地址constantSONG_LEN:integer:=500;signalSONG_ADDR:integerrange0to1000:=0;-乐曲存储地址signalsong_chg:std_logic:=0;signalchg_ok:std_logic:=0;signalnum:integerrange0to2:=0;signalstart:std_logic:=0;-signalmeterbeginprocess(song,play,EN)beginif(start=1)

36、thenif(songeventandsong=1)thenifnum2thennum=num+1;elsenum=0;endif;song_chgSONG_ADDRSONG_ADDRSONG_ADDRSONG_ADDR=null;endcase;elsenum=0;endif;if(chg_ok=1)thensong_chg=0;endif;endprocess;process(play,EN)beginstart=playandEN;endprocess;ROM数据读取控制process(clk,start)variablecount:integerrange0toSONG_LEN;var

37、iablet:integerrange0to4*CLK_FREQ;beginif(start=1andcountSONG_LEN)thenif(rising_edge(clk)thenifsong_chg=1then-ResetthecountertoSONG_ADDRcount:=SONG_ADDR;chg_ok=1;t:=0;elsechg_ok=0;endif;if(cnt(tick_num*CLK_FREQ)/4)thent:=cnt+1;elset:=0;count:=count+1;endif;endif;elsecount:=0;cnt:=0;endif;-Outputthecu

38、rrentcountqdivider_mod=3822;pitch=01;disp7divider_mod=3405;pitch=01;disp7divider_mod=3034;pitch=01;disp7divider_mod=2863;pitch=01;disp7divider_mod=2551;pitch=01;disp7divider_mod=2273;pitch=01;disp7divider_mod=2025;pitch=01;disp7divider_mod=1911;pitch=00;disp7divider_mod=1703;pitch=00;disp7divider_mod=1517;pitch=00;disp7divider_mod=1432;pit

温馨提示

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

最新文档

评论

0/150

提交评论