具有自动乐曲演奏功能的电子琴设计.docx

上传人:b****4 文档编号:3669055 上传时间:2022-11-24 格式:DOCX 页数:37 大小:1.29MB
下载 相关 举报
具有自动乐曲演奏功能的电子琴设计.docx_第1页
第1页 / 共37页
具有自动乐曲演奏功能的电子琴设计.docx_第2页
第2页 / 共37页
具有自动乐曲演奏功能的电子琴设计.docx_第3页
第3页 / 共37页
具有自动乐曲演奏功能的电子琴设计.docx_第4页
第4页 / 共37页
具有自动乐曲演奏功能的电子琴设计.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

具有自动乐曲演奏功能的电子琴设计.docx

《具有自动乐曲演奏功能的电子琴设计.docx》由会员分享,可在线阅读,更多相关《具有自动乐曲演奏功能的电子琴设计.docx(37页珍藏版)》请在冰豆网上搜索。

具有自动乐曲演奏功能的电子琴设计.docx

具有自动乐曲演奏功能的电子琴设计

具有自动乐曲演奏功能的电子琴设计

先给出设计结果视频链接:

    具有自动乐曲演奏功能的电子琴-视频实录

    本文为本人于2012年下学期做的EDA数字系统设计,文章详细介绍了“具有自动乐曲演奏功能的电子琴”的FPGA设计原理与方法,使用了ROM存储音符和节拍,矩阵键盘控制整个系统。

一、选题目的

   电子设计自动化,简称EDA(ElectronicDesignAutomation),发展迅速,应用范围日益扩大。

它以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。

EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。

   本文应用VHDL硬件描述语言,以QuartusⅡ8.0为开发工具设计了一个具有自动演奏乐曲功能的电子琴系统,它能将预先存储在ROM中的多首乐曲自动播放出来,并同时显示音符,此外,还具有电子琴弹奏的功能。

选题新颖、实用,趣味性、综合性较强。

二、设计目标

1.采用44矩阵键盘作为:

电子琴按键,高、中、低音选择键,自动播放和电子琴弹奏功能选择键,乐曲选择键。

2.使用ROM存储乐曲,达到只要在其中存储乐曲音符节拍的信息即可自动播放的目的,对乐曲的编码要简单易用。

3.可自动播放《世上只有妈妈好》、《长亭送别》、《十年》三首歌曲,带选歌和自动循环播放的功能。

4.实时显示正在播放的音符。

5.设计要具有模块化,层次化的特点。

6.波形仿真时采用时序仿真,以更加贴近实际,使系统的实际效果达到最佳。

三、实现方案

1.原理框图

    具有自动乐曲演奏功能的电子琴系统的原理结构框图如下:

 

图1硬件系统结构框图

      

图2软件系统结构框图

图3乐曲自动播放模块结构框图

  

图4乐曲弹奏模块结构框图

2.设计流程图

    具有自动乐曲演奏功能的电子琴系统的VHDL程序设计流程图如下图5:

图5程序设计流程图

四、设计过程

1.音乐基础知识

       简谱应该说是一种比较简单易学的音乐记谱法。

它的最大好处是仅用7个阿拉伯数字----1234567,就能将万千变化的音乐曲子记录并表示出来,并能使人很快记住而终身不忘;同时涉及其他的音乐元素也基本可以正确显示。

简谱虽然不是出现在中国,但是好像只有在中国得到非常广泛的传播。

    乐音的特性:

它由四个方面组成:

音高、音值、音量、音色。

    音高:

由物体在一定的时间内震动的次数决定,震动次数多,因则高,反之,则低。

    音值:

即音的长短,是由音的延续时间的不同而决定的,音的延续时间长,音则长,反之,则短。

    音量:

即音的强与弱,由震幅的大小决定,震幅大,音则强,反之,则弱。

    音色:

有发音体的性质决定,发音体的形状及泛音的多少决定音色的不同,例如,小提琴、钢琴等各种乐器的音色都是不同的,在合奏时,人们可清楚地辨认。

    乐音体系:

在音乐使用中有固定音高的音的总和叫乐音体系。

    音级:

乐音体系中的各音叫音级,音级有基本音级与变化音级两种。

    基本音级:

在音乐中经常使用的七个具有独立名称的音叫基本音级。

基本音级的名称用字母或唱名两种方式来标记。

    音名:

用C、D、E、F、G、A、B来标记基本音级的叫音名,它表示一定的音高,简谱中用1,2,3,4,5,6,7来标记。

    唱名:

用do、re、mi、fa、sol、la、si作为音级名称的叫唱名。

    音符:

用以记录音的长短高低的符号叫音符(以符头在谱表上的位置来表示音的高低,以形状表示音的长短,音符有符头、符干、符尾三部分或其中某些部分组成,而在简谱中以1234567或其上下加点来表示不同音高,以短下划线(_)或横(—)来表示音的长短)。

    下面重点介绍组成音乐的两个最基本的要素:

每个音符发音的频率及其持续的时间。

    1.1音符和频率的关系

    乐曲的十二平均律规定:

每2个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。

在2个八度音之间,又可分为12个半音,每2个半音的频率比为

另外,简谱中的低音6的频率为440Hz,音符7到1之间、3到4之间为半音,其余为全音。

由此可计算出简谱中从低音1至高音7之间每个音符的频率,如下表1所示:

表1简谱中音符与频率的关系

音名

频率(Hz)

音名

频率(Hz)

音名

频率(Hz)

低音1

261.6

中音1

523.3

高音1

1046.5

低音2

293.7

中音2

587.3

高音2

1174.7

低音3

329.6

中音3

659.3

高音3

1318.5

低音4

349.2

中音4

698.5

高音4

1396.9

低音5

392

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

493.9

中音7

987.8

高音7

1975.5

   1.2音符的长短

    表示音乐的长短需要有一个相对固定的时间概念。

简谱里将音符分为全音符、二分音符、四分音符、十六分音符、三十二分音符等,如下表2。

在这几个音符里面最重要的是四分音符,它是一个基本参照度量长度,即四分音符为一拍。

这里一拍的概念是一个相对时间度量单位。

一拍的长度没有限制,可以是1秒也可以是2秒或半秒。

假如一拍是一秒的长度,那么二拍就是两秒;一拍定为半秒的话,两拍就是一秒的长度。

一旦这个基础的一拍定下来,那么比一拍长或短的符号就相对容易了。

正如五线谱的附点一样,数字后方加一点会将音符长度增加一半。

 

表2简谱中音符长度

音符名称

记法

时值

编码

全音符

5———

四拍

16

二分音符

5—

二拍

8

四分音符

5

一拍

4

八分音符

半拍

2

十六分音符

四分之一拍

1

三十二分音符

八分之一拍

 

2. VHDL程序设计

   2.1顶层文件

    采用原理图输入法设计,其原理图如下:

图6music_player原理图

    各模块的设计如下。

   2.2音符的编码及音乐的存储

    2.2.1音符的编码

    休止符的编码为:

0;音符长度的编码见表2。

音名的编码如下表3所示:

表3音名的编码

音名

编码

音名

编码

音名

编码

低音1

11

中音1

1

高音1

21

低音2

12

中音2

2

高音2

22

低音3

13

中音3

3

高音3

23

低音4

14

中音4

4

高音4

24

低音5

15

中音5

5

高音5

25

低音6

16

中音6

6

高音6

26

低音7

17

中音7

7

高音7

27

2.2.2音乐的存储

    以十进制将音乐分别存储于note_rom和tick_rom两个模块中,前者为音 符,后者为音符的长度,下面给出《世上只有妈妈好》的存储过程。

在QuartusII主窗体中选择Tools—MegaWizardPluge-InManager…,弹出如下对话框,单击Next继续。

