ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:256.62KB ,
资源ID:12132172      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12132172.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用VHDL语言设计简易电子琴演奏.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用VHDL语言设计简易电子琴演奏.docx

1、用VHDL语言设计简易电子琴演奏基于VHDL语言设计简易电子琴演奏电路摘要:生活中一首简单的歌也要遵循基本的乐理知识,歌曲要有固定的节拍,即每多少分音符为一拍,每小节几拍。因此,拍子是音乐中最重要的组成部分,本课程设计主要采用EDA技术,基于VHDL语言设计一个简易的八音符电子琴,并且可以选择通过按键输入或者自动演奏来奏出存入的乐曲。课程设计中,程序运行平台为MAX+plusIIo根据音符的分频预置数来弹奏出不同的音符,将演奏出的小红帽既而再通过各个子模块,编程,仿真,达到最终的验证。关键字:EDA;VHDL;电子琴;音符;频率一、设计说明(1)EDA的技术及其发展当今世界,电子技术有了突飞猛

2、进的发展,这使得现代电子产品融入并运用于各个领域,其性能也在逐步地提高。现代电子技术的核心是EDA,EDA是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD、CAM、CAT和CAE的概念发展而来的,以硬件描述语言为系统逻辑描述的主要表达方式,并以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计电子系统到硬件系统。EDA工具从数字系统设计的单一领域,发展到今天,应用范围已涉及模拟、微波等多个领域,包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。可

3、以说,EDA技术为现代电子理论和设计的表达与实现提供了可能。(2)VHDL语言的特点常用硬件描述语言有VHDL、Verilog和ABEL语言,其中VHDL语言用的较为广泛,它的全英文名VHSIC(VeryHighSpeedIntegratedCircuit)HardwareDescriptionLanguage,是以高级描述语言,系统级仿真和综合技术为特点,采用“自顶向下”的设计理念,VHDL具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。VHDL的结构特点是将设计实体的内部功能和算法完成部分。相对于其他硬件语言,VHDL

4、有许多优点。比如VHDL的行为描述能力更强,而且具有丰富的仿真语句和库函数,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。二、设计目的生活中,我们离不开音乐,由和谐的音调组成的各种美妙动听的音乐给我们带来了听觉上得享受和精神上的放松,可知,一首简单的歌也要遵循基本的乐理知识,歌曲要有固定的节拍,即每多少分音符为一拍,每小节几拍。因此,拍子是音乐中最重要的组成部分,日常生活中的音乐需要由乐器来演奏,在众多乐器中,电子琴较特殊,它是以一种合成的键盘乐器,类似于钢琴,但要依靠电源才能工作。如图一所示为电子琴,但归根到底其结构也是由基本的编程以及电路所构成。图一在本课程中,将

5、要运用本学期所学的VHDL语言设计一个简易的电子琴来演奏音乐,设计的主要目的有以下两点:1、通过课程设计,加深理解,能够更深地掌握这门课所学的知识,以及掌握和运用MAX+PLUSII软件,以便在以后的生活学习中能够得心应手进行其他的设计。2、通过编程,波形仿真,以培养开动脑筋,自主能动性以及学会思考问题,学会动手的能力,通过理论与实践的结合学会在以后的生活中可以自如地将所学习的知识运用到实际。三、设计整体思路及原理(一)设计思路本课程设计主要是基于VHDL文本输入法设计乐曲演奏电路,在大二期间,数字电路与分析这门专业课中也做过音乐发生器的设计性实验,而这次课程设计,由于硬件设备等缺陷,硬件部分

6、的测试将无法完成,于是实验中主要考察对软件编程的能力。在课本EDA技术的P251页中,有一个“乐曲硬件演奏”的实验,该实验中用到三个子模块,而我所设计的“简易八音符电子琴演奏电路”与次实验很相似,也要涉及到类似的三个子模块,但是,相比之下,我所设计的电路新增加一个功能,即“电子琴可以自动播放音乐,在演奏乐曲中,通过AUTO子模块既可以用手动弹奏键盘输入音乐,也可以选择自动演奏”。由前面所述可知,一首乐曲的节拍频率很重要,因此在编程时应当要考虑到每一个音符所占的时钟节拍。课本中采用的是优美动听的中国古典音乐梁祝这首曲子,我决定在程序中填入小红帽这首琅琅上口的儿歌,它的节奏感比较鲜明,曲长较短,每

