• 616.50 KB
  • 2022-04-22 13:42:32 发布

音乐演奏系统毕业设计.doc

  • 25页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'毕业论文音乐演奏系统音乐演奏系统毕业设计目录1绪论1.1EDA技术11.2VHDL语言11.3FPGA简介12总体设计2.1设计目的和任务要求2.1.1设计目的12.1.2设计任务要求12.2音乐演奏系统组成2.2.1音乐演奏系统电路基本原理22.2.2音符频率的得到22.2.3自动播放乐曲节奏控制22.2.4乐谱发生器32.2.54×4矩阵式键盘32.2.6音乐演奏电路总体设计32.3顶层模块设计2.4单元模块设计2.4.14X4矩阵式键盘Key_encoderVHDL模块设计42.4.2自动乐曲播放模块NoteTabsVHDL模块设计52.4.3定制音符数据的ROM文件52.4.4音乐谱对应分频预置数查表电路Tone_tab1VHDL模块设计62.4.5Speakera音乐符数控分频模块VHDL模块设计82.4.64位数据宽度的二选一多路选择器Mux21cVHDL模块设计82.5VHDL音乐演奏系统仿真与调试2.5.1自动乐曲播放模块NoteTabs的仿真92.5.2音乐谱对应分频预置数查表电路Tone_tab1模块的仿真92.5.3Speakera音乐符数控分频模块的仿真102.5.44X4矩阵式键盘Key_encoder模块仿真102.5.54位数据宽度的二选一多路选择器Mux21c模块仿真11参考文献13附录14附录A顶层模块VHDL程序:14附录B4X4矩阵式键盘Key_encoderVHDL程序:16附录C自动乐曲播放模块模块程序:17附录D音乐谱对应分频预置数查表电路Tone_tab1VHDL程序:18附录FSpeakera音乐符数控分频模块VHDL其程序如下:19附录E4位数据宽度的二选一多路选择器Mux21cVHDL程序211 毕业论文音乐演奏系统心得体会221 毕业论文音乐演奏系统1绪论1.1EDA技术EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(HDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。它主要采用“自顶向下”的设计方法,设计流程主要包括:设计输入、综合、仿真、适配、下载。EDA技术主要有以下特征:(1)高层综合的理论和方法取得进展,从而将EDA设计层次由RT级提高到了系统级,并推出了相应的系统级综合优化工具,大大缩短了复杂ASIC的设计周期。(2)采用硬件描述语言来描述10万门以上的设计,并形成了VHDL和Verilog-HDL两种标准硬件描述语言。(3)采用平面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。(4)为带有嵌入式IP核的ASIC设计提供软、硬件协同设计工具。(5)建立并行设计工具框架结构的集成化设计环境,以适应当今ASIC规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。1.2VHDL语言VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。VHDL程序结构包括:实体(Entity)、结构体(Architecture)、配置(Configuration)、包集合(Package)及库(Library)。其中,实体是一个VHDL程序的基本单元,由实体说明和结构体两部分组成:实体说明用于描述设计系统的外部接口信号;结构体用于描述系统的行为、系统数据的流程或系统组织结构形式。配置用语从库中选取所需的单元来组成系统设计的不同规格的不同版本,使被设计系统的功能发生变化。包集合存放各设计模块能共享的数据类型、常数、子程序等。库用于存放已编译的实体、构造体、包集合及配置:一种是用户自己开发的工程软件,另一种是制造商提供的库。关于VHDL最后要说明的是:与常规的顺序执行的计算机程序不同,VHDL从根本上讲是并发执行的。在VHDL中,只有在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。1.3FPGA简介FPGA是现场可编程门阵列的简称。FPGA在结构上主要分为三个部分,即可编程逻辑单元,可编程输入/输出单元和可编程连线三个部分。高集成度、高速度和高可靠性是FPGA最明显的特点。于FPGA的集成规模非常大,可利用先进的EDA工具进行电子系统设计和产品开发。由于开发工具的通用性、设计语言的标准化以及设计过程几乎与所用器件的硬件结构没有关系,因而设计开发成功的各类逻辑功能块软件有很好的兼容性和可移植性。FPGA掉电后将丢失原有的逻辑信息,所以在实用中需要为FPGA芯片配置一个专用ROM。1 毕业论文音乐演奏系统2总体设计2.1设计目的和任务要求2.1.1设计目的进一步巩固理论知识,培养所学理论知识在实际中的应用能力;掌握EDA设计的一般方法;熟悉一种EDA软件,掌握一般EDA系统的调试方法;利用EDA软件设计一个电子技术综合问题,培养VHDL编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础。2.1.2设计任务要求本次设计要求利用4×4矩阵式键盘作为电子琴按键输入,用FPGA设计一个既可以区分不同音高和音阶进行乐曲的演奏,又可以自动播放乐曲的电子琴。要求掌握乐曲的发声原理,掌握4×4键盘以及音频功放模块的原理及编程控制。下载并测试电路功能,分析芯片资源的占用情况。2.2音乐演奏系统组成音乐演奏系统目前得到广泛应用,实现方法也有许多种,但随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使运用EDA技术设计该系统的方案的应用越来越多。因为FPGA预装了很多已构造好的参数化库单元LPM器件,通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。图2-1音乐演奏系统组成图该主系统由三个模块:Spiel顶层文件,Spkout,分频器,自动播放控制,按键输入音乐,二选一选择器,音阶频率产生电路组成。且Spiel顶层文件还包括4个子文件分别是Key_encoder,NoteTabs,ToneTaba和Speakera,此外,我们还需建立一个名为“music”的LPM_ROM模块和与NoteTabs模块连接。23 毕业论文音乐演奏系统2.2.1音乐演奏系统电路基本原理硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。2.2.2音符频率的得到多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行12分频,才能获得1MHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。下表就是简谱中音名与频率的对应关系。图2-2简谱中音名与频率的对应关系2.2.3自动播放乐曲节奏控制本设计以“两只蝴蝶”为例,最小的节拍为1/4拍,若将1拍的时间定为0.5秒,则只需要提供一个8Hz的时钟频率即可产生1/4拍的时长(0.125秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低23 毕业论文音乐演奏系统2.2.4乐谱发生器本设计将乐谱中的音符数据存储在LPM-ROM中,如“两只蝴蝶”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即0.5秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个8Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。2.2.54×4矩阵式键盘在数字系统中,用二进制代码表示特定信息的过程称为编码。能完成编码的电路称为编码器。十六进制编码键盘是一个4×4的矩阵结构,用x3-x0和y3-y0等八条信号线接受十六个键的信息,X[3…0]是行信息输入端,Y[3…0]是列信息输入端,没有按下键时,信号线呈高电平,有按下键时,相应信号线呈低电平。例如,当0键按下时,x3x2x1x0=1110,y3y2y1y0=1110,编码器输出k_code[3…0]=0,当1按下时,x3x2x1x0=1110,y3y2y1y0=1101,k_code[3…0]=1;依此类推。2.2.6音乐演奏电路总体设计组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。如图2-1模块NoteTabs类似于音乐播放器;Key_encoder类似于电子琴键;Speakera类似于琴弦或音调发声器。音符的频率可以由图2-1中的Speakera获得,这是一个数控分频器。由其clk端输入一具有较频率(这里是12MHz)的信号,通过Speakera分频后由Spkout输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。Speakera对clk输入信号的分频比由11位预置数Tone[10..0]决定。Spkout的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone[10..0]与Spkout的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图2-1中模块Tone-tab1的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间即为此音符的节拍值。输向Tone-tab1中Index[3..0]的值ToneIndex[3..0]和K_code[3..0]的输出值与持续的时间由模块NoteTabs和Key_encoder决定。当一个8Hz的时钟脉冲来到时,NoteTabs模块输出一个音符数据给Tone-tab1模块,Tone-tab1模块输出此音符相应的分频系数,将分频系数送给Speakera模块,。在NoteTabs中设置了一个music模块,作为音符数据ROM的地址发生器。音乐演奏电路主要是用VHDL语言来设计,并利用QuartusII7.1软件工具来编译、测试和仿真,综上得到乐曲演奏电路的原理图如图2-3所示。2.3顶层模块设计顶层设计按自顶向下的设计方法进行,首先通过自动音乐播放控制notetabs模块和4X4矩阵式键盘key_encoder模块产生对应音节所对应的索引值,然后通过二选一多路选择器mux21c模块实现手动和自动的切换,把对应音节的索引值送到数控分频tone_tab1模块23 毕业论文音乐演奏系统产生用于分频的分频系数,利用分频系数,通过音节频产生speakera模块进行分频,产生音节发声所需的频率,接到蜂鸣器既可以发出音乐。图2-3顶层模块原理图2.4单元模块设计根据顶层原理图,共分为key_encoder模块、notetabs模块、mux21c模块、tone_tab1模块、speakera模块这五个模块。music模块存放乐曲中的音符数据,notetabs模块作为music模块中所定制的音符数据ROM的地址发生器,tone_tab1模块提供分频预置数即给数控分频模块提供分频系数。speakera模块根据分频预置数输出各个音符所对应的频率。在乐曲构成中,乐音的频率和持续时间是其构成要素。音阶的频率可以通过高频时钟进行分频得到。因此采用一个较为合适的时钟频率12MHz。2.4.14X4矩阵式键盘Key_encoderVHDL模块设计4X4矩阵式键盘采用16进制编码键盘结构,用x3-x0和y3-y0等八条信号线接受十六个键的信息。该段程序用于按键输入电子琴键盘,按下一个键响一个音,分别设定对应为休止符,低音1到高音1。X[3…0]是行信息输入端,Y[3…0]是列信息输入端,没有按下键时,信号线呈高电平,有按下键时,相应信号线呈低电平。例如,当0键按下时,x3x2x1x0=1110,y3y2y1y0=1110,编码器输出k_code[3…0]=0000,当1按下时,x3x2x1x0=1110,y3y2y1y0=1101,k_code[3…0]=0001;依此类推。23 毕业论文音乐演奏系统图2-44X4矩阵式键盘原理图2.4.2自动乐曲播放模块NoteTabsVHDL模块设计音乐的播放就是通过外部8Hz时钟驱动,内部以计数器进行计数,产生地址,送到ROM单元中作为存储器地址,将对应地址的数据——音阶索引值输出。:图2-5自动乐曲播放模块原理图2.4.3定制音符数据的ROM文件23 毕业论文音乐演奏系统Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,地址线为9位,数据线宽度为4位。ROM内存储的数据即各音阶的索引值,根据乐谱转换的需要,16个索引值即可满足乐谱编写的需要,所以设置了4位数据线。地址线的宽度主要取决于乐曲的长度,本例用到了256个4bit单元,将数据线宽度定义为9位。表1列出了索引值与音阶的对应关系。因为1拍的时间定为0.5秒,提供的是8Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[3..0]端口输向分频预置数模块。这样“两只蝴蝶”乐曲中的音符就一个接一个的通过toneindex[3..0]端口输向分频预置数模块。然后对音符数据进行ROM定制,最后对定制好的ROM文件进行测试和仿真。ROM定制的基本步骤如下:(1)进入QuartusII,选菜单TOOL->megawizardplug-inmanager,选择“creatanew…”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名。(2)单击“next”键,,选择ROM数据位宽度为4,地址线宽为256,即设置此ROM能存储8位二进制数据共256个。(3)通过“browse”钮,找到ROM中的加载文件路径和文件名:注意ROM元件的inclock是地址锁存时钟。(4)打开已定制的ROM文件,将它设置为工程,并确定目标器件,进行测试仿真波形,按照定制步骤对音符数据文件进行ROM定制。图2-6定制ROM初始化文件music.mif2.4.4音乐谱对应分频预置数查表电路Tone_tab1VHDL模块设计各音符的分频系数就是从1MHz的基准频率二分频得到的500KHz频率基础上计算得到的。由于最大分频系数是1911,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0。23 毕业论文音乐演奏系统图2-7音阶、频率、预置分频系数的对应关系在这个模块的VHDL逻辑描述中设置了“两只蝴蝶”全部音符所对应的分频预置数,共16个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为8Hz。这16个值的输出由程序的4位输入值index[3..0]确定。输向分频预置数模块的程序中index[3..0]的值又由地址发生器模块的输出toneindex[3..0]的输出值和持续时间决定。图2-8音乐谱对应分频预置数查表电路原理图程序的功能是输出各个音符所对应的分频预置数,当index是“0000”,tone输出为00000000000,即休止符的分频预置数;当index是“0010”时,tone输出为1703,即低音2的分频预置数;当index是“1111”时,tone输出为478即高音1的分频预置数。当index取不同的值时,tone分别输出相应音符的分频预置数。23 毕业论文音乐演奏系统2.4.5Speakera音乐符数控分频模块VHDL模块设计音阶产生电路在获取上面的音阶索引值对应的分频系数后,通过可控计数器进行分频。分频器电路中“TONE”作为预置数,进行减一计数。图2-9音乐符数控分频模块原理图在该VHDL描述程序中,进程“dicideclk”将外部时钟进行预分频,即12分频,因此外部输入的时钟信号如果为12MHZ,则经过此分频后得到1MHZ的信号。因为表2-2的个音节的分频系数是以1MHZ外部时钟信号为前提的。这样在移植程序时,可根据硬件条件调整此分频系数,保证获得1MHZ时钟信号系数即可。进程“GENSPKS”的作用是根据预置数的不同,产生2倍音阶信号。因为此信号的脉冲宽度极小(1个Preclk周期),所以需要调整占空比才使外部驱动电路提供足够的驱动蜂鸣器的功率。2.4.64位数据宽度的二选一多路选择器Mux21cVHDL模块设计为了实现自动音乐播放和按键输入电子琴功能切换,本例设置了一个二选一多路选择器,通过按键控制选择段端按键音和存储音乐的选择播放。图2-104位数据宽度的二选一多路选择器原理图在该VHDL描述程序中,当不按下key时,相当于低电平0,实现的是按键输入,将k_code输出到index中。当按下key时,相当于高电平1,实现的是indextone输出到index中。23 毕业论文音乐演奏系统2.5VHDL音乐演奏系统仿真与调试2.5.1自动乐曲播放模块NoteTabs的仿真(1)波形仿真:将所编写的音乐节拍和音调模块NoteTabs的程序设为工程。进行仿真,仿真结果如图2-11所示。图2-11NoteTabs自动乐曲播放模块的仿真结果(2)模块功能分析与调试音乐节拍和音调模块NoteTabs的功能是控制自动音乐播放,音乐的数据存储在定制的ROM中,当启动自动音乐播放时,则将ROM中存储的对应音节的索引值输出出来,再通过索引值得到对应音节的分频系数。如图2-6music.mif中所存数据,存储次数的多少代表音节发声的长短,所以对应于图2-6,仿真正确。2.5.2音乐谱对应分频预置数查表电路Tone_tab1模块的仿真(1)波形仿真:将所编写的分频预置数查表模块Tone_tab1的程序设为工程。进行仿真,仿真结果如图2-12所示。图2-12Tone_tab1分频预置数查表模块的仿真结果(2)模块功能分析与调试Tone_tab1分频预置数模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到若当index是“0000”,tone输出为0,即休止符的分频预置数;当index是“0101”时,tone输出为1432即低音4的分频预置数;当index是“1111”时,tone输出为478即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数,23 毕业论文音乐演奏系统仿真波形图证明了程序实现了模块的功能。2.5.3Speakera音乐符数控分频模块的仿真(1)波形仿真:将所编写的音乐符数控分频模块Speakera的程序设为工程进行仿真,仿真结果如图2-13所示。图2-13Speakera音乐符数控分频模块的仿真结果(2)模块功能分析与调试Speakera音乐符数控分频此模块的功能是根据初始值Tone的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行12分频得到的1MHz,1MHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。在clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。这里是对12MHz的信号进行12分频得到1MHz的信号。1MHz的时钟脉冲信号是给数控分频模块提供时钟信号。数控分频模块中对Clk输入信号的分频比由11位预置数tone[10..0]决定。spkout的输出频率将决定每一个音符的音调,这样,分频计数器的预置tone[10..0]与spkout的输出频率就有了对应关系。2.5.44X4矩阵式键盘Key_encoder模块仿真(1)波形仿真:将所编写的4X4矩阵式键盘Key_encoder模块的程序设为工程,进行仿真,仿真结果如图2-14所示。23 毕业论文音乐演奏系统图2-144X4矩阵式键盘Key_encoder模块仿真(2)模块功能分析与调试4X4矩阵式键盘实现按下一个键对应输出一个音,k_code中放的是对应音阶索引值,例如xy输入为ED即化为二进制为11101101,输出为0001;输入为77即化为二进制为01110111,输出为1111。仿真结果完全正确。2.5.54位数据宽度的二选一多路选择器Mux21c模块仿真(1)波形仿真:将所编写的4位数据宽度的二选一多路选择器Mux21c模块程序设为工程,进行仿真,仿真结果如图2-15图2-154位数据宽度的二选一多路选择器Mux21c模块仿真(2)模块功能分析与调试二选一多路选择器就是实现自动音乐播放和按键输入的切换,当key为低电平时,输出的是k_code,当key为高电平时,输出的是indextone。仿真结果正确。23 毕业论文音乐演奏系统设计结论本文介绍了基于FPGA的音乐演奏系统的设计,设计实现了乐曲自动播放和手动播放的自由切换。本设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,描述了其工作原理、设计思路及实现方法,实现了自动演奏以及手动演奏的功能,并在QuartusII7.1上仿真成功。对于本设计中的乐曲自动演奏部分,采用FPGA设计实现音乐演奏系统具有很强的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性。本次设计可以说基本达到了设计要求,但尚有需要改进的地方。随着乐谱的复杂程度加大,如果依然在音调发生器的程序中通过时钟计数来决定音符的输出,会加大编程的繁杂度。23 毕业论文音乐演奏系统参考文献[1]张永格,何乃味编著。《单片机C语言应用技术与实践》.[M].北京:交通大学出版社,2009-5。[2]曹昕燕,周凤臣,聂春燕编著.《EDA技术试验与课程设计》.[M].北京:清华大学出版社,2006-5。[3]徐志军,王金明,尹廷辉,徐光辉,苏勇编著.《EDA技术与VHDL设计》.[M].北京:电子工业出版社,2009-1。[4]刘欲晓,方强,黄宛宁等编著.《EDA技术与VHDL电路开发应用实践》.[M].北京:电子工业出版社,2009-4。[5]朱正伟主编.《EDA技术及应用》[M].北京:清华大学出版社,2005.10[6]潘松,黄继业编著.《EDA技术与VHDL(第2版)》[M].北京:清华大学出版社,2007-1。[7]赵明富,刘文进主编.《EDA技术基础》[M].北京:北京大学出版社,2007.6[8]柳春锋主编.《电子设计自动化(EDA)教程》[M].北京:北京理工大学出版社,2005-8。[9]潘松,黄继业编著.《EDA技术实用教程》[M].北京:科学出版社,2005。[10]赵明富主编.《EDA技术与实践》[M].北京:清华大学出版社,2005-11。[11]邹彦等编著.《EDA技术与数字系统设计》[M].北京:电子工业出版社,2007-423 毕业论文音乐演奏系统附录附录A顶层模块VHDL程序:LIBRARYieee;USEieee.std_logic_1164.all;LIBRARYwork;ENTITYspielISPORT(clk8hz:INSTD_LOGIC;key:INSTD_LOGIC;clK12mhz:INSTD_LOGIC;x1:INSTD_LOGIC_VECTOR(3DOWNTO0);y1:INSTD_LOGIC_VECTOR(3DOWNTO0);spk_out:OUTSTD_LOGIC);ENDspiel;ARCHITECTUREbdf_typeOFspielISCOMPONENTnotetabsPORT(clk:INSTD_LOGIC;toneindex:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;COMPONENTmux21cPORT(key:INSTD_LOGIC;k_code:INSTD_LOGIC_VECTOR(3DOWNTO0);toneindex:INSTD_LOGIC_VECTOR(3DOWNTO0);index:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;COMPONENTtone_tab1PORT(index:INSTD_LOGIC_VECTOR(3DOWNTO0);tone:OUTSTD_LOGIC_VECTOR(10DOWNTO0));ENDCOMPONENT;COMPONENTkey_encoderPORT(x:INSTD_LOGIC_VECTOR(3DOWNTO0);y:INSTD_LOGIC_VECTOR(3DOWNTO0);k_code:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;SIGNALSYNTHESIZED_WIRE_0:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSYNTHESIZED_WIRE_1:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSYNTHESIZED_WIRE_2:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSYNTHESIZED_WIRE_3:STD_LOGIC_VECTOR(10DOWNTO0);23 毕业论文音乐演奏系统BEGINb2v_inst:notetabsPORTMAP(clk=>clk8hz,toneindex=>SYNTHESIZED_WIRE_1);b2v_inst4:mux21cPORTMAP(key=>key,k_code=>SYNTHESIZED_WIRE_0,toneindex=>SYNTHESIZED_WIRE_1,index=>SYNTHESIZED_WIRE_2);b2v_inst5:tone_tab1PORTMAP(index=>SYNTHESIZED_WIRE_2,tone=>SYNTHESIZED_WIRE_3);b2v_inst6:speakeraPORTMAP(clk=>clK12mhz,tone=>SYNTHESIZED_WIRE_3,spks=>spk_out);b2v_inst7:key_encoderPORTMAP(x=>x1,y=>y1,k_code=>SYNTHESIZED_WIRE_0);ENDbdf_type;23 毕业论文音乐演奏系统附录B4X4矩阵式键盘Key_encoderVHDL程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYkey_encoderISPORT(x,y:INSTD_LOGIC_VECTOR(3DOWNTO0);k_code:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREoneOFkey_encoderISBEGINPROCESS(x,y)VARIABLExy:STD_LOGIC_VECTOR(7DOWNTO0);BEGINXY:=(x&y);CASExyISWHEN"11101110"=>k_code<="0000";WHEN"11101101"=>k_code<="0001";WHEN"11101011"=>k_code<="0010";WHEN"11100111"=>k_code<="0011";WHEN"11011110"=>k_code<="0100";WHEN"11011101"=>k_code<="0101";WHEN"11011011"=>k_code<="0110";WHEN"11010111"=>k_code<="0111";WHEN"10111110"=>k_code<="1000";WHEN"10111101"=>k_code<="1001";WHEN"10111011"=>k_code<="1010";WHEN"10110111"=>k_code<="1011";WHEN"01111110"=>k_code<="1100";WHEN"01111101"=>k_code<="1101";WHEN"01111011"=>k_code<="1110";WHEN"01110111"=>k_code<="1111";WHENOTHERS=>k_code<="0000";ENDCASE;ENDPROCESS;ENDone;23 毕业论文音乐演奏系统附录C自动乐曲播放模块模块程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYnotetabsISPORT(clk:INSTD_LOGIC;toneindex:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREtwoOFnotetabsISCOMPONENTmusicPORT(address:INSTD_LOGIC_VECTOR(8DOWNTO0);inclock:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;SIGNALcounter:STD_LOGIC_VECTOR(8DOWNTO0);BEGINcnt8:PROCESS(clk,counter)BEGINIFcounter=256THENcounter<="000000000";ELSIF(clk"EVENTANDclk="1")THENcounter<=counter+1;ENDIF;ENDPROCESS;u1:musicPORTMAP(address=>counter,q=>toneindex,inclock=>clk);END;23 毕业论文音乐演奏系统附录D音乐谱对应分频预置数查表电路Tone_tab1VHDL程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYtone_tab1ISPORT(index:INSTD_LOGIC_VECTOR(3DOWNTO0);tone:OUTSTD_LOGIC_VECTOR(10DOWNTO0));END;ARCHITECTUREfiveOFtone_tab1ISBEGINPROCESS(index)BEGINCASEindexISWHEN"0000"=>tone<="00000000000";WHEN"0001"=>tone<="11101110111";WHEN"0010"=>tone<="11010100111";WHEN"0011"=>tone<="10111110000";WHEN"0100"=>tone<="10110011000";WHEN"0101"=>tone<="10011111100";WHEN"0110"=>tone<="10001110000";WHEN"0111"=>tone<="01111110100";WHEN"1000"=>tone<="01110111100";WHEN"1001"=>tone<="01101010011";WHEN"1010"=>tone<="01011110110";WHEN"1011"=>tone<="01011001100";WHEN"1100"=>tone<="01001111110";WHEN"1101"=>tone<="01000111000";WHEN"1110"=>tone<="00111111010";WHEN"1111"=>tone<="00111011110";WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDfive;23 毕业论文音乐演奏系统附录FSpeakera音乐符数控分频模块VHDL其程序如下:LIBRARYIEEE;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYspeakeraISPORT(clk:INSTD_LOGIC;tone:INSTD_LOGIC_VECTOR(10DOWNTO0);spks:OUTSTD_LOGIC);END;ARCHITECTUREsixOFspeakeraISSIGNALpreclk,fullspks:STD_LOGIC;BEGINdivideclk:PROCESS(clk)VARIABLEcount4:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPRECLK<="0";IFCOUNT4>11THENPRECLK<="1";COUNT4:="0000";ELSIFCLK"EVENTANDCLK="1"THENCOUNT4:=COUNT4+1;ENDIF;ENDPROCESS;GENSPKS:PROCESS(preclk,tone)VARIABLEcount11:STD_LOGIC_VECTOR(10DOWNTO0);BEGINIFPRECLK"EVENTANDPRECLK="1"THENIFCOUNT11=0THENCOUNT11:=TONE;FULLSPKS<="1";ELSECOUNT11:=COUNT11-1;FULLSPKS<="0";ENDIF;ENDIF;ENDPROCESS;DELAYSPKS:PROCESS(fullspks)VARIABLECOUNT2:STD_LOGIC;BEGINIFFULLSPKS"EVENTANDFULLSPKS="1"THENCOUNT2:=NOTCOUNT2;23 毕业论文音乐演奏系统IFCOUNT2="1"THENSPKS<="1";ELSESPKS<="0";ENDIF;ENDIF;ENDPROCESS;END;23 毕业论文音乐演奏系统附录E4位数据宽度的二选一多路选择器Mux21cVHDL程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux21cISPORT(k_code,toneindex:INSTD_LOGIC_VECTOR(3DOWNTO0);key:INSTD_LOGIC;index:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREfourOFmux21cISBEGINPROCESS(k_code,toneindex,key)BEGINIFkey="0"THENindex<=k_code;ELSEindex<=toneindex;ENDIF;ENDPROCESS;ENDfour;23 毕业论文音乐演奏系统心得体会毕业设计是针对某一理论课程的要求,对学生进行综合性实践训练的实践教学环节,可以提高学生运用课程中所学的理论知识与实践紧密结合,独立地解决实际问题的能力。通过为期两周的设计,我们应用所学EDA技术与VHDL和EDA实用技术实验及课程设计指导书顺利得完成了音乐演奏系统电路的设计。期间,我查阅里很多相关资料,更进一步学习了VHDL语言,了解了FPGA芯片的功能和应用。不仅巩固了课堂知识,而且有效的和实际结合在了一起,扩展了所学知识和见识。在设计过程中遇到不少问题,如编程能力不够,工程文件建立的错误,还有一些相关文件如仿真功能的使用不明白等问题。总体感觉就是:学得不够,知识真的很有用。同时,也感觉到书本知识与实际问题之间需要我们去探索的,不是学了书本知识就能很好的解决实际问题的,要通过不断的锻炼和学习才能更好的掌握好知识,这次课设也激发了我们对EDA技术方面的兴趣,提高了理论结合实际的意识。同时在课程设计的过程当中,得到了顾老师的巨大帮助,在此,特此感谢老师对我的悉心指导。23'