欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    基于Verilog-HDL的乐曲演奏电路设计.doc

    • 资源ID:975709       资源大小:225KB        全文页数:17页
    • 资源格式: DOC        下载积分:20积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要20积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于Verilog-HDL的乐曲演奏电路设计.doc

    1、 1 引言随着EDA技术的进展,基于可编程的数字电子系统设计的完整方案越来越受到人们的重视。与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。如何使用EDA工具设计电子系统是人们普遍关心的问题。本课程设计主要是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,FPGA器件选择Altera的EPF10K10,在MAX + plus的EDA软件平台上,实现了乐曲演奏电路的设计。1.1 课程设计的目的本课程设计主要是基于Verilog HDL设计乐曲演奏

    2、电路,系统实现是用硬件描述语言Verilog HDL按分频控制的方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。该设计的目的在于加深对EDA技术的理解,掌握乐曲演奏电路的工作原理,了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。1.2 课程设计的要求本课程设计中由于每一个音调对应不同的频率,从而输出对应频率的声音。因此本设计要求通过控制输出到扬声器的激励信号频率的高低和持续的时间,从而使扬声器发出连续的乐曲声,且当乐曲演奏完成时,保证能自动从头开始演奏。1.3 设计平台MAX + plus是美国Altera 公司的一种EDA 软件,用于开发CPLD 和FPGA

    3、 进行数字系统的设计。2 应用工具介绍作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。2.1 EDA技术介绍EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念

    4、发展而来。EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计1。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、

    5、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。也就是说,综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。 在今天,EDA技术已经成为电子设计的普遍工具,无论设计芯片还是设计系统,没有EDA工具的支持,都是难以完成的。EDA工具已经成为设计师必不可少的武器,起着越来越重要的作用。从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用广泛、工具多样、软件功能强大。EDA技术发展迅猛,完全可以用日新月异来描

    6、述。EDA技术的应用广泛,现在已涉及到各行各业。EDA水平不断提高,设计工具趋于完美的地步。2.2 Verilog HDL语言介绍Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模2。作为一种通用化的硬件描述语言,Verilog HDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言

    7、提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行3。Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语句足以对从最复杂的芯片到完整的电子系统进行描述。Verilog HDL语言已经成为一种标准的硬件描述语言。它具有以下特点

    8、:(1)作为一种多用途的硬件描述语言,它具有很好的易学性和易用性。(2)Verilog HDL语言允许在同一个模块中进行不同抽象层次的描述。(3)大多数逻辑综合工具都支持Verilog HDL,使得它成为设计人员的一个很好的选择。(4)所有的制造厂商都提供了Verilog HDL的工艺库,用以支持仿真。(5)Verilog HDL的程序语言接口拥有强大的功能,允许用户用C语言对内部数据结构进行描述3。正是以上优点,使得Verilog HDL语言广泛流行。3 设计原理乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输

    9、出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声4。3.1 音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个8度音之间,又可分为12个半音,每两个半音的频率比为122。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音4。由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表3.11所示:表3.11 简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.6中音1523.3高音11046.5低音2293.7中音25

    10、87.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.5所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率4。本例中选取6MHz为基准频

    11、率。若无6MHz的基准频率,则可以先分频得到6MHz,或换一个新的基准频率。实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会走调。本例需要演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频比如表2所示。为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出的。由于最大的分频系数为9102,故采用14位二进制计数器分频可满足需要。在表2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载

    12、预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些,如表3.12所示:表3.12 各音阶频率对应的分频比及预置数音名分频比预置数音名分频比预置数低音391027281中音2511111272低音576538730中音3455211831低音668189565中音5382712556低音7607310310中音6340912974中音1573610647高音1286713516此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为2141=16383即可,此时扬声器将不会发声。3.2 音长的控制音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。本例演奏的梁祝片段,最短的

    13、音符为4分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生4分音符的时长4。如图3.2所示是乐曲演奏电路的原理框图,其中,乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。图3.2 乐曲演奏电路原理图音名显示电路用来显示乐曲演奏时对应的音符。可以用3个数码管,分别显示

    14、高、中、低音的音名,实现演奏的动态显示,十分直观。在本例中,high3:0、med3:0、low3:0等信号分别用于显示高音、中音、低音音符。为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。4 设计步骤本设计是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,图1是一个典型的FPGA/CPLD设计流程:图1 Verilog HDL设计流程4.1 系统分析本设计要求在MAX + plus的EDA软件平台上,运用Verilog HDL语言进行编程,实现“梁祝”乐曲片段电路的设计。程序流程图如图4.1所示:图4.1 程序流程图反馈预置计数器对基准频率6MHz

    15、进行分频,产生分频后的输出时钟信号。再经过2分频器,成为方波信号,以驱动扬声器发声。音名显示电路显示乐曲演奏时对应的音符。乐谱产生电路用来根据高音、中音和低音的值决定分频计数器的预置数的值。其中2分频器,产生驱动扬声器的方波信号 ,音名显示,根据时长计数器的值决定高音、中音和低音的值,乐谱产生电路,根据高音、中音和低音的值决定分频计数器的预置数origin的值。4.2 程序设计根据程序流程图编写程序,部分源程序如下所示:module song(clk_6MHz,clk_4Hz,speaker,high,med,low); /模块名为song(端口列表)input clk_6MHz,clk_4H

    16、z; /定义两个输入端口output speaker; /定义一个输出端口output3:0 high,med,low; reg3:0 high,med,low; /定义了3个4位寄存器reg13:0 divider,origin; /定义了2个14位寄存器reg9:0 counter; /定义了1个10位寄存器reg speaker; wire carry;assign carry=(divider=16383); /连续赋值语句always (posedge clk_6MHz) begin if(carry) divider=origin; else divider=divider+1;

    17、endalways (posedge carry) begin speaker=speaker;end /二分频产生方波信号4.3 系统仿真系统仿真是在实际系统上进行实验研究比较困难时适用的必不可少的工具,它是指通过系统模型实验去研究一个已经存在或正在设计的系统的过程,通俗地讲,就是进行模型实验。因而,系统仿真的结果决定整个课程设计任务完成的到位程度。程序输入完成后进行编译,编译完成后,可以对所进行的设计进行仿真,本课程设计的仿真平台是MAX+plus,通过对Verilog HDL源程序进行编译检错,然后创建波形文件(后缀名为.scf),加入输入输出变量,选择适用的芯片(EP1K30QC208

    18、-2)以及设定仿真结束时间,设置好输入初值进行仿真,得到仿真波形图如图4.31所示:图4.31 系统仿真图仿真图中,输出high,med,low分别显示高音,中音,低音音符,连起来可看出正是我们所要求的“梁祝”片段曲谱;而counter信号在4Hz时钟信号的每一个上升沿计数加1;origin信号表示分频计数器的预置数,与表3.12对比,检查无误。通过观察发现,所得到功能仿真波形与题目的要求一致,则可以进行器件编程下载。模块的源程序符号编辑图如图4.32所示:图4.32 模块符号编辑图4.4 结果分析完成乐曲演奏电路设计后,实现了“梁祝”乐曲片段的自动循环演奏,实际仿真和要求的结果一致,达到所需

    19、要设计的目的。结束语课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,EDA技术已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在。因此作为二十一世纪的大学生来说掌握EDA技术是十分重要的。第一次接触课程设计,从开始的一窍不通,到后来慢慢了解,经历了很长的时间。回顾起此次EDA课程设计,我感慨良多,的确,从审题到编程,从理论到实践,在这三个星期的日子里,我受益匪浅。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际

    20、相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能解决实际中的问题,从而提高自己的实际动手能力和独立思考的能力。这毕竟是第一次做课程设计,难免会遇到各种各样的问题,同时在设计的过程中我也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。但通过这次课程设计之后,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。致谢在课程设计的过程中,由于对知识的不理解,因此也遇到了很多的困难,虽然设计存在一些不足之处,但通过同学和老师的帮助,问题得到了一步一步的解决,也让我在课程设计的过程中学到了很多很多知识,让我了解到计算机编程

    21、是一个很精深的过程,只有不断的调试,不断的实践,不断的付出努力才可以得到预期的结果。此课程设计得到了很多同学和老师的支持,在此深表感谢!参考文献1 潘松,黄继业.EDA技术使用教程.北京:科学出版社,20022王伟.Verilog HDL程序设计与应用. 北京:人民邮电出版社,20053 刘秋云,王佳.Verilog HDL设计实践与指导.北京:机械工业出版社,20054 王金民. 数字系统设计与Verilog HDL(第二版). 北京:电子工业出版社,20055 李国洪,沈明山,胡辉可编程器件EDA技术与实践M北京:机械工业出版社,2004年,7月6 付家才EDA工程实践技术M北京:工业出版

    22、社,2005年,1月附录:乐曲演奏电路设计源程序清单/ 程序名称:song.v/ 程序功能:采用分频控制的方法,完成乐曲的循环演奏/ 程序作者: 吴 卓/ 最后修改日期:2009-9-25/信号定义与说明:/clk_4Hz:用于控制音长(节拍)的时钟频率;/clk_6MHz:用于产生各种音阶频率的基准频率;/speaker:用于激励扬声器的输出信号,本例中为方波信号;/high,med,low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示module song(clk_6MHz,clk_4Hz,speaker,high,med,low); /模块名为song(端口列表)input

    23、clk_6MHz,clk_4Hz; /定义两个输入端口output speaker; /定义一个输出端口output3:0 high,med,low; reg3:0 high,med,low; /定义了3个4位寄存器reg13:0 divider,origin; /定义了2个14位寄存器reg9:0 counter; /定义了1个10位寄存器reg speaker; wire carry;assign carry=(divider=16383); /连续赋值语句always (posedge clk_6MHz) begin if(carry) divider=origin; else divi

    24、der=divider+1; endalways (posedge carry) begin speaker=speaker;end /二分频产生方波信号always (posedge clk_4Hz) begin case(high,med,low) /分频比预置 b000000000011:origin=7281; /低音3 b000000000101:origin=8730; /低音5 b000000000110:origin=9565; /低音6 b000000000111:origin=10310; /低音7 b000000010000:origin=10647; /中音1 b000

    25、000100000:origin=11272; /中音2 b000000110000:origin=11831; /中音3 b000001010000:origin=12556; /中音5 b000001100000:origin=12974; /中音6 b000100000000:origin=13516; /高音1 b000000000000:origin=16383; /休止符 endcase endalways (posedge clk_4Hz) begin if(counter=151) counter=0; /计时,以实现循环演奏 else counter=counter+1; c

    26、ase(counter) /记谱 0: high,med,low=b000000000011; /低音“3” 1: high,med,low=b000000000011; /持续4个时钟节拍 2: high,med,low=b000000000011; 3: high,med,low=b000000000011; 4: high,med,low=b000000000101; /低音“5” 5: high,med,low=b000000000101; /发3个时钟节拍 6: high,med,low=b000000000101; 7: high,med,low=b000000000110; /低

    27、音“6” 8: high,med,low=b000000010000; /中音“1” 9: high,med,low=b000000010000; /发3个时钟节拍 10: high,med,low=b000000010000; 11: high,med,low=b000000100000; /中音“2” 12: high,med,low=b000000000110; /低音“6” 13: high,med,low=b000000010000; /中音“1” 14: high,med,low=b000000000101; /低音“5” 15: high,med,low=b00000000010

    28、1; 16: high,med,low=b000001010000; /中音“5” 17: high,med,low=b000001010000; /发3个时钟节拍 18: high,med,low=b000001010000; 19: high,med,low=b000100000000; /高音“1” 20: high,med,low=b000001100000; /中音“6” 21: high,med,low=b000001010000; /中音“5” 22: high,med,low=b000000110000; /中音“3” 23: high,med,low=b00000101000

    29、0; /中音“5” 24: high,med,low=b000000100000; /中音“2” 25: high,med,low=b000000100000; /持续11个时钟节拍 26: high,med,low=b000000100000; 27: high,med,low=b000000100000; 28: high,med,low=b000000100000; 29: high,med,low=b000000100000; 30: high,med,low=b000000100000; 31: high,med,low=b000000100000; 32: high,med,low

    30、=b000000100000; 33: high,med,low=b000000100000; 34: high,med,low=b000000100000; 35: high,med,low=b000000110000; /中音“3” 36: high,med,low=b000000000111; /低音“7” 37: high,med,low=b000000000111; 38: high,med,low=b000000000110; /低音“6” 39: high,med,low=b000000000110; 40: high,med,low=b000000000101; /低音“5”

    31、41: high,med,low=b000000000101; 42: high,med,low=b000000000101; 43: high,med,low=b000000000110; /低音“6” 44: high,med,low=b000000010000; /中音“1” 45: high,med,low=b000000010000; 46: high,med,low=b000000100000; /中音“2” 47: high,med,low=b000000100000; 48: high,med,low=b000000000011; /低音“3” 49: high,med,low

    32、=b000000000011; 50: high,med,low=b000000010000; /中音“1” 51: high,med,low=b000000010000; 52: high,med,low=b000000000110; /低音“6” 53: high,med,low=b000000000101; /低音“5” 54: high,med,low=b000000000110; /低音“6” 55: high,med,low=b000000010000; /中音“1” 56: high,med,low=b000000000101; /低音“5” 57: high,med,low=b

    33、000000000101; /持续8个时钟节拍 58: high,med,low=b000000000101; 59: high,med,low=b000000000101; 60: high,med,low=b000000000101; 61: high,med,low=b000000000101; 62: high,med,low=b000000000101; 63: high,med,low=b000000000101; 64: high,med,low=b000000110000; /中音“3” 65: high,med,low=b000000110000; /发3个时钟节拍 66:

    34、high,med,low=b000000110000; 67: high,med,low=b000001010000; /中音“5” 68: high,med,low=b000000000111; /低音“7” 69: high,med,low=b000000000111; 70: high,med,low=b000000100000; /中音“2” 71: high,med,low=b000000100000; 72: high,med,low=b000000000110; /低音“6” 73: high,med,low=b000000010000; /中音“1” 74: high,med,

    35、low=b000000000101; /低音“5” 75: high,med,low=b000000000101; /持续4个时钟节拍 76: high,med,low=b000000000101; 77: high,med,low=b000000000101; 78: high,med,low=b000000000000; /休止符 79: high,med,low=b000000000000; 80: high,med,low=b000000000011; /低音“3” 81: high,med,low=b000000000101; /低音“5” 82: high,med,low=b000

    36、000000101; 83: high,med,low=b000000000011; /低音“3” 84: high,med,low=b000000000101; /低音“5” 85: high,med,low=b000000000110; /低音“6” 86: high,med,low=b000000000111; /低音“7” 87: high,med,low=b000000100000; /中音“2” 88: high,med,low=b000000000110; /低音“6” 89: high,med,low=b000000000110; /持续6个时钟节拍 90: high,med,

    37、low=b000000000110; 91: high,med,low=b000000000110; 92: high,med,low=b000000000110; 93: high,med,low=b000000000110; 94: high,med,low=b000000000101; /低音“5” 95: high,med,low=b000000000110; /低音“6” 96: high,med,low=b000000010000; /中音“1” 97: high,med,low=b000000010000; /发3个时钟节拍 98: high,med,low=b000000010

    38、000; 99: high,med,low=b000000100000; /中音“2” 100: high,med,low=b000001010000; /中音“5” 101: high,med,low=b000001010000; 102: high,med,low=b000000110000; /中音“3” 103: high,med,low=b000000110000; 104: high,med,low=b000000100000; /中音“2” 105: high,med,low=b000000100000; 106: high,med,low=b000000110000; /中音“3” 107: high,med,low=b000000100000; /中音“2” 108: high,med,low=b000000010000;


    注意事项

    本文(基于Verilog-HDL的乐曲演奏电路设计.doc)为本站会员(风****)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922