7、个音符几乎都涉及到,并且简单易懂。由乐理知识可知,小红帽是一首2/4拍的歌曲,即:“以四分音符为一拍,每小节两拍”。图二是选自小红帽歌曲中前八小节的简谱:小红帽2/4节拍图二以上是整个歌曲的部分简谱,从中可以看出,每一小节的是两拍,如果令一个时钟周期CLK为一拍,那么可知在第一小节中,音符1和2个占1/2拍,3和4也是同理。若定义一个时钟周期是1S,那么1、2、3、4各时占0.5So根据歌曲的节拍频率,可知音符的持续时间需要根据乐曲的速度计每个音符的拍数来确定,所以需要给每一个音符设定分频预置数,由课本中可知,每一个音符都有固定分频预置数,在本首歌曲中,出现的音符一共有1,2,3,4,5,6,

8、8(8为简谱中的高音do),查表可得,他们的分频预置数分别为:音符分频预置数177329123103641116511976129081410图三根据上表中所示的预置分频数,就可以区分不出不同的音符,既而可以在键盘上输入自己想要的音乐。(二)设计原理经过分析之后,可知课程设计所需要三个子模块,它们分别是:乐曲自动演奏模块发音模块分频模块1、乐曲自动演奏模块此模块主要用来产生想要演奏的音乐,而在程序中,软件不能够辨认出简谱,而是信号,因为基本的音符是8个,因此,对于输入的每一个音符,都设置成4位发生控制输入信号。将他们输入,电脑便根据4位2进制的值来确定相对应的音符,还有一点应当注意:此模块输入

9、音乐有两种方式,可以同步演奏也可以自动演奏,这需要有AUT0(0或1)的值来确认,总之,AUTO的主要目的是将二进制信号转化为能够发声的音乐。2、 发音模块此模块主要是产生音符的分频预置数,根据不同的音符产生不同的分频预置数,分频预置值控制数控分频模块进行分频,由此得到每个音符对应的频率。该模块的输入信号INDEX是为上一个模块的输出INDEXO,且高低音显示信号HIGH和音符分频系数都是根据音符输入确定的。比如INDEX为1是,表示弹奏了一个do,它的分频系数则为773Hz,音符显示信号为1001111,是773的二进制表示,此时高低音显示0表示低音。3、 分频模块此模块主要是对时基脉冲进行

10、分频,得到与0、1、2、3、4、5、6、8八个音符相对应的频率。首先根据时钟信号输入得到时基脉冲及计数器的值,然后将时基脉冲值转化为音符的频率。三个子模块的总体流程如下:图四四、设计要求在课程设计的过程中,对自己提出以下要求:1、 在设计之前,首先要了解设计所需要的相关背景知识,并掌握所设计题目的原理。2、 在设计的过程中,要弄设计实验的整个流程,根据原理设计子模块,并对每一个子模块认真地编写程序,编程的过程中要随时查阅相关资料,遇到不懂得问题应积极解决,再及时地询问老师或同学。3、 仿真时当遇到程序错误导之仿真失败时,应立即寻找失败原因,及时发现错误并改正。五、设计流程在对上述三个模块做了初

11、步的解释后,接下来的工作即对每一个子模块进行编程:(一)乐曲自动演奏模块的图形及程序如下:LIBRARYIEEE;USEIEEE.STD_L0GIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYAUTOISPORT(CLK:INSTD_LOGIC: 一系统时钟信号AUTO:INSTD_LOGIC; 一键盘输入/自动演奏CLK2:BUFFERSTD_LOGIC; 时钟输出INDEX2:INSTD_L0GIC_VECT0R(3DOWNTO0): 键盘输入信号INDEXO:OUTSTD_LOGIC

12、_VECTOR(3DOWNTO0);音符信号输出ENDAUTO;ARCHITECTUREBEHAVIORALOFAUTOISSIGNALCOUNTO:INTEGERRANGE0TO47;一定义信号计数器,有47个信号元素BEGINPULSEO:PROCESS(CLK,AUTO) PULSEO工作进程开始VARIABLECOUNT:INTEGERRANGE0TO8;一定义变量计数器,从0到8BEGIN键盘输入为1IFAUTO=lthenCOUNT:=0;CLK2=O; 一计数器值为0,时钟信号2幅值为0elsifCclk*eventandclk=;r)then输入的时钟信号为其他值COUNT:=