图7 MegaWizardPluge-InManager第一页

按下图选择并填入文件名,点击Next。

图8 MegaWizardPluge-InManager第二页

     由于音符编在16到32之间,所以q选为5位即可,容量选为1024个字如下图所示

图9 数据和地址宽度的选择

在下图中取消“q’outputport”前面的勾,点击Next继续。

图10 寄存器信号的选择

在下图中,按图示选择并填入note_rom.mif,点击Next继续。

图11 指明ROM初始化文件

图12 完成ROM的定制

2.2.3建立ROM初始化文件

   初始化ROM的数据文件有.mif格式和.hex格式,这里采用.mif格式,可以用文本编辑器编辑,也可以用QuartusII自带的功能产生ROM数据文件。

 定制一个512*8的ROM的初始化.mif文件可按下列步骤进行:

选择菜单File|New,在对话框中选择MemoryInitializationFile,然后输入512和8,如下图13(a)所示,点击OK随即打开.mif文件,如下图13(b)所示,然后可在其中输入数据,默认为十进制。

         

(a)ROM的初始化设置    (b)初始化的空的ROM文件

图13ROM初始化

2.2.4在ROM中存储音乐

以《世上只有妈妈好》为例,其简谱如下图所示:

图14世上只有妈妈好简谱

    根据前述对音符的编码规则,可知第一个音为中音6,时值为

拍,存储为6和6;再如第二个音符为中音5,时值

拍,存储为5和2;又如第五个音符为高音5,时值1拍,存储为21和4。

依此类推,可将整首乐曲存储如下:

  

 (a)note_rom.mif文件                  (b)tick_rom.mif文件

图15世上只有妈妈好简谱在ROM中的存储

其它两首乐曲的存储与此类似,且存储在同一个note_rom.mif和tick_rom.mif文件中即可。

3.键盘控制模块

3.1扫描及编码

    矩阵式键盘是一种常见的输入装置,根据其电路连接有共阴极和共阳极两种连接方式,可以采用逐行或逐列扫描法获得按键值。

本文根据实验室提供的共阳极矩阵键盘设计,其示意图如图16所示,定义各功能键如下图17所示,其中1~7对应简谱的1~7音符,H、M、L分别为高、中、低音选择键,AP(AutoPlay)为自动播放选择键,EO(ElectronicOrgan)为电子琴弹奏选择键,Song为自动播放时的歌曲选择键,三个短“-”代表休止符。

    

      

图16共阳极矩阵式键盘示意图           图17本系统矩阵键盘功能键示意

    下面介绍扫描原理,采取逐行扫描法,以0111、1011、1101、1110的顺序依次扫描,然后读取列引脚的电平信号即可判断哪个按键按下。

例如,当扫描信号为1011时,表示在扫描第二行,若列读出的电平信号为1101,则可知第3列的键被按下,即第二行第3列的键“7”被按下,其它按键依次类推,下表4中列出了4*4矩阵键盘扫描时的情况

表4按键扫描信息对照表

  列

行  

0111

1011

1101

1110

1111

0111

1

2

3

4

1011

5

6

7

H

1101

AP

EO

Song

M

1110

-

-

-

L

对该矩阵键盘按从上到下、从左至右的顺序编码,依次为:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16。

扫描时,选取的扫描频率为1KHz,由1MHz分频得到,具体见源程序。

3.2消抖

   通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,如右图。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。

这是一个很重要的时间参数,在很多场合都要用到。

     

 图18按键抖动

    常见的消抖方法有采样型防抖微分电路、D型触发器、移位寄存器、计数器,结合各消抖法的特点,本文采用计数器法。

      3.3键盘控制模块如右图9所示      

            

        图19键盘控制模块

    键盘控制模块(Key_Control.vhd)仿真波形如下图20所示:

