EDA课程设计报告-音乐发生器设计_第1页
EDA课程设计报告-音乐发生器设计_第2页
EDA课程设计报告-音乐发生器设计_第3页
EDA课程设计报告-音乐发生器设计_第4页
EDA课程设计报告-音乐发生器设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

电子课程设计————音乐发生器设计学院:电子信息工程学院专业班级:通信工程101501姓名:孔翔学号:202115030109指导教师:李东红2021年12月音乐发生器设计目录一:设计任务与要求……………3二:总体框图…………………3三:选择器件…………………4四:功能模块………………51:Songer模块………………61)music模块〔程序〕…………………92〕NoteTabs模块〔程序仿真图〕……63〕ToneTaba模块〔程序仿真图〕……74〕Speakera模块〔程序仿真图〕……92:div模块〔程序仿真图〕………………123:七段译码器模块〔程序〕………………14五:总体设计电路图……………11.顶层设计VHDL描述songer模块………162.顶层文件的仿真结果…………3.管脚分配图…………4.EDA硬件验证…………六:心得体会……19七:参考资料…………………21前言乐曲演奏广泛用于自动答录装置、铃声、集团、及智能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率到达保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本文介绍在EDA开发平台上利用VHDL语言设计数控分频器电路,用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以?挥着翅膀的女孩儿??菊花台?乐曲为例,将音乐数据存储到LPM-ROM,就到达了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。一:设计任务与要求

〔1〕利用数控分频器设计硬件乐曲演奏电路。

〔2〕利用给定的音符数据定制ROM“music〞。

〔3〕设计乘法器逻辑框图,并在QuartusII上完成全部设计。

