电子琴演奏设计说明

上传人:沈*** 文档编号:99266346 上传时间:2022-05-31 格式:DOC 页数:16 大小:225.50KB
返回 下载 相关 举报
电子琴演奏设计说明_第1页
第1页 / 共16页
电子琴演奏设计说明_第2页
第2页 / 共16页
电子琴演奏设计说明_第3页
第3页 / 共16页
点击查看更多>>
资源描述
设计报告电子琴演奏电路摘要:本课程设计主要采用EDA技术,基于VHDL语言设计一个简易的八音符电子琴,并且可以选择通过按键输入或者自动演奏来奏出存入的乐曲。课程设计中,程序运行平台为Quartus。根据音符的分频预置数来弹奏出不同的音符,将演奏出的小红帽既而再通过各个子模块,编程,仿真,到达最终的验证。关键字:EDA;VHDL; 电子琴; 音符;频率一、 设计目的在本课程中,将要运用本学期所学的VHDL语言设计一个简易的电子琴来演奏音乐,设计的主要目的有以下两点:1、通过课程设计,加深理解,能够更深地掌握这门课所学的知识,以与掌握和运用Quartus软件,以便在以后的生活学习中能够得心应手进展其他的设计。2、通过编程,波形仿真,以培养开动脑筋,自主能动性以与学会思考问题,学会动手的能力,通过理论与实践的结合学会在以后的生活中可以自如地将所学习的知识运用到实际。二、设计整体思路与原理一设计思路本课程设计主要是基于VHDL文本输入法设计乐曲演奏电路,在课本EDA技术的P251页中,有一个“乐曲硬件演奏的实验,该实验中用到三个子模块,而我所设计的“简易八音符电子琴演奏电路与次实验很相似,也要涉与到类似的三个子模块,但是,相比之下,我所设计的电路新增加一个功能,即“电子琴可以自动播放音乐,在演奏乐曲中,通过AUTO子模块既可以用手动弹奏键盘输入音乐,也可以选择自动演奏。由前面所述可知,一首乐曲的节拍频率很重要,因此在编程时应当要考虑到每一个音符所占的时钟节拍。课本中采用的是优美动听的中国古典音乐梁祝这首曲子,我决定在程序中填入小红帽这首琅琅上口的儿歌,它的节奏感比拟鲜明,曲长较短,每个音符几乎都涉与到,并且简单易懂。由乐理知识可知,小红帽是一首2/4拍的歌曲,即:“以四分音符为一拍,每小节两拍。图二是选自小红帽歌曲中前八小节的简谱:小红帽2/4节拍图二以上是整个歌曲的局部简谱,从中可以看出,每一小节的是两拍,如果令一个时钟周期CLK为一拍,那么可知在第一小节中,音符1和2个占1/2拍,3和4也是同理。假设定义一个时钟周期是1S,那么1、2、3、4各时占0.5S。根据歌曲的节拍频率,可知音符的持续时间需要根据乐曲的速度计每个音符的拍数来确定,所以需要给每一个音符设定分频预置数,由课本中可知,每一个音符都有固定分频预置数,在本首歌曲中,出现的音符一共有1,2,3,4,5,6,88为简谱中的高音do,查表可得,他们的分频预置数分别为:音符分频预置数177329123103641116511976129081410图三根据上表中所示的预置分频数,就可以区分不出不同的音符,既而可以在键盘上输入自己想要的音乐。二设计原理经过分析之后,可知课程设计所需要三个子模块,它们分别是: 乐曲自动演奏模块 发音模块 分频模块1、乐曲自动演奏模块代码实体:LIBRARY IEEE;ENTITY AUTO IS PORT(CLK: IN STD_LOGIC; -系统时钟信号 AUTO: IN STD_LOGIC; -键盘输入/自动演奏 CLK2: BUFFER STD_LOGIC; -时钟输出 INDEX2: IN STD_LOGIC_VECTOR(3 DOWNTO 0); -键盘输入信号 INDEX0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -音符信号输出END AUTO;此模块主要用来产生想要演奏的音乐,而在程序中,软件不能够识别出简谱,而是信号,因为根本的音符是8个,因此,对于输入的每一个音符,都设置成4位发生控制输入信号。将他们输入,电脑便根据4位2进制的值来确定相对应的音符,还有一点应当注意:此模块输入音乐有两种方式,可以同步演奏也可以自动演奏,这需要有AUTO0或1的值来确认,总之,AUTO的主要目的是将二进制信号转化为能够发声的音乐。由程序可知,AUTO为低电平有效,当AUTO为“1时,此时为手动输入音乐演奏,当AUTO为“0时,为自动输入演奏,当确定了时钟信号输出的值后,在第二个PROCESS中就可以由它控制4位发声控制输入信号了。即CLK2的值为0时,COUNT0为1。最后的COM1便是由前两个PROCESS所确定的COUNT0、AUTO和键盘输入信号值INDEX2将4位的二进制数转化为音符信号的输出,到达自动演奏的目的。2、发音模块代码实体:LIBRARY IEEE;ENTITY TONE ISPORT(INDEX: IN STD_LOGIC_VECTOR(3 DOWNTO 0); -音符输入信号 CODE: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -音符显示信号 HIGH: OUT STD_LOGIC; -上下音显示信号 TONE0:OUT INTEGER RANGE 0 TO 2047); -音符的分频系数END TONE;此模块主要是产生音符的分频预置数,根据不同的音符产生不同的分频预置数,分频预置值控制数控分频模块进展分频,由此得到每个音符对应的频率。该模块的输入信号INDEX是为上一个模块的输出INDEX0,且上下音显示信号HIGH和音符分频系数都是根据音符输入确定的。比方INDEX为1是,表示弹奏了一个do,它的分频系数那么为773Hz,音符显示信号为1001111,是773的二进制表示,此时上下音显示0表示低音。INDEX为输入的音乐,CODE显示分频预置数,当HIGH为“1时,表示高了8度,为“0时,表示低音。3、分频模块代码实体:LIBRARY IEEE;ENTITY FENPIN ISPORT(CLK1: IN STD_LOGIC; -系统时钟信号TONE1: IN INTEGER RANGE 0 TO 2047; -音符分频系数 SPKS: OUT STD_LOGIC); -驱动扬声器音频信号END ENTITY FENPIN;此模块主要是对时基脉冲进展分频,得到与0、1、2、3、4、5、6、8八个音符相对应的频率。首先根据时钟信号输入得到时基脉冲与计数器的值,然后将时基脉冲值转化为音符的频率。注意最后一个PROCESS那么是用来设置扬声器输出信号的,扬声器信号由0和1控制,当且仅当前一个PROCESS中的FULLSPKS输出为1时,扬声器才有输出,再根据计数器取值来确定输出是1还是0三个子模块的总体流程如下:顶层电路的图形:代码实体:LIBRARY IEEE; ENTITY DIANZIQIN ISPORT(CLK12MHZ: IN STD_LOGIC; -系统时钟信号 CLK8HZ: IN STD_LOGIC; -系统时钟信号 HANDTOAUTO: IN STD_LOGIC; -键盘输入/自动演奏信号 CODE1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -音符显示信号 INDEX1: IN STD_LOGIC_VECTOR(3 DOWNTO 0); -键盘输入信号 HIGH1: OUT STD_LOGIC; -上下音节信号 SPKOUT: OUT STD_LOGIC); -音频信号该顶层模块是整个设计的核心,并且是VHDL程序的主程序,通过调用子程序最终实现乐曲演奏的目的,奏出小红帽。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,比方AUTO对应HANDTOAUTO,TONE0对应TONE2,SPKS对应SPKOUT。可知总体电路图为:三、仿真波形图一乐曲自动演奏模块的波形图:可知它分为了两种情况,我们分别用两个波形图来解释说明:1、当为自动演奏音乐时的波形如下:说明:可知此时,INDEX0以与计数器COUNT0和COUNT都和时钟输入CLK2有关,而此时,INDEX0和INDEX2无需时序一致,因为在自动演奏的情况下,是先将音乐输入,然后通过播放来自动演奏,AUTO始终为高电平,而CLK只是一个系统时钟,控制着输入端口INDEX2的节拍。歌曲弹奏如下:1 2 3 4 5 5 3 1 8 8 6 4 5 5 32、当为手动按键输入的方式时,波形如下:说明:由图可知,此时CLK2,COUNT0,COUNT的值都变为0,因为我们要求的是手动弹奏,所以此时自动播放便没有任何意义,输出端口INDEX0只和输入INDEX2有关系,并且两者时序是一致的,在整个过程中,AUTO始终为高电平。二发音模块波形图说明:由图可知,INDEX此时为输入端口,TONE0为每一个音符的预置分频数,跟前文的表格式相一致的,CODE是为相应得二进制形式,另外,HIGH表示是否高8度,通过图可知当弹到8即高音do时,HIGH变为高电平,表示此时高8度,而其他时候都低音。三分频模块的波形图:说明:由图可知,音乐由时基脉冲值转化为音符的频率,TONE1为音符的预置分频数。当COUNT11 加1时,扬声器SPKS变为1。四顶层文件波形图:说明:由图可知此时的ANDTIAUTO也是控制自动演奏的,CLK为系统时钟,同理,INDEX1为所输入的音符,而CODE1直接描述出分频的过程,显示和INDEX1一致,HIGH1控制上下音。四、引脚锁定硬件仿真时,我采用的是电路模式5,各引脚的锁定如下表所示:五、硬件仿真1、仿真时,选择电路模式5,各引脚锁定如上所示,用短路帽选中Clock 0、Clock 2、蜂鸣器SPKER,Clock 0接入12MHZ的系统时钟, Clock 2接入8HZ的系统时钟,KEY2接模式选择开关HANDAUTO,KEY4,KEY5,KEY6,KEY7,作为四个手弹奏的按键,HIGH1接D1,用来显示高音节。CODE0.3接数码管8,用来显示此时的音符。2、实验结果:连接好EDA实验箱,把设计容下载到实验箱上的芯片上。(1)、不按下KEY2,此时HANDAUTO=0,可以听到小红帽演奏起来,同时数码管8显示对应的音符,D1在数码管显示8时亮,其余不亮。(2)、按下KEY2,此时HANDAUTO=1,我们手弹奏KEY4-KEY7,我们按小红帽简谱弹奏,可听到小红帽这首动听的音乐。同时数码管8显示对应的音符,D1在数码管显示8时亮,其余不亮。六、总结开场按照查到的资料上做,数控分频器模块FEPIN的输入时钟和自动演奏模块AUTO的时钟均为32MHZ。音乐播放度太快,此时听不到正常的音乐播放,而且在原资料上只给了一个时钟输入,乐曲的自动演奏和手动演奏无常转换,硬件仿真时也验证了我的推论,所以在自己的设计中,我选用了两个时钟,CLK12MHZ和CLK8HZ,CLK12MHZ用于数控分频输入,CLK8HZ用于AUTO模块的时钟输入,由于我们EDA实验箱上的数码管已经接好了译码器,只有4个外接引脚,我把资料里的7位二进制数改为4位二进制数,同时把编码改好,使数码能够在实验箱上正常的显示。即把CODE6.0修改为CODE3.0。在仿真的过程中开场不知道到怎么给时钟信号,老是出不来,后来看资料问同学,知道了AUTO模块的作用有两个,要分开加信号,所以才有两个不同的仿真结果。在硬件调试的过程中开场因为只有一个时钟信号,只能手动演奏不能自动演奏而且过程中还有噪音,后来改为两个时钟信号,结果就正确了。通过实验我体会到能力的重要性,按照别人给好的东西做起来都如此费力,我明白了不管做什么在做之前一定要好好预习,弄懂它的原理,就像这次实验,开场什么都不懂,照着给的瞎做,出现了很多问题,其次上课要好好听课,弄懂教师说的,在实践中提升自己的能力。九、参考文献: 1松,黄继业.EDA技术实用教程.:科学,20022甘历.VHDL应用于开发实践.:科学,20033齐洪喜,陆颖.VHDL电路设计实用教程.:清华大学,2004十、附录此处为自动演奏模块的详细代码;LIBRARY IEEE;ENTITY AUTO IS PORT(CLK: IN STD_LOGIC; -系统时钟信号 AUTO: IN STD_LOGIC; -键盘输入/自动演奏 CLK2: BUFFER STD_LOGIC; -时钟输出 INDEX2: IN STD_LOGIC_VECTOR(3 DOWNTO 0); -键盘输入信号 INDEX0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -音符信号输出END AUTO;ARCHITECTURE BEHAVIORAL OF AUTO IS SIGNAL COUNT0:INTEGER RANGE 0 TO 47; -定义信号计数器,有47个信号元素BEGINPULSE0:PROCESS(CLK,AUTO) -PULSE0工作进程开场 VARIABLE COUNT:INTEGER RANGE 0 TO 8; -定义变量计数器从0到8BEGIN IF AUTO=1THEN -键盘输入为1 COUNT:=0;CLK2=0; -计数器值为0,时钟信号2幅值为0 ELSIF(CLKEVENT AND CLK=1) THEN -输入的时钟信号为其他值 COUNT:=COUNT+1; -计数器加1即为1 IF COUNT=1 THEN CLK2=1; ELSIF COUNT=2 THEN CLK2=0;COUNT:=0;END IF;END IF;END PROCESS;MUSIC:PROCESS(CLK2) -MUSIC工作进程开场BEGIN IF(CLK2EVENT AND CLK2=1) THEN -时钟信号2为1 IF(COUNT0=47)THEN -计数器值为47 COUNT0=0; -计数器清0ELSE COUNT0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0NULL;END CASE;ELSE INDEX0TONE0=773;CODE=0001;HIGHTONE0=912;CODE=0010;HIGHTONE0=1036;CODE=0011;HIGHTONE0=1116;CODE=0100;HIGHTONE0=1197;CODE=0101;HIGHTONE0=1290;CODE=0110;HIGHTONE0=1372;CODE=0111;HIGHTONE0=1410;CODE=1000;HIGHTONE0=2047;CODE=0000;HIGH=0;END CASE;END PROCESS;END ART;附录3-此处为分频模块的详细代码;LIBRARY IEEE;ENTITY FENPIN IS PORT(CLK1: IN STD_LOGIC; -系统时钟信号 TONE1: IN INTEGER RANGE 0 TO 2047; -音符分频系数 SPKS: OUT STD_LOGIC); -驱动扬声器音频信号END ENTITY FENPIN;ARCHITECTURE ART OF FENPIN ISSIGNAL PRECLK:STD_LOGIC; -定义时基脉冲信号SIGNAL FULLSPKS:STD_LOGIC;BEGINPROCESS(CLK1) VARIABLE COUNT:INTEGERRANGE 0 TO 8;BEGIN IF (CLK1EVENT AND CLK1=1) THEN -时钟信号为1COUNT:=COUNT +1; -计数器取值为1IF COUNT=2 THENPRECLK=1;ELSIF COUNT =4 THEN -计数器为4PRECLK=0;COUNT:=0; -时基脉冲为0,计数器清0END IF ;END IF ;END PROCESS;PROCESS(PRECLK,TONE1)VARIABLE COUNT11:INTEGERRANGE 0 TO 2047;BEGIN IF (PRECLKEVENT AND PRECLK=1) THENIF COUNT11TONE1 THEN COUNT11:=COUNT11+1;FULLSPKS=1;ELSECOUNT11:=0;FULLSPKS=0;END IF ;END IF ;END PROCESS;PROCESS(FULLSPKS)VARIABLE COUNT2 :STD_LOGIC:=0;BEGIN IF (FULLSPKSEVENT AND FULLSPKS=1) THEN -音频信号输出上升沿有效COUNT2:=NOT COUNT2;IF COUNT2=1THENSPKS=1;ELSE SPKSCLK8HZ,INDEX2=INDEX1,INDEX0=INDX,AUTO=HANDTOAUTO); U1:TONE -调用音调发生模块 PORT MAP(INDEX=INDX,TONE0=TONE2,CODE=CODE1,HIGH=HIGH1);U2:FENPIN -调用数控分频模块PORT MAP(CLK1=CLK12MHZ,TONE1=TONE2,SPKS=SPKOUT);END ART;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!