图20键盘控制模块仿真波形

    为方便仿真及观察仿真结果,仿真时采用周期为100ns的clk,且将Key_Control.vhd中的获得clk_kb信号的程序中的ifcnt=499then,(即具体见源程序中斜体注释部分)改为ifcnt=10then,再将延时近程中clk_kb改为clk,count改为3位,然后对KBCol[0..3]赋值(如图),即可得到上图所示结果。

    注意观察图中圈圈的部分,可以看出,第一个圈,对应“AP”键,他不在音符范围内,故Key_Note为0,且play,sel均为1,表示选择自动播放;第二个圈,对应“5”键,在音符范围内,故Key_Note为5;第三个圈,对应“EO”键,他不在音符范围内,故Key_Note为0,且play,sel均为0,表示选择电子琴弹奏;第四个圈,对应“Song”键,产生一个脉冲,仔细分析还应当发现由于消抖,使输出迟了1个扫描时钟(0.001s),但对本系统无影响。

4.乐曲自动播放模块

    此模块的框图如图3所示,元件符号如右图下21所示,包含以下模块:

ROM数据读取控制、音符ROM、节拍ROM,如下图22所示:

 

图21乐曲自动播放模块符号

图22乐曲自动播放模块

    4.1ROM数据读取控制

    该分模块从tick_rom中读取节拍,控制读取ROM数据的速度,从而实现音乐的节奏。

该模块通过可调模值计数器实现,具体参见源程序。

    乐曲自动播放模块仿真波形如下:

           

             

图23乐曲自动播放模块仿真波形

    为方便仿真,将counter_rom.vhd源程序中的CLK_FREQ这一常量的值改为仿真时的时钟信号频率100Hz,三首乐曲的前几个音符如右图所示,第一首的起始音符为中音6,时值一又二分之一拍;第二首的起始音符为中音5,时值为1拍;第三首的起始音符为0,接着为1,2,时值分别为二分之一拍、四分之一拍、四分之一拍。

对照仿真结果,可知仿真结果正确,程序正确。

图24三首乐曲的第一句简谱

5.电子琴模块

    此模块主要完成将上一级键盘控制模块送来的音符按键进行译码输出,元件符号如右图11所示。

    如图12所示,使能有效后,开始输出音符码:

2,第一个圈中key值为8,说明下面的音符将转为高音,如后面的23,26;第二个圈中key值为12,说明下面的音符将转为中音,如其后的6。

可见,程序正确无误。

           

图25 电子琴模块

图26电子琴模块仿真波形

6.音符发声及显示模块

    该模块主要将前端送来的音符码转换成相应的声音频率以驱动扬声器发声,并在七段数码管(实验室提供的为

八段数码管,但本设计只需七段)上显示音符,且有高低音指示灯。

元件符号如右图。

      七段数码管的原理及使用很简单,在此不再熬述!

 

    本文设计的具有自动乐曲演奏功能的电子琴系统选择的基基准频率为1MHz,根据表1可计算出对应的音符的分频系数(divider_mod),如下表5:

表5 1MHz下简谱中音符分频数

音名

分频系数

音名

分频系数

音名

分频系数

低音1

3283

中音1

1911

高音1

956

低音2

3405

中音2

1703

高音2

851

低音3

3034

中音3

1517

高音3

758

低音4

2863

中音4

1432

高音4

716

低音5

2551

中音5

1276

高音5

638

低音6

2273

中音6

1137

高音6

568

低音7

2025

中音7

1012

高音7

506

    为方便仿真,需将Aud_Pro_Dis.vhd源程序中的divider_mod值改的小些,下面给出的仿真波形中,将中音6、低音6、及高音6对应的divider_mod值分别改为40、80、20,clk周期为100ns,分别给note_code赋以下值:

6,16,26,即中音6、低音6、及高音6。

图27音符发声及显示模块仿真波形

    由上图可见,数码管显示均为6,但高低音指示灯的值不同,pitch为高低音指示灯,pitch[1]为高位,且“00”代表中音,“01”代表低音,“10”代表高音。