〔4〕与演奏发音相对应的简谱码输出在数码管上显示。设计方案方案一:利用纯硬件电路完成乐曲演奏。方案二:利用FPGA来实现乐曲演奏电路。分成各个模块来完成演奏乐曲的任务。方案比照与利用EDA技术来实现音乐演奏相比拟,纯硬件电路要复杂的多,而且不能在中途查看是否正确。不如选择EDA来实现音乐演奏。二:总体框图 TONETABASNOTETABS分频器译码器TONETABASNOTETABS分频器译码器SPEAKERA扬声器SPEAKERA扬声器图1-电路原理框图三:选择器件1.EP1C12Q240C8芯片及相应的连接设备2.计算机3.EDA技术试验箱四:功能模块该主系统由三个模块:Songer.vhd、div.vhd、SEG7.Vhd(7段译码器)组成。①首先定制Songer.Vhd,此模块包括3个小模块,分别是NoteTabs模块,ToneTaba模块,Speakera模块,此外,我们还需建立一个名为“music〞的LPM_ROM模块与NoteTabs模块连接。②根据给出的乘法器逻辑原理图及其模块的VHDL描述在QUARTUS2上完成设计。③完成编译,综合,仿真,管脚分配,编程下载。1.对于模块NoteTabs的功能描述:该模块的功能就是定义音符数据ROM“music〞随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据ROM中的音符数据。将从ROM中通过ToneIndex[4..0]端口输向ToneTaba模块,演奏?挥着翅膀的女孩儿??菊花台?。在该模块中设置了一个8位二进制计数器〔计数最大值为197〕,作为音符数据ROM的地址发生器。这个计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。2.对于模块ToneTaba,是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的CLK的输入频率决定,这些值由对应于ToneTaba的4位输入值Index[4..0]确定,最多有16种可选值。输向ToneTaba中Index[4..0]的值ToneIndex[4..0]的输出值与持续的时间由模块NoteTabs决定。3.模块Speakera是一个数控分频器,音符的频率可由此模块获得。由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。Speakera对CLK输入信号的分频比由预置数Tone决定。SPKOUT的输出频率将决定每一音符的音调。4.SEG7模块是一个七段译码器,作用是在硬件上显示音频的上下,用0到7分别对应空节拍、do、ri、mi、fa、suo、la、xi,高音时,LED亮,数码管显示对应数字。1.对于模块songer。?挥着翅膀的女孩儿??菊花台?乐谱如下:LPM_ROM模块定义音符数据ROM“music〞。Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。因为1拍的时间定为1秒,提供的是4Hz的时钟频率〔即1/4拍的整数倍〕,那么需将这个音符存储在相应次数的连续几个地址上。然后对音符数据进行ROM定制。随着NoteTabs中的计数器按时钟频率速度作加法计数时,音符数据将从ROM中通过ToneIndex端口输向ToneTaba模块。2〕NoteTabs模块的程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityNoteTabsis port(clk:instd_logic; ToneIndex:outstd_logic_vector(4downto0));end;architectureoneofNoteTabsis componentMUSIC PORT( address :INSTD_LOGIC_VECTOR(7DOWNTO0); clock :INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(4DOWNTO0)); ENDcomponent; signalCounter:std_logic_vector(7downto0);begin CNT8:process(clk,Counter) begin ifCounter=138thenCounter<="00000000"; elsif(clk'eventandclk='1')thenCounter<=Counter+1;endif; endprocess; u1:MUSICportMAP(address=>Counter,q=>ToneIndex,clock=>clk);end;其仿真波形如下:3)对于模块ToneTabaToneTaba是乐曲简谱码对应的分频预置数查表电路。以下为ToneTaba的模块程序:libraryieee;useieee.std_logic_1164.all;entityToneTabais port(Index:instd_logic_vector(4downto0); CODE:outstd_logic_vector(3downto0); HIGH:outstd_logic; Tone:outstd_logic_vector(10downto0));end;architectureoneofToneTabaisbegin Search:process(Index) begin caseIndexis when"00001"=>Tone<="01100000101";CODE<="0001";HIGH<='0';--773 when"00010"=>Tone<="01110010000";CODE<="0010";HIGH<='0';--912 whenothers=>NULL; endcase; endprocess; end;该模块的波形图为:4)对于Speakera模块音符的频率是由该模块获得音符频率的获得:多个不同频率的信号可通过对某个基准频率进行分频器获得。该程序选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,需对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器(D触发器)将原来的分频器的输出脉冲均衡为对称方波,这时的频率将是原来的1/2,即为375KHz。各个音符的频率及其对应的分频系数〔基准频率375KHz〕音符名频率(Hz)分频系数计数初值休止符37500002047低音1294.3491274773低音2330.3961135912低音3370.9210111036低音4386.5989701077低音5394.7379501197低音6495.3767571290低音7555.566751372中音1588.6976371410中音2638.845871480中音3742.5745051542中音4796.1784681579中音5882.3534251622中音6989.4463791668中音71136.3633301717高音11175.5493191728高音21353.7902771770高音31512.0972481799高音41609.4422331814高音51802.8842081839高音62027.0271851862高音72272.7271651882Speakera的模块程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityspeakeraisport(clk:instd_logic; tone:instd_logic_vector(10downto0); spks:outstd_logic);end;architectureoneofspeakerais signalpreclk,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);begin ifpreclk'eventandpreclk='1'then elsecount11:=count11+1;fullspks<='0';endif; endif;endprocess;delayspks:process(fullspks) variablecount2:std_logic; begin iffullspks'eventandfullspks='1'thencount2:=notcount2; ifcount2='1'thenspks<='1'; elsespks<='0';endif; endif;endprocess;end;speakera的仿真图如下:2.div模块由于我们所使用的硬件设备不能满足我们所需要的两个CLK输出的频率,所以我们使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块,div模块的程序:LIBRARYieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYdivISPORT(clk:INSTD_LOGIC;CLK12MHz,CLK8Hz:OUTstd_logic);ENDdiv;ARCHITECTUREoneofdivisbeginnana:process(clk)variablecnt:integerrange0to2;variabletmp:std_logic;beginif(clk'eventandclk='1')thenifcnt>=1thencnt:=0;tmp:=nottmp;elsecnt:=cnt+1;endif;endif;CLK12MHz<=tmp;endprocessnana;nbnb:process(clk)variablecnt:integerrange0to3125000;variabletmp:std_logic;beginif(clk'eventandclk='1')thenifcnt>=3124999thencnt:=0;tmp:=nottmp;elsecnt:=cnt+1;endif;endif;CLK8Hz<=tmp;endprocessnbnb;endone;此程序的仿真图为:〔由于CLK8Hz过于小,所以在仿真图中看不到〕3.七段数码管模块此局部程序应用我们前面用过的SEG7模块即可实现,程序为:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYSEG7ISPORT(num:INstd_logic_vector(3downto0);A:OUTstd_logic;B:OUTstd_logic;C:OUTstd_logic;D:OUTstd_logic;E:OUTstd_logic;F:OUTstd_logic;G:OUTstd_logic;DP:OUTstd_logic);ENDSEG7;ARCHITECTUREfunOFSEG7ISsignalled:std_logic_vector(6downto0);BEGINA<=led(6);B<=led(5);C<=led(4);D<=led(3);E<=led(2);F<=led(1);G<=led(0);DP<='0';led<="1111110"whennum="0000"else"0110000"whennum="0001"else"1101101"whennum="0010"else"1111001"whennum="0011"else"0110011"whennum="0100"else"1011011"whennum="0101"else"1011111"whennum="0110"else"1110000"whennum="0111"else"1111111"whennum="1000"else"1111011"whennum="1001"else"1110111"whennum="1010"else"0011111"whennum="1011"else"1001110"whennum="1100"else"0111101"whennum="1101"else"1001111"whennum="1110"else"1000111"whennum="1111";ENDfun;五:总体设计电路图1.顶层设计VHDL描述songer模块Songer模块就是顶层设计文件,所有的模块都由它调用。该Songer模块的程序为:libraryieee;useieee.std_logic_1164.all;entitySongeris port(CLK12MHZ:instd_logic; CLK8HZ:instd_logic; CODE1:outstd_logic_vector(3downto0); HIGH1:outstd_logic; SPKOUT:outstd_logic);end;architectureoneofSongeris componentNoteTabsis port(clk:instd_logic; ToneIndex:outstd_logic_vector(3downto0)); endcomponent; componentToneTaba port(Index:instd_logic_vector(3downto0); CODE:outstd_logic_vector(3downto0); HIGH:outstd_logic; Tone:outstd_logic_vector(10downto0)); endcomponent; componentSpeakera port(clk:instd_logic; Tone:instd_logic_vector(10downto0); SpkS:outstd_logic); endcomponent; signalTone:std_logic_vector(10downto0); signalToneIndex:std_logic_vector(3downto0); beginu1: NoteTabsportmap(clk=>CLK8HZ,ToneIndex=>ToneIndex);u2:ToneTabaportmap(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);u3:Speakeraportmap

温馨提示

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

评论

0/150

提交评论