13、COUNT+1; 一计数器加1即为1IFCOUNT=1THENCLK2=T;ELSIFC0UNT=2THENCLK2=0;COUNT:=0;ENDIF;ENDIF;ENDPROCESS;MUSIC:PROCESS(CLK2) MUSIC工作进程开始BEGINIF(CLK2*EVENTANDCLK2=*1)THEN时钟信号2为1IF(C0UNT0=47)THEN 计数器值为47C0UNT0=0; 一计数器清0ELSECOUNTOINDEX0INDEX0INDEX0INDEXOINDEX0INDEX0=0010”; 2WHEN18=INDEX0=0011”; 3WHEN19=INDEX0=0100

14、”; 4WHEN20=INDEX0=0101”; 5WHEN21=INDEX0=0011”; 3WHEN22=INDEX0=0010”; 2WHEN23=INDEX0=0001”; 1WHEN24=INDEX0=0010”; 2WHEN25=INDEX0=0010”; 2WHEN26=INDEX0=0011”; 3WHEN27=INDEX0=0011”; 3WHEN28=INDEX0INDEX0INDEX0INDEX0INDEX0INDEX0=0011”; 3WHEN47=INDEX0=0011”; 3WHENOTHERS=NULL;ENDCASE;ELSEINDEX0=INDEX2; 一将音

15、符信号0的值赋给音符信号2ENDIF;ENDPROCESS;ENDBEHAVIORAL;程序说明:由程序可知,AUTO为低电平有效,当AUTO为“1”时,此时为手动输入音乐演奏,当AUTO为“0”时,为自动输入演奏,当确定了时钟信号输出的值后,在第二个PROCESS中就可以由它控制4位发声控制输入信号了。即CLK2的值为0时,COUNTO为lo最后的COM1便是由前两个PROCESS所确定的COUNTO,AUTO和键盘输入信号值INDEX2将4位的二进制数转化为音符信号的输出,达到自动演奏的目的。(二)发音模块的图形及程序如下:LIBRARYIEEE;USEIEEE.STD_L0GIC_116

16、4.ALL;USEIEEE.STD一LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTONEISPORT(INDEX:INSTD_LOGIC_VECTOR(3DOWNTO0); 一音符输入信号CODE:OUTSTD_L0GIC_VECT0R(6DOWNTO0);音符显示信号HIGH:OUTSTD_LOGIC; 一高低音显示信号TONEO:OUTINTEGERRANGE0TO2047); 一音符的分频系数ENDTONE;ARCHITECTUREARTOFTONEISBEGINSEARCH:PROCESS(INDEX)BEGINCASEIN

17、DEXISWHEN0001”=TONE0=773;CODE=1001111”;HIGH=O;WHEN0010”=TONE0=912;CODE=0010010”;HIGH=O;WHEN0011”=TONE0=1036;CODE=0000110;HIGH=O;WHEN0100”=TONE0=1116;CODE=1001100;HIGHTONEO=1197;CODE=0100100;HIGH=O;WHEN0110”二T0NE0=1290;CODE项0100000”;HIGH=O;WHEN0111”=TONE0=1372;CODE=0001111”;HIGH=O;WHEN1000”二T0NE0=141

