具有自动乐曲演奏功能的电子琴设计先给出设计结果视频链接:具有自动乐曲演奏功能的电子琴-视频实录本文为本人于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)低音1261.6中音1523.3高音11046.5低音2293.7中音2587.3高音21174.7低音3329.6中音3659.3高音31318.5低音4349.2中音4698.5高音41396.9低音5392中音5784高音51568低音6440中音6880高音61760低音7493.9中音7987.8高音71975.51.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音名的编码音名编码音名编码音名编码低音111中音11高音121低音212中音22高音222低音313中音33高音323低音414中音44高音424低音515中音55高音525低音616中音66高音626低音717中音77高音7272.2.2音乐的存储以十进制将音乐分别存储于note_rom和tick_rom两个模块中,前者为音符,后者为音符的长度,下面给出《世上只有妈妈好》的存储过程。在QuartusII主窗体中选择Tools—MegaWizardPluge-InManager…,弹出如下对话框,单击Next继续。图7MegaWizardPluge-InManager第一页按下图选择并填入文件名,点击Next。图8MegaWizardPluge-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按键扫描信息对照表列行0111101111011110111101111234无1011567H无1101APEOSongM无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,时值分别为二分之一拍、四分之一拍、