Verilog_ HDL—乐曲演奏电路设计_第1页
Verilog_ HDL—乐曲演奏电路设计_第2页
Verilog_ HDL—乐曲演奏电路设计_第3页
Verilog_ HDL—乐曲演奏电路设计_第4页
Verilog_ HDL—乐曲演奏电路设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 湖北文理学院Verilog HDL乐曲演奏电路设计专业:自动化学号:2012118064姓名:一天虹影设计目的与要求1.课程设计目的:1)加深对EDA技术的理解,掌握乐曲演奏电路的工作原理2)了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。3)培养自主学习、正确分析和解决问题的能力 2.课程设计要求:1)使用Verilog HDL设计乐曲演奏电路,系统实现是用硬件描述语言Verilog HDL按分频控制的方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。2) 通过控制输出到扬声器的激励信号频率的高低和持续的时间,从而使扬声器发出连续的乐曲声,且当乐曲演奏完成时

2、,保证能自动从头开始演奏。3.该方案可以实现的功能: 1)通过蜂鸣器播放音乐; 2)通过三位动态数码管输出相应的高中低音符; 3)通过一个开关实现两首乐曲的切换; 4)在音乐播放的同时,会有led流水灯的闪烁.应用工具介绍作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。2.1 EDA技术介绍EDA是电子设计自动化(Electr

3、onic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计1。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。典型的ED

4、A工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。也就是说,综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。 在今天,EDA技术已经成为电子设计的普遍工具,无论设计芯片还是设计系统,没有EDA工具的支持,都是难以完成的。EDA工具

5、已经成为设计师必不可少的武器,起着越来越重要的作用。从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用广泛、工具多样、软件功能强大。EDA技术发展迅猛,完全可以用日新月异来描述。EDA技术的应用广泛,现在已涉及到各行各业。EDA水平不断提高,设计工具趋于完美的地步。2.2 Verilog HDL语言介绍Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模2。作为一种通用化的硬件描述语言,Verilog HDL

6、语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行3。Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学

7、习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语句足以对从最复杂的芯片到完整的电子系统进行描述。Verilog HDL语言已经成为一种标准的硬件描述语言。它具有以下特点:(1)作为一种多用途的硬件描述语言,它具有很好的易学性和易用性。(2)Verilog HDL语言允许在同一个模块中进行不同抽象层次的描述。(3)大多数逻辑综合工具都支持Verilog HDL,使得它成为设计人员的一个很好的选择。(4)所有的制造厂商都提供了Verilog HDL的工艺库,用以支持仿真。(5)Verilog HDL的程序语言接口拥有强大的功能,允许用户用C语言对内部数据结构进行描述3。正是以上优点

8、,使得Verilog HDL语言广泛流行。下面是verilog的设计流程Verilog的设计流程图基本原理乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声4。1、 音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个8度音之间,又可分为12个半音,每两个半音的频率比为122。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音

9、4。由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表3.11所示:表3.11 简谱中的音名与频率的关系音名频率/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.5所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到

10、的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率4。本例中选取6MHz为基准频率。若无6MHz的基准频率,则可以先分频得到6MHz,或换一个新的基准频率。实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会走调。本例需要演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频比如表2所示。为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表2中的分频比就是从6MHz频率二分频得到

11、的3MHz频率基础上计算得出的。由于最大的分频系数为9102,故采用14位二进制计数器分频可满足需要。在表2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些,如表3.12所示:表3.12 各音阶频率对应的分频比及预置数音名分频比预置数音名分频比预置数低音391027281中音2511111272低音576538730中音3455211831低音668189565中音5382712556低音7607310310中音6340912974中音157361064

12、7高音1286713516此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为2141=16383即可,此时扬声器将不会发声。2、 音长的控制音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。本例演奏的梁祝片段,最短的音符为4分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生4分音符的时长4。如图3.2所示是乐曲演奏电路的原理框图,其中,乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越

13、长,则该音符演奏的时间越长。每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。乐曲演奏电路的系统框图音名显示电路用来显示乐曲演奏时对应的音符。可以用3个数码管,分别显示高、中、低音的音名,实现演奏的动态显示,十分直观。在本例中,high3:0、med3:0、low3:0等信号分别用于显示高音、中音、低音音符。为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。方案实现由系统框图可以看到本方案分成8个模块。1)48MHz分频成12MHz波形分频器,源代码和顶层模块如下/48mhz分成12mhz的分频模

