毕业论文-基于EDA乐曲硬件演奏电路_第1页
毕业论文-基于EDA乐曲硬件演奏电路_第2页
毕业论文-基于EDA乐曲硬件演奏电路_第3页
毕业论文-基于EDA乐曲硬件演奏电路_第4页
毕业论文-基于EDA乐曲硬件演奏电路_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

沈阳工程学院课程设计(论文)PAGEPAGE20目录摘要 IAbstract II第1章引言 11.1 EDA技术及发展历史 1第2章VHDL语言及其应用 22.1VHDL的应用 2第3章乐曲硬件演奏电路 43.1基本要求 43.2原理描述 43.3乐曲硬件演奏电路的层次化设计方案 53.3.1音乐节拍发生器notetabs 53.3.2音符译码电路tonetaba模块 113.3.3数控分频模块(speakera)设计 133.4乐曲硬件演奏电路的顶层设计和仿真 16结论 19参考文献 20致谢 21附录 22沈阳工程学院课程设计(论文)引言EDA技术及发展历史随着计算机业的发展,从80年代中期计算机应用进入各个领域。在这种背景下,87、88年由美国ACCEL

Technologies

Inc推出了第一个应用于电子线路设计软件包——TANGO,这个软件包开创了电子设计自动化(EDA)的先河。这个软件包现在看来比较简陋,但在当时给电子线路设计带来了设计方法和方式的革命,人们纷纷开始用计计算机来设计电子线路,直到今天在国内许多科研单位还在使用这个软件包。随着电子业的飞速发展,TANGO日益显示出其不适应时代发展需要的弱点。为了适应科学技术的发展,Protel

Technology公司以其强大的研发能力推出了Protel

For

Dos作为TANGO的升级版本,从此Protel这个名字在业内日益响亮。中国科学院EDA中心是中国科学院根据其“面向国家战略需求、面向世界科技前沿”的新时期办院方针,面对中国IC设计产业发展对技术和人才的迫切需求,于2001年11月经中国科学院批准设立的非法人事业机构。是中国科学院全院集成电路设计领域科研与教育的网络化公共平台,是中国科学院该领域对外战略合作的代表机构,面向全国开展技术服务。VHDL语言及其应用20世纪80年代美国国防部开发VeryHighSpeedIntegratedCircuit—VHSIC,用于描述集成电路的结构和功能。此后,硬件描述语言向标准化方向发展,1987年成为IEEEStandard1076,称为VHDL语言。它也是美国国防部标准(MIL-STD-454L)。1993年该标准增修为IEEE1164标准。1996年,再次加入电路合成的标准程序和规格,成为IEEE1076.3标准。VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。从宏观的角度看,VHDL的语法构成了程序的各组成部分;微观上看VHDL的语法是各种语句的运用细节。本章在VHDL的特性之后,从这两个角度简要介绍VHDL的语法基础。硬件描述语言HDL(HardwareDescriptionLanguage)诞生于1962年。HDL是用形式化的方法描述数字电路和设计数字逻辑系统的语言。主要用于描述离散电子系统的结构和行为。与SDL(SoftwareDescriptionLanguage)相似,经历了从机器码(晶体管和焊接)、汇编(网表)、到高级语言(HDL)的过程。VHDL的应用VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。VHDL是一种标准的硬件电路设计语言,目前已成为广大电路设计人员设计数字系统首选的开发工具。基于VHDL硬件电路语言的编程与实际应用技巧,VHDL硬件电路语言在微机、通信、编码、存储器以及电子电路等方面的具体设计应用,具有实际的指导意义。关于用VHDL和原理图输入进行CPLD/FPGA设计的粗略比较:在设计中,如果采用原理图输入的设计方式是比较直观的。你要设计的是什么,你就直接从库中调出来用就行了。这样比较符合人们的习惯。但是这样做需要设计人员要在两方面有较高的素质:

但是当你采用VHDL等高级语言来设计时这些问题都会得到较好的解决。由于在使用VHDL等高级语言时,有专用的工具来实现将语言描述的电路功能转换为实际的电路所以你就用不着对底层的电路很熟悉,也用不着对CPLD/FPGA的结构很熟悉(因为有专用的工具针对你的描述采用相应的器件哦)。当你要换器件时,你只需要将原来设计好的VDHL文件在新器件的设计工具中再次实现就行了。乐曲硬件演奏电路基本要求利用FPGA,设计一个乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12√2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。原理描述产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器来实现乐曲演奏要复杂的多,如果不凭借EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。乐曲演奏电路的结构框图如下:时钟电路查符查表电路音乐节拍时钟电路查符查表电路音乐节拍产生电路数控分频器基准时钟模式选择乐曲硬件演奏电路的层次化设计方案乐曲硬件演奏电路的设计主要就是由三个部分组成的,首先为了实现音乐的演奏必须得得到音阶的频率和节拍,这主要就是由音乐节拍发生器和数控分频模块完成的,完了就是译码查表电路是由音符译码电路模块产生的,乐曲硬件演奏电路可分为三个模块,音乐节拍发生器模块,音符译码电路模块,数控分频模块。音乐节拍发生器notetabs该模块将利用FPGA的片内POM存放乐曲简谱真值表,该计数器的计数频率为4HZ,即每一个数值的停留时间为0.25S,也就是每个节拍是0.25S,每个节拍的频率也是4HZ,随着NoteTabs中计数器按4HZ的时钟频率做加法计数时,乐符数据叫输向音符译码电路ToneTaba,所以所存的乐曲就自然的演奏起来。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYNoteTabsISPORT(clk:INSTD_LOGIC;ToneIndex:OUTEND;ARCHITECTUREoneOFNoteTabsISSIGNALCounter:INTEGERBEGINCNT8:PROCESS(clk)BEGINIFCounter=138THENCounter<=0;ELSIF(clk'EVENTANDclk='1')THENCounter<=Counter+1;ENDIF;ENDPROCESS;Search:PROCESS(Counter)BEGINCASECounterIS--译码器,查歌曲的乐谱表,查表结果为音调表的索引值WHEN00=>ToneIndex<=3;--简谱"3"音WHEN01=>ToneIndex<=3;--发4个时钟节拍WHEN02=>ToneIndex<=3;WHEN03=>ToneIndex<=3;WHEN04=>ToneIndex<=5;--简谱"5"音WHEN05=>ToneIndex<=5;--发3个时钟节拍WHEN06=>ToneIndex<=5;WHEN07=>ToneIndex<=6;--简谱"6"音WHEN08=>ToneIndex<=8;WHEN09=>ToneIndex<=8;WHEN10=>ToneIndex<=8;WHEN11=>ToneIndex<=9;WHEN12=>ToneIndex<=6;WHEN13=>ToneIndex<=8;WHEN14=>ToneIndex<=5;WHEN15=>ToneIndex<=5;WHEN16=>ToneIndex<=12;WHEN17=>ToneIndex<=12;WHEN18=>ToneIndex<=12;WHEN19=>ToneIndex<=15;WHEN20=>ToneIndex<=13;WHEN21=>ToneIndex<=12;WHEN22=>ToneIndex<=10;WHEN23=>ToneIndex<=12;WHEN24=>ToneIndex<=9;WHEN25=>ToneIndex<=9;WHEN26=>ToneIndex<=9;WHEN27=>ToneIndex<=9;WHEN28=>ToneIndex<=9;WHEN29=>ToneIndex<=9;WHEN30=>ToneIndex<=9;WHEN31=>ToneIndex<=0;WHEN32=>ToneIndex<=9;WHEN33=>ToneIndex<=9;WHEN34=>ToneIndex<=9;WHEN35=>ToneIndex<=10;WHEN36=>ToneIndex<=7;WHEN37=>ToneIndex<=7;WHEN38=>ToneIndex<=6;WHEN39=>ToneIndex<=6;WHEN40=>ToneIndex<=5;WHEN41=>ToneIndex<=5;WHEN42=>ToneIndex<=5;WHEN43=>ToneIndex<=6;WHEN44=>ToneIndex<=8;WHEN45=>ToneIndex<=8;WHEN46=>ToneIndex<=9;WHEN47=>ToneIndex<=9;WHEN48=>ToneIndex<=3;WHEN49=>ToneIndex<=3;WHEN50=>ToneIndex<=8;WHEN51=>ToneIndex<=8;WHEN52=>ToneIndex<=6;WHEN53=>ToneIndex<=5;WHEN54=>ToneIndex<=6;WHEN55=>ToneIndex<=8;WHEN56=>ToneIndex<=5;WHEN57=>ToneIndex<=5;WHEN58=>ToneIndex<=5;WHEN59=>ToneIndex<=5;WHEN60=>ToneIndex<=5;WHEN61=>ToneIndex<=5;WHEN62=>ToneIndex<=5;WHEN63=>ToneIndex<=5;WHEN64=>ToneIndex<=10;WHEN65=>ToneIndex<=10;WHEN66=>ToneIndex<=10;WHEN67=>ToneIndex<=12;WHEN68=>ToneIndex<=7;WHEN69=>ToneIndex<=7;WHEN70=>ToneIndex<=9;WHEN71=>ToneIndex<=9;WHEN72=>ToneIndex<=6;WHEN73=>ToneIndex<=8;WHEN74=>ToneIndex<=5;WHEN75=>ToneIndex<=5;WHEN76=>ToneIndex<=5;WHEN77=>ToneIndex<=5;WHEN78=>ToneIndex<=5;WHEN79=>ToneIndex<=5;WHEN80=>ToneIndex<=3;WHEN81=>ToneIndex<=5;WHEN82=>ToneIndex<=3;WHEN83=>ToneIndex<=3;WHEN84=>ToneIndex<=5;WHEN85=>ToneIndex<=6;WHEN86=>ToneIndex<=7;WHEN87=>ToneIndex<=9;WHEN88=>ToneIndex<=6;WHEN89=>ToneIndex<=6;WHEN90=>ToneIndex<=6;WHEN91=>ToneIndex<=6;WHEN92=>ToneIndex<=6;WHEN93=>ToneIndex<=6;WHEN94=>ToneIndex<=5;WHEN95=>ToneIndex<=6;WHEN96=>ToneIndex<=8;WHEN97=>ToneIndex<=8;WHEN98=>ToneIndex<=8;WHEN99=>ToneIndex<=9;WHEN100=>ToneIndex<=12;WHEN101=>ToneIndex<=12;WHEN102=>ToneIndex<=12;WHEN103=>ToneIndex<=10;WHEN104=>ToneIndex<=9;WHEN105=>ToneIndex<=9;WHEN106=>ToneIndex<=10;WHEN107=>ToneIndex<=9;WHEN108=>ToneIndex<=8;WHEN109=>ToneIndex<=8;WHEN110=>ToneIndex<=6;WHEN111=>ToneIndex<=5;WHEN112=>ToneIndex<=3;WHEN113=>ToneIndex<=3;WHEN114=>ToneIndex<=3;WHEN115=>ToneIndex<=3;WHEN116=>ToneIndex<=8;WHEN117=>ToneIndex<=8;WHEN118=>ToneIndex<=8;WHEN119=>ToneIndex<=8;WHEN120=>ToneIndex<=6;WHEN121=>ToneIndex<=8;WHEN122=>ToneIndex<=6;WHEN123=>ToneIndex<=5;WHEN124=>ToneIndex<=3;WHEN125=>ToneIndex<=5;WHEN126=>ToneIndex<=6;WHEN127=>ToneIndex<=8;WHEN128=>ToneIndex<=5;WHEN129=>ToneIndex<=5;WHEN130=>ToneIndex<=5;WHEN131=>ToneIndex<=5;WHEN132=>ToneIndex<=5;WHEN133=>ToneIndex<=5;WHEN134=>ToneIndex<=5;WHEN135=>ToneIndex<=5;--程序过长,部分省WHEN136=>ToneIndex<=0;--简谱休止符à输出WHEN137=>ToneIndex<=0;--频率为零WHEN138=>ToneIndex<=0;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;END;随着频率记数器预置数记数法开始记数,得到了音节的输出频率和节拍,每0.25S为一个周期,频率为4HZ,音阶随着基准频率分频得到的频率从低音依次到高音。仿真波形如下:图3.2音乐节拍发生器防真波形原器件符号:图3.3音乐发生器元件符号音符译码电路tonetaba模块音符译码电路即音调发生器实际上是一个翻译电路,根据输入为数控分频模块提供所发音符频率的初始值,而此数控分频模块入口的停留时间即为此音符的节拍数,以VHDL程序中仅设置了“梁祝”乐曲全部音符所对应的音符频率的初始值。//clk_4Hz:用于控制音长(节拍)的时钟频率;//clk_6MHz:用于产生各种音阶频率的基准频率;

//speaker:用于激励扬声器的输出信号,本例中为方波信号;

//high,med,low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYToneTabaISPORT(Index:ININTEGERCODE:OUTHIGH:OUTSTD_LOGIC;Tone:OUTINTEGEREND;ARCHITECTUREoneOFToneTabaISBEGINSearch:PROCESS(Index)BEGINCASEIndexIS--译码电路,查表方式,控制音调的预置数WHEN0=>Tone<=2047;CODE<=0;HIGH<='0';WHEN1=>Tone<=773;CODE<=1;HIGH<='0';WHEN2=>Tone<=912;CODE<=2;HIGH<='0';WHEN3=>Tone<=1036;CODE<=3;HIGH<='0';WHEN5=>Tone<=1197;CODE<=5;HIGH<='0';WHEN6=>Tone<=1290;CODE<=6;HIGH<='0';WHEN7=>Tone<=1372;CODE<=7;HIGH<='0';WHEN8=>Tone<=1410;CODE<=1;HIGH<='1';WHEN9=>Tone<=1480;CODE<=2;HIGH<='1';WHEN10=>Tone<=1542;CODE<=3;HIGH<='1';WHEN12=>Tone<=1622;CODE<=5;HIGH<='1';WHEN13=>Tone<=1668;CODE<=6;HIGH<='1';WHEN15=>Tone<=1728;CODE<=1;HIGH<='1';WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;END;在源程序中Index是音乐节拍发生器输出的音符数据;TONE是为数控分频模块提供的音符频率的初始值,为方便测试,特设置了一个音名代码显示输出CODE和音高指示信号HUGH可以通过数码管或LED来显示乐曲演奏时对应的音符和高音名。CODE输出对应该音阶简谱的显示数码1,HIGH输出为高电平,指示音阶为高,HIGH输出为低电平时,则指示音阶为中音。低音时,Tone值小,分频比大,进位信号SPKS的周期长。图3.4音符译码电路仿真波形图3.5音乐译码器元件符号数控分频模块(speakera)设计数控分频模块设计采用了预置数记数法分频,从而得到各个音阶所产生的频率输出。所谓预置数记数就是先预置个数,然后用休止符数减去预置数就是分频数,然后用基准频率除以分频数就是该音阶的频率。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。数控分频模块是11位的加法计数器构成。当计数器计满是,产生一个进位信号FULLSPKS,该信号就是用作发音的频率信号。在即使器的预置端给定不同的初始值,其输出将产生不同的频率信号,频率信号初值Tone就是前级音符译码电路的输出。低音时,Tone值小,分频比大,进位信号SPKS的周期长,扬声器发出的声音低,Tone随音乐的乐谱而变化,自动控制分频比,从而实现数控分频,发生信号的频率与Tone成正比,这就是利用数控分频器演奏音乐的原理。通过分频后其进位信号FULLSPJKS是一周期脉冲信号,为有利于驱动扬声器,在音调输出时再进行2分频,将脉冲展宽,使之占空比为50%,扬声器这样就有足够的发声功率。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSpeakeraISPORT(clk:INSTD_LOGIC;Tone:ININTEGERRANGE0TO16#7FF#;SpkS:OUTSTD_LOGIC);END;ARCHITECTUREoneOFSpeakeraISSIGNALPreCLK:STD_LOGIC;SIGNALFullSpkS:STD_LOGIC;BEGINDivideCLK:PROCESS(clk)VARIABLECount4:INTEGERBEGINPreCLK<='0';--将CLK进行16分频,PreCLK为CLK的16分频IFCount4>11THENPreCLK<='1';Count4:=0;ELSIFclk'EVENTANDclk='1'THENCount4:=Count4+1;ENDIF;ENDPROCESS;GenSpkS:PROCESS(PreCLK,Tone)VARIABLECount11:INTEGERRANGEBEGIN--11位可预置计数器IFPreCLK'EVENTANDPreCLK='1'THENIFCount11=16#7FF#THENCount11:=Tone;FullSpkS<='1';ELSECount11:=Count11+1;FullSpkS<='0';ENDIF;ENDIF;ENDPROCESS;DelaySpkS:PROCESS(FullSpkS)VARIABLECount2:STD_LOGIC;BEGIN--将输出再进行2分频,将脉冲展宽,以使扬声器有足够功率发音IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:=NOTCount2;IFCount2='1'THENSpkS<='1';ElseSpkS<='0';ENDIF;ENDIF;ENDPROCESS;END;VHDL程序的第1个进程首先对FPGA的时基脉冲Tone输入的分频系数进行分频,得到所需要的音符频率;第2个进程的作用是在音调输出时再进行2分频,将脉冲展宽,使扬声器有足够发生功率。数控分频器仿真波形如下:图3.6数控分频器仿真波形图3.7分频器元件符号乐曲硬件演奏电路的顶层设计和仿真乐曲硬件演奏电路顶层电路分为3个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetabs模块,数控分频模块(speaker)。其顶层设计的VHDL程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSongerIS--顶层设计PORT(CLK12MHZ:INSTD_LOGIC;--音调频率信号CLK8HZ:INSTD_LOGIC;--节拍频率信号CODE1:OUTHIGH1:OUTSTD_LOGIC;SPKOUT:OUTSTD_LOGIC);END;ARCHITECTUREoneOFSongerISCOMPONENTNoteTabsPORT(clk:INSTD_LOGIC;ToneIndex:OUTENDCOMPONENT;COMPONENTToneTabaPORT(Index:ININTEGERCODE:OUTHIGH:OUTSTD_LOGIC;Tone:OUTINTEGERRANGE0TO16#7FF#);--11位2进制数ENDCOMPONENT;COMPONENTSpeakeraPORT(clk:INSTD_LOGIC;Tone:ININTEGERRANGE0TO16#7FF#;--11位2进制数SpkS:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALTone:INTEGERRANGESIGNALToneIndex:INTEGERBEGIN--安装U1,U2,U3u1:NoteTabsPORTMAP(clk=>CLK8HZ,ToneIndex=>ToneIndex);u2:ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);u3:SpeakeraPORTMAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);END;顶层模块仿真波形如下:图3.8顶层模块仿真波形图3.9顶层元件符号目录摘要 IAbstract II第1章引言 11.1基本要求 11.2原理描述 1第2章乐曲硬件演奏电路的层次化设计方案 32.1音乐节拍发生器NoteTabs 32.2音符译码电路ToneTaba模块 92.3数控分频模块(Speakera)设计 112.4乐曲硬件演奏电路的顶层设计和仿真 14结论 16致谢 17参考文献 18附录 19PAGEPAGE32引言基本要求利用FPGA,设计一个乐曲硬件演奏电路。演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。乐曲的12平均率规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A(简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。任意选择歌曲进行设计。原理描述产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器来实现乐曲演奏要复杂的多,如果不凭借EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。乐曲演奏电路的结构框图如下:模式选择时钟电路数控分频器电路模式选择时钟电路数控分频器电路基准时钟音符查表电路音乐节拍发生电路手动输入图1.1乐曲演奏电路的结构框图乐曲硬件演奏电路的层次化设计方案音乐节拍发生器NoteTabs该模块将利用FPGA的片内POM存放乐曲简谱真值表,该计数器的计数频率为4HZ,即每一个数值的停留时间为0.25S,随着NoteTabs中计数器按4HZ的时钟频率做加法计数时,乐符数据叫输向音符译码电路ToneTaba,所以所存的乐曲就自然的演奏起来。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYNoteTabsISPORT(clk:INSTD_LOGIC;ToneIndex:OUTEND;ARCHITECTUREoneOFNoteTabsISSIGNALCounter:INTEGERBEGINCNT8:PROCESS(clk)BEGINIFCounter=138THENCounter<=0;ELSIF(clk'EVENTANDclk='1')THENCounter<=Counter+1;ENDIF;ENDPROCESS;Search:PROCESS(Counter)BEGINCASECounterIS--译码器,查歌曲的乐谱表,查表结果为音调表的索引值WHEN00=>ToneIndex<=3;WHEN01=>ToneIndex<=3;WHEN02=>ToneIndex<=3;WHEN03=>ToneIndex<=3;WHEN04=>ToneIndex<=5;WHEN05=>ToneIndex<=5;WHEN06=>ToneIndex<=5;WHEN07=>ToneIndex<=6;WHEN08=>ToneIndex<=8;WHEN09=>ToneIndex<=8;WHEN10=>ToneIndex<=8;WHEN11=>ToneIndex<=9;WHEN12=>ToneIndex<=6;WHEN13=>ToneIndex<=8;WHEN14=>ToneIndex<=5;WHEN15=>ToneIndex<=5;WHEN16=>ToneIndex<=12;WHEN17=>ToneIndex<=12;WHEN18=>ToneIndex<=12;WHEN19=>ToneIndex<=15;WHEN20=>ToneIndex<=13;WHEN21=>ToneIndex<=12;WHEN22=>ToneIndex<=10;WHEN23=>ToneIndex<=12;WHEN24=>ToneIndex<=9;WHEN25=>ToneIndex<=9;WHEN26=>ToneIndex<=9;WHEN27=>ToneIndex<=9;WHEN28=>ToneIndex<=9;WHEN29=>ToneIndex<=9;WHEN30=>ToneIndex<=9;WHEN31=>ToneIndex<=0;WHEN32=>ToneIndex<=9;WHEN33=>ToneIndex<=9;WHEN34=>ToneIndex<=9;WHEN35=>ToneIndex<=10;WHEN36=>ToneIndex<=7;WHEN37=>ToneIndex<=7;WHEN38=>ToneIndex<=6;WHEN39=>ToneIndex<=6WHEN40=>ToneIndex<=5;WHEN41=>ToneIndex<=5;WHEN42=>ToneIndex<=5;WHEN43=>ToneIndex<=6;WHEN44=>ToneIndex<=8;WHEN45=>ToneIndex<=8;WHEN46=>ToneIndex<=9;WHEN47=>ToneIndex<=9;WHEN48=>ToneIndex<=3;WHEN49=>ToneIndex<=3;WHEN50=>ToneIndex<=8;WHEN51=>ToneIndex<=8;WHEN52=>ToneIndex<=6;WHEN53=>ToneIndex<=5;WHEN54=>ToneIndex<=6;WHEN55=>ToneIndex<=8;WHEN56=>ToneIndex<=5;WHEN57=>ToneIndex<=5;WHEN58=>ToneIndex<=5;WHEN59=>ToneIndex<=5;WHEN60=>ToneIndex<=5;WHEN61=>ToneIndex<=5;WHEN62=>ToneIndex<=5;WHEN63=>ToneIndex<=5;WHEN64=>ToneIndex<=10;WHEN65=>ToneIndex<=10;WHEN66=>ToneIndex<=10;WHEN67=>ToneIndex<=12;WHEN68=>ToneIndex<=7;WHEN69=>ToneIndex<=7;WHEN70=>ToneIndex<=9;WHEN71=>ToneIndex<=9;WHEN72=>ToneIndex<=6;WHEN73=>ToneIndex<=8;WHEN74=>ToneIndex<=5;WHEN75=>ToneIndex<=5;WHEN76=>ToneIndex<=5;WHEN77=>ToneIndex<=5;WHEN78=>ToneIndex<=5;WHEN79=>ToneIndex<=5;WHEN80=>ToneIndex<=3;WHEN81=>ToneIndex<=5;WHEN82=>ToneIndex<=3;WHEN83=>ToneIndex<=3;WHEN84=>ToneIndex<=5;WHEN85=>ToneIndex<=6;WHEN86=>ToneIndex<=7;WHEN87=>ToneIndex<=9;WHEN88=>ToneIndex<=6;WHEN89=>ToneIndex<=6;WHEN90=>ToneIndex<=6;WHEN91=>ToneIndex<=6;WHEN92=>ToneIndex<=6;WHEN93=>ToneIndex<=6;WHEN94=>ToneIndex<=5;WHEN95=>ToneIndex<=6;WHEN96=>ToneIndex<=8;WHEN97=>ToneIndex<=8;WHEN98=>ToneIndex<=8;WHEN99=>ToneIndex<=9;WHEN100=>ToneIndex<=12;WHEN101=>ToneIndex<=12;WHEN102=>ToneIndex<=12;WHEN103=>ToneIndex<=10;WHEN104=>ToneIndex<=9;WHEN105=>ToneIndex<=9;WHEN106=>ToneIndex<=10;WHEN107=>ToneIndex<=9;WHEN108=>ToneIndex<=8;WHEN109=>ToneIndex<=8;WHEN110=>ToneIndex<=6;WHEN111=>ToneIndex<=5;WHEN112=>ToneIndex<=3;WHEN113=>ToneIndex<=3;WHEN114=>ToneIndex<=3;WHEN115=>ToneIndex<=3;WHEN116=>ToneIndex<=8;WHEN117=>ToneIndex<=8;WHEN118=>ToneIndex<=8;WHEN119=>ToneIndex<=8;WHEN120=>ToneIndex<=6;WHEN121=>ToneIndex<=8;WHEN122=>ToneIndex<=6;WHEN123=>ToneIndex<=5;WHEN124=>ToneIndex<=3;WHEN125=>ToneIndex<=5;WHEN126=>ToneIndex<=6;WHEN127=>ToneIndex<=8;WHEN128=>ToneIndex<=5;WHEN129=>ToneIndex<=5;WHEN130=>ToneIndex<=5;WHEN131=>ToneIndex<=5;WHEN132=>ToneIndex<=5;WHEN133=>ToneIndex<=5;WHEN134=>ToneIndex<=5;WHEN135=>ToneIndex<=5;WHEN136=>ToneIndex<=0;WHEN137=>ToneIndex<=0;WHEN138=>ToneIndex<=0;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;END;图2.1音乐节拍发生器元件符号图仿真图如下:图2.2音乐节拍发生器仿真输出波形音符译码电路ToneTaba模块音符译码电路即音调发生器实际上是一个查表电路,放置21个音乐简谱对应的频率表,根据该表为数控分频模块提供所发音符频率的初始值,而此数控分频模块入口的停留时间即为此音符的节拍数,以VHDL程序中仅设置了“梁祝”乐曲全部音符所对应的音符频率的初始值。其VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYToneTabaISPORT(Index:ININTEGERCODE:OUTHIGH:OUTSTD_LOGIC;Tone:OUTINTEGEREND;ARCHITECTUREoneOFToneTabaISBEGINSearch:PROCESS(Index)BEGINCASEIndexIS--译码电路,查表方式,控制音调的预置数WHEN0=>Tone<=2047;CODE<=0;HIGH<='0';WHEN1=>Tone<=773;CODE<=1;HIGH<='0';WHEN2=>Tone<=912;CODE<=2;HIGH<='0';WHEN3=>Tone<=1036;CODE<=3;HIGH<='0';WHEN5=>Tone<=1197;CODE<=5;HIGH<='0';WHEN6=>Tone<=1290;CODE<=6;HIGH<='0';WHEN7=>Tone<=1372;CODE<=7;HIGH<='0';WHEN8=>Tone<=1410;CODE<=1;HIGH<='1';WHEN9=>Tone<=1480;CODE<=2;HIGH<='1';WHEN10=>Tone<=1542;CODE<=3;HIGH<='1';WHEN12=>Tone<=1622;CODE<=5;HIGH<='1';WHEN13=>Tone<=1668;CODE<=6;HIGH<='1';WHEN15=>Tone<=1728;CODE<=1;HIGH<='1';WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;END;在源程序中Index是音乐节拍发生器输出的音符数据;TONE是为数控分频模块提供的音符频率的初始值,为方便测试,特设置了一个音名代码显示输出CODE和音高指示信号HUGH可以通过一个数码管或LED来显示乐曲演奏时对应的音符和高音名。CODE输出对应该音阶简谱的显示数码1,HIGH输出为高电平,指示音阶为高,HIGH输出为低电平时则指示音阶为中音。图2.3音符译码器元件符号图仿真图如下:图2.4音符译码器仿真输出波形2.3数控分频模块(Speakera)设计数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。数控分频模块是11位的加法计数器构成。当计数器计满是,产生一个进位信号FULLSPKS,该信号就是用作发音的频率信号。在即使器的预置端给定不同的初始值,其输出将产生不同的频率信号,频率信号初值Tone就是前级音符译码电路的输出。低音时,Ton

温馨提示

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

评论

0/150

提交评论