可见仿真结果及程序均正确。

7.五二输入或门

    由于本系统有自动播放和电子琴弹奏两个模块组成,每次只能其中一个有效,但要共用音符发声及显示模块,故需要将输出的音符码相或后送予后级处理,由于本模块比较简单,在此仅给出仿真波形,如下。

图28五二输入或门

五、遇到问题及解决方法

    1.矩阵键盘的扫描是一个重点和难点,程序写好之初效果并不理想,仔细分析后,发现是没有消抖造成的,后来加入了消抖的进程,效果得到改善。

    2.电子琴弹奏模块的实现过程中也出现了一个问题:

高、中、低音的选择不起作用,此模块仅有一个进程,如下:

process(key,play,EN)

variablesign:

integerrange0to2:

=0;

begin

ifplay='0'andEN='0'then

             ifkey=12then

                    sign:

=0;--mid

             elsifkey=16then

                    sign:

=1;--low

             elsifkey=8then

                    sign:

=2;--high

             endif;

             ifkey>=1andkey<=7then--1~7

                    note_code<=key+10*sign;

             else

                    note_code<=0;--stop

             endif;

      endif;

else

      note_code<=0;

      sign:

=0;

endif;

endprocess;

    但仿真结果令人惊讶,只能输出高音,仿真波形如下,错误处已经用叉号标记出来

       

图29未加入clk时钟信号时的仿真结果

 

解决办法:

给该模块加入时钟驱动,用上升沿触发事件,结果得到了想要的结果,如下图,程序见该模块源代码。

图30加入clk时钟信号时的仿真结果

六、实现结果

1.拨动开关,使start为1,此时数码管显示短横,扬声器不发声;

2.按下矩阵键盘的“AP”键,系统开始自动播放乐曲,顺序:

《世上只有妈妈好》、《长亭送别》、《十年》循环播放;

3.按下歌曲选择键:

“Song”,自动切换到下一首播放;

4.按下“EO”键,扬声器不发声,按数字键1~7,发出do~si的音符;

5.按下“H”、“M”、“L”键,可切换高、中、低音;

6.拨动开关,使start为0,此时数码管显示短横,扬声器不发声;

本文设计的具有自动演奏乐曲功能的电子琴系统,实现了所有设计目标,效果优秀,极具综合性、趣味性!

此系统的功能还可以进一步完善,如增加手动改变音乐播放的节奏、长时间无按键系统自动关闭、手动输入音符再自动播放(当然需将ROM换成RAM)等功能。

此系统是我独立开发的一个小型系统,且实现的效果很好,很有成就感,更加激发我搞科研的热情!

七、编程调试

1.具有自动演奏乐曲功能的电子琴系统的所有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_Controlis

port(clk,start:

instd_logic;

KBCol:

instd_logic_vector(0to3);

song:

bufferstd_logic;

play:

outstd_logic;--1music_play;0:

Elc_keyboard;

sel:

outstd_logic;--1:

music_play;0:

Elc_keyboard;

Key_Note:

bufferintegerrange0to16;

KBRow:

bufferstd_logic_vector(0to3)            

);

endentity;

 

architecturecontrolofKey_Controlis

signalclk_kb:

std_logic;

signalcnt:

integerrange0to1000;

 

signaltemp:

STD_LOGIC_VECTOR(7downto0);

signalstate:

std_logic_vector(1downto0):

="00";

signalcount:

std_logic_vector(1downto0):

="00";

signalkey:

integerrange0to16;

signalkeynum:

integerrange0to16;

signalTempKey:

integerrange0to16;

signalsong_chg:

std_logic:

='0';

 

begin

 

process(clk)--产生键盘扫描

begin

ifrising_edge(clk)then

       ifstart='1'then

              ifcnt=499then--仿真时改为ifcnt=10then

                     clk_kb<=notclk_kb;

                     cnt<=0;

              else

                     cnt<=cnt+1;

              endif;

       endif;

   en

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1