18、0;CODE项0000000”;HIGH=1;WHENOTHERS=TONE0=2047;CODE=0000001”;HIGH=O;ENDCASE;ENDPROCESS;ENDART;程序说明:INDEX为输入的音乐,CODE显示分频预置数,当HIGH为“1”时,表示高了8度,为“0”时,表示低音。(三)分频模块的图形及其程序如下:LIBRARYIEEE;USEIEEE.STD_L0GIC_1164.ALL;USEIEEE.STDLOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFENPINISPORT(CLK1:INSTD_LOGIC;

19、 一系统时钟信号TONE1:ININTEGERRANGE0TO2047; 一音符分频系数SPKS: OUTSTD_LOGIC): 一驱动扬声器音频信号ENDENTITYFENPIN;ARCHITECTUREARTOFFENPINISSIGNALPRECLK:STD_LOGIC; 一定义时基脉冲信号SIGNALFULLSPKS:STD_LOGIC;BEGINPROCESS(CLK1)VARIABLECOUNT:INTEGERRANGE0TO8;BEGINIF(CLK1EVENTANDCLK1=T)THEN 一时钟信号为1COUNT:=COUNT+1; 一计数器取值为1IFC0UNT=2THENP

20、RECLK=T;ELSIFCOUNT=4THEN 计数器为4PRECLKVO;COUNT:=0; 一时基脉冲为0,计数器清0ENDIF;ENDIF;ENDPROCESS;PROCESS(PRECLK,T0NE1)VARIABLEC0UNT11:INTEGERRANGE0TO2047;BEGINIF(PRECLKEVENTANDPRECLK=*1)THENIFCOUNT1KT0NE1THENC0UNT11:=COUNT11+1:FULLSPKS=;1;ELSECOUNT11:=O;FULLSPKS=*O;ENDIF;ENDIF;ENDPROCESS;PROCESS(FULLSPKS)VARIAB

21、LEC0UNT2:STD_LOGIC:=O;BEGINIF(FULLSPKSEVENTANDFULLSPKS=T)THEN一音频信号输出上升沿有效C0UNT2:=NOTC0UNT2:IFC0UNT2=lTHENspksCLK,INDEX2=INDEX1,INDEXO=INDX,AUTO=HANDTOAUTO);一调用自动演奏模块U1:TONEPORTMAP(INDEX=INDX,T0NE0=T0NE2,CODE=CODE1,HIGH=HIGH1):调用音调发生模块U2:FENPINPORTMAP(CLK1=CLK,TONE1=TONE2,SPKS=SPKOUT);调用数控分频模块ENDART;

22、程序说明:该顶层模块是整个设计的核心,并且是VHDL程序的主程序,通过调用子程序最终实现乐曲演奏的目的,奏出小红帽。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是对应的,比如AUTO对应HANDTOAUTO,TONEO对应TONE2,SPKS对应SPKOUTo可知总体电路图为:六、仿真波形图()乐曲自动演奏模块的波形图:可知它分为了两种情况,我们分别用两个波形图来解释说明:1、当为自动演奏音乐时的波形如下:说明:可知此时,INDEX。以及计数器COUNTO和COUNT都和时钟输入CLK2有关,而此时,INDEXO和INDEX2无需时序一致

23、,因为在自动演奏的情况下,是先将音乐输入,然后通过播放来自动演奏,AUTO始终为高电平,而CLK只是一个系统时钟,控制着输入端口INDEX2的节拍。歌曲弹奏如下:1234553188645532、当为手动按键输入的方式时,波形如下:说明:由图可知,此时CLK2,COUNTO,COUNT的值都变为0,因为我们要求的是手动弹奏,所以此时自动播放便没有任何意义,输出端口INDEX0只和输入INDEX2有关系,并且两者时序是一致的,在整个过程中,AUT0始终为高电平。(三)发音模块的波形图:说明:由图可知,INDEX此时为输入端口,TONEO为每一个音符的预置分频数,跟前文的表格式相一致的,CODE是为相应得二进制形式,另外,HIGH表示是否高8度,通过图可知当弹到8即高音do时,HIGH变为高电平,表示此时高8度,而其他时候都低音。(四)分频模块的波形图:说明:由图可知,音乐由时基脉冲值转化为音符的频率,T0NE1为音符的预置分频数。当COUNT11加1时,扬声器SPKS变为lo(五)顶层文件波形图:说明:由图可知此时的ANDTIAUTO也是控制自动演奏的,C

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

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