14、块module div_clk12mhz(clk_48mhz,clk_12mhz);input clk_48mhz;output clk_12mhz;reg clk_12mhz;reg 21:0 cnt;always (posedge clk_48mhz)if(cnt1) cnt=cnt+1; / (48mhz/12mhz=4,cnt4/2-1=1)else begin cnt=0; clk_12mhz =!clk_12mhz; endendmodule2)12MHz分频成6MHz波形分频器,源代码和顶层模块如下:/12mhz分成6mhz的分频模块,提供给song模块module div_cl

15、k6mhz(clk_12mhz,clk_6mhz);input clk_12mhz;output clk_6mhz;reg clk_6mhz;reg cnt;always (posedge clk_12mhz)clk_6mhz=!clk_6mhz; endmodule 3)12MHz分频成4Hz波形分频器,源代码和顶层模块如下:/12mhz分成4hz的分频模块,提供给song模块module div_clk4hz(clk_12mhz,clk_4hz);input clk_12mhz;output clk_4hz;reg clk_4hz;reg 21:0 cnt;always (posedge

16、clk_12mhz)if(cnt1499999) cnt=cnt+1; / (12mhz/4hz=3000000,cnt3000000/2-1=1499999)else begin cnt=0; clk_4hz =! clk_4hz; endendmodule 4)12MHz分频成1mhz波形分频器,源代码和顶层模块如下:/12mhz分成1mhz的分频模块,提供给quma模块module div_clk1mhz(clk_12mhz,clk_1mhz);input clk_12mhz;output clk_1mhz;reg clk_1mhz;reg 21:0 cnt;always (posedg

17、e clk_12mhz)if(cnt5) cnt=cnt+1; / (12mhz/1mhz=12,cnt12/2-1=5)else begin cnt=0; clk_1mhz =! clk_1mhz; endendmodule5)12MHz分频成1khz波形分频器,源代码和顶层模块如下:/12mhz分成1khz的分频模块,提供给quma模块module div_clk1khz(clk_12mhz,clk_1khz);input clk_12mhz;output clk_1khz;reg clk_1khz;reg 21:0 cnt;always (posedge clk_12mhz)if(cnt

18、5999) cnt=cnt+1; / (12mhz/1khz=12000,cnt12000/2-1=5999)else begin cnt=0; clk_1khz =! clk_1khz; endendmodule6) song模块源代码和顶层模块如下:/音乐产生模块module song(clk_6mhz,clk_4hz,speaker,high,med,low,k); /模块名为song(端口列表)input clk_6mhz,clk_4hz; input k; /定义两个输入端口output speaker; /定义一个输出端口output3:0 high,med,low; reg3:0

19、 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; endalways (posedge carry) begin speaker=speaker;end /二分频产生方波信号alway

20、s (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 b000000100000:origin=11272; /中音2 b000000110000:origin=11831; /中音3 b000001010000:origin

21、=12556; /中音5 b000001100000:origin=12974; /中音6 b000001110000:origin=13347; /中音7 b000100000000:origin=13516; /高音1 b000000000000:origin=16383; /休止符endcase endalways (posedge clk_4hz) if (k=0) begin if(counter=149) counter=0; /计时,以实现循环演奏 else counter=counter+1; case(counter) /记谱 0: high,med,low=b0000000

22、00011; /低音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; /低音6 8: high,med,low=b000000010000; /中音1 9: hig

23、h,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=b000000000101; 16: high,med,low=b000001010000; /中音5 17: high,med,low=

24、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=b000001010000; /中音5 24: high,med,low=b000000100000; /中音2 25: high,med,low=b0000

25、00100000; /持续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=b000000100000; 33: high,med,low=b000000100000; 34: high,med,low=b00000

26、0100000; 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 41: high,med,low=b000000000101; 42: high,med,low=b000000000101; 43: high,med,lo

27、w=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=b000000000011; 50: high,med,low=b000000010000; /中音1 51: high,med,low=b000000010000; 52

28、: 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=b000000000101; /持续8个时钟节拍 58: high,med,low=b000000000101; 59: high,med,low=b000000000101; 60: high,me

29、d,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: high,med,low=b000000110000; 67: high,med,low=b000001010000; /中音5 68: high,med,low=b000000000111; /低音7

30、 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,low=b000000000101; /低音5 75: high,med,low=b000000000101; /持续4个时钟节拍 76: high,med,low=b000000000101; 77: high,med,

31、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=b000000000101; 83: high,med,low=b000000000011; /低音3 84: high,med,low=b000000000101; /低音5 85: high,med,low=b000000000110;

32、/低音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,low=b000000000110; 91: high,med,low=b000000000110; 92: high,med,low=b000000000110; 93: high,med,low=b000000000110; 94: high,med,l

33、ow=b000000000101; /低音5 95: high,med,low=b000000000110; /低音6 96: high,med,low=b000000010000; /中音1 97: high,med,low=b000000010000; /发3个时钟节拍 98: high,med,low=b000000010000; 99: high,med,low=b000000100000; /中音2 100: high,med,low=b000001010000; /中音5 101: high,med,low=b000001010000; 102: high,med,low=b000

34、000110000; /中音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; /中音1 109: high,med,low=b000000010000; 110: high,med,low=b000000000110;

35、/低音6 111: high,med,low=b000000000101; /低音5 112: high,med,low=b000000000011; /低音3 113: high,med,low=b000000000011; /持续4个时钟节拍 114: high,med,low=b000000000011; 115: high,med,low=b000000000011; 116: high,med,low=b000000010000; /中音1 117: high,med,low=b000000010000; /持续4个时钟节拍 118: high,med,low=b0000000100

36、00; 119: high,med,low=b000000010000; 120: high,med,low=b000000000110; /低音6 121: high,med,low=b000000010000; /中音1 122: high,med,low=b000000000110; /低音6 123: high,med,low=b000000000101; /低音5 124: high,med,low=b000000000011; /低音3 125: high,med,low=b000000000101; /低音5 126: high,med,low=b000000000110; /低

37、音6 127: high,med,low=b000000010000; /中音1 128: high,med,low=b000000000101; /低音5 129: high,med,low=b000000000101; /持续6个时钟节拍 130: high,med,low=b000000000101; 131: high,med,low=b000000000101; 132: high,med,low=b000000000101; 133: high,med,low=b000000000101; 134: high,med,low=b000000110000; /中音3 135: hig

38、h,med,low=b000001010000; /中音5 136: high,med,low=b000000100000; /中音2 137: high,med,low=b000000110000; /中音3 138: high,med,low=b000000100000; /中音2 139: high,med,low=b000000010000; /中音1 140: high,med,low=b000000000111; /低音7 141: high,med,low=b000000000111; 142: high,med,low=b000000000110; /低音6 143: high

39、,med,low=b000000000110; 144: high,med,low=b000000000101; /低音5 145: high,med,low=b000000000101; /持续8个时钟节拍 146: high,med,low=b000000000101; 147: high,med,low=b000000000101; 148: high,med,low=b000000000101; 149: high,med,low=b000000000101; endcaseendelse if( k=1)begin if(counter=149) counter=0; /计时,以实现

40、循环演奏 else counter=counter+1; case(counter) /记谱 0: high,med,low=b000000110000; /中音3 1: high,med,low=b000000110000; /持续2个时钟节拍 2: high,med,low=b000000100000; /中音2 3: high,med,low=b000000100000; /持续2个时钟节拍 4: high,med,low=b000000110000; /中音3 5: high,med,low=b000000110000; /发10个时钟节拍 6: high,med,low=b00000

41、0110000; 7: high,med,low=b000000110000; 8: high,med,low=b000000110000; 9: high,med,low=b000000110000; 10: high,med,low=b000000110000; 11: high,med,low=b000000110000; 12: high,med,low=b000000110000; 13: high,med,low=b000000110000; 14: high,med,low=b000000100000; /中音2 15: high,med,low=b000000100000; /

42、持续2个时钟节拍 16: high,med,low=b000000110000; /中音3 17: high,med,low=b000000110000; /发2个时钟节拍 18: high,med,low=b000000100000; /中音2 19: high,med,low=b000000100000; /中音2 20: high,med,low=b000000010000; /中音1 21: high,med,low=b000000010000; 22: high,med,low=b000000010000; 23: high,med,low=b000000010000; 24: hi

43、gh,med,low=b000000010000; 25: high,med,low=b000000010000; 26: high,med,low=b000000010000; 27: high,med,low=b000000010000; 28: high,med,low=b000000010000; 29: high,med,low=b000000010000; 30: high,med,low=b000000010000; 31: high,med,low=b000000010000; 32: high,med,low=b000000000110;/低6 33: high,med,low=b000000000110; 34: high,med,low=b000000010000; /中音1 35: high,med,low=b000000010000; 36: high,med,low=b000000100000; /中2 有6个 37: high,med,low=b000000100000; 38: high,med,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论