Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 标准规范 > EDA课程设计——乐曲硬件演奏电路资料

EDA课程设计——乐曲硬件演奏电路资料

收藏

本作品内容为EDA课程设计——乐曲硬件演奏电路资料,格式为 doc ,大小 163843 KB ,页数为 11页

EDA课程设计——乐曲硬件演奏电路资料


('《电子技术基础Ⅲ》项目设计报告课程名称任课教师设计题目乐曲硬件演奏电路设计班级姓名学号成绩日期一、题目分析1.设计要求利用FPGA,设计一硬件乐曲硬件演奏电路,能够利用硬件电路,自动播放音乐。2.题目分析乐曲是由一连串的音符组成,而每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本因素。所以,设计音乐发生电路,需要得到相应音符的频率值,及其持续时间。如果能够得到这两个基本元素,利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。所以,获取这两个要素是本实验的关键。(1)频率值频率的高低决定了音调的高低。由于乐曲都是由一连串的音符组成,因此按照乐曲的乐谱,依次输出这些音符相对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。简谱的音名与频率的关系如下表:表1简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.6中音1523.3高音11045.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(2)时长这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。二、设计方案1.顶层实体描述音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。并且信号要持续一定的时间,即对应乐曲中的节拍。得到了音调和节拍后,就可以组成相应的乐曲了。2.模块划分采用“自顶向下”的设计方法,将音乐播放器模块主要划分为地址发生模块、数控分频模块、music模块和预置数模块。(1)地址发生模块:增地址计数器,用于产生地址数。(2)music模块:用于存储乐曲,本次设计,将《梁祝》的一段乐曲存储在rom中(3)预置数模块:给分频器提供预置数,需要计算分频预置数;(4)数控分频模块:为了提供乐曲发音所需要的发音频率,编写数控分频器程序,对一输入高频信号,进行分频,生成每个音符发音的相应频率;图1模块划分图3.模块描述Music模块分频预置数数控分频器扬声器地址发生器(1)地址发生器图2CNT138实体地址发生器,即是一个计数器,由于存储了《梁祝》138个音符,所以此计数器的最大值为138。(2)Music模块Music模块存放乐曲的音符数据。由地址发生器为music模块提供地址,每来一个时钟脉冲信号,8位二进制计数器就计数一次,ROM文件中的地址就随着递增,音符数据ROM中的音符也就一个接着一个连续的取出了。图3rom实体此计数器时钟频率为4Hz,每读一个数据,音符持续时间为0.25秒,恰为当全音符为1s,四四拍的四分音符持续的时间。若需持续较长的时间,需要在ROM中连续写入相应的音符。例如音符数据中的中音3为一拍,持续时间1秒,所以,音符数据ROM中需要连续写入四次音符3,随着4Hz时钟速率读取地址递增,音符数据ROM中的音符数据输出给分频预置数模块。将从音符数据ROM中取出的值,通过q[3..0]端口输向分频预置数模块。这样乐曲中的音符就可以连续的取出了。(2)分频预置数模块分频预置数模块是乐曲简谱码对应的分频预置数查表电路,提供了《梁祝》乐曲全部音符对应的分频预置数,即给数控分频器提供计数初值。图4F_code实体《梁祝》乐曲全部音符对应的分频预置数,共13个,此数在TN输入口停留时间即为此音符的节拍值。这13个值的输出由对应于F_code的4位输入值INX[3..0]确定,而INX[3..0]最多有16种选择。输向F_code中INX[3..0]的值在speaker中对应的输出频率值与持续时间由模块music决定。(3)数控分频模块音符的频率由数控分频模块获得,该计数器的模为2047,当计数器计满时,计数器产生溢出信号FOUT,此溢出信号就是作为发音的频率信号。由分频预置数模块,提供的计数初值,可以产生对应的信号频率。图5数控分频模块实体其时钟输入信号为1MHz,模块对CLK输入信号的分频比由11位预置数TN[10..0]决定,FOUT的输出频率将决定每一个音符的音调,这样,分频计数器的预置值与输出频率就有了对应关系。4.顶层电路图图6顶层RTL电路图图为顶层实体生成的RTL电路。外部时钟信号由两路组成,一路为4Hz,接CNT138和rom模块,即在时钟信号作用下,存储在rom中的音乐被相应的取出给F_code模块,F_code模块经音符查找表,得到相应音符的分频预置数;另一路时钟信号为1MHz,提供给speaker模块,用作分频时钟,由F_code得到的分频预置数,经数控分频后,输出相应频率的信号给蜂鸣器,便可连续播放音乐了。三、方案实现1.各模块仿真及描述(1)地址发生器由图可以看出,地址数在4Hz时钟作用下进行累加。(2)music模块设置WIDTH=4,表示数据输出宽为4;DEPTH=256,表示共有256个4位数据点。在ROM中配置数据文件,编辑.mif文件。初始化数据如下:图8music存储文件由地址发生器传入相应的地址,对应ROM中相应的音符数据,将音符连续地输出。仿真时序如下:从图中可以看出,随着地址的增加,ROM中存储的音符数据被连续地取出。(3)分频预置数模块从music模块传来相应音符的代码,对应本模块中的分频预置数。(4)数控分频模块若取出的音符为1,对应的分频预置数位773,输出FOUT的频率为,近似和表1中的值相等。2.顶层电路仿真及描述从图中可以看出,在rom中的音符,在4Hz的时钟频率下被连续地取出来,对应的数控分频模块,在1MHz的时钟频率下,输出对应音符的频率值。四、硬件测试及说明(1)引脚锁定编译仿真无误后,进行硬件测试,首先进行引脚锁定及程序下载,引脚对应如下表:(2)功能描述enable是使能键,enable按下后,开始播放一段《梁祝》音乐,若按下reset键,则复位,音乐从新播放。在播放音乐的同时,数码管会显示此时播放音乐对应的音符,若为高音,则在数码管上方红灯会亮,若为中音,则不亮。若enable键未按下,则不能播放音乐。五、结论经过时序仿真,可以看出,在外部输入的两路时钟信号作用下,音符被相应的取出,对应的频率被数控分频器输出给蜂鸣器。并进行硬件验证,可以较为完整地演奏《梁祝》乐曲。六、课程总结本次的课程设计基于FPGA的乐曲硬件演奏电路的设计,通过本次设计,我更加深入地了解了VHDL语言的应用。在EDA“自顶向下”总的设计思想的指导下,将整个设计划分为3个主体模块,主要通过数控分频和定制LPM—ROM来完成相应的功能。在这次课程设计中,主要通过查阅《EDA技术实用教程》教材,并通过在网上查阅相关的资料,逐步了解整个设计的过程,然后逐个完成划分的层次,最终完成了总体的设计。期间,也遇到了一些问题,对数控分频,由于不能理解和音符频率的对应关系,所以对后续设计有所耽误。不过后来通过查阅资料,结合相应的仿真,逐步了解了其原理。在设计中,也逐渐熟悉了VHDL语言的编程方法。七、附录1.顶层实体模块libraryieee;useieee.std_logic_1164.all;entityMusicMainisport(clk1M,clk4H:instd_logic;reset:instd_logic;enable:instd_logic;CODE:outstd_logic_vector(3downto0);H:outstd_logic;spkout:outstd_logic);end;architectureoneofMusicMainiscomponentCNT138port(clk:instd_logic;reset:instd_logic;enable:instd_logic;address:outstd_logic_vector(7downto0));endcomponent;componentromISPORT(address:INSTD_LOGIC_VECTOR(7DOWNTO0);clock:INSTD_LOGIC:=\'1\';q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDcomponent;componentF_codeport(INX:instd_logic_vector(3downto0);CODE:outstd_logic_vector(3downto0);H:outstd_logic;TONE:outstd_logic_vector(10downto0));endcomponent;componentspeakerPORT(CLK:INSTD_LOGIC;TN:INSTD_LOGIC_VECTOR(10DOWNTO0);FOUT:OUTSTD_LOGIC);endcomponent;signaladdressNum:std_logic_vector(7downto0);signaltone:std_logic_vector(3downto0);signaldivNum:std_logic_vector(10downto0);beginu1:CNT138portmap(clk=>clk4H,address=>addressNum,reset=>reset,enable=>enable);u2:romportmap(address=>addressNum,clock=>clk4H,q=>tone);u3:F_codeportmap(INX=>tone,TONE=>divNum,CODE=>CODE,H=>H);u4:speakerportmap(clk=>clk1M,TN=>divNum,FOUT=>spkout);end;2.地址发生器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityCNT138isport(clk:instd_logic;reset:instd_logic;enable:instd_logic;address:outstd_logic_vector(7downto0));end;architectureoneofCNT138issignalcounter:std_logic_vector(7downto0);beginprocess(clk)beginifenable=\'1\'thenifreset=\'1\'thencounter<="00000000";elseifcounter=138thencounter<="00000000";elsifclk\'eventandclk=\'1\'thencounter<=counter+1;endif;endif;elsifenable=\'0\'thencounter<="10001010";endif;endprocess;address<=counter;end;3.romLIBRARYieee;USEieee.std_logic_1164.all;LIBRARYaltera_mf;USEaltera_mf.all;ENTITYromISPORT(address:INSTD_LOGIC_VECTOR(7DOWNTO0);clock:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDrom;……4.分频预置数模块libraryieee;useieee.std_logic_1164.all;entityF_codeisport(INX:instd_logic_vector(3downto0);CODE:outstd_logic_vector(3downto0);H:outstd_logic;TONE:outstd_logic_vector(10downto0));endF_code;architectureoneofF_codeisbeginsearch:process(INX)begincaseINXiswhen"0000"=>TONE<="11111111111";CODE<="0000";H<=\'0\';--2047when"0001"=>TONE<="01100000101";CODE<="0001";H<=\'0\';--773when"0010"=>TONE<="01110010000";CODE<="0010";H<=\'0\';--912when"0011"=>TONE<="10000001100";CODE<="0011";H<=\'0\';--1036when"0101"=>TONE<="10010101101";CODE<="0101";H<=\'0\';--1197when"0110"=>TONE<="10100001010";CODE<="0110";H<=\'0\';--1290when"0111"=>TONE<="10101011100";CODE<="0111";H<=\'0\';--1372when"1000"=>TONE<="10110000010";CODE<="0001";H<=\'1\';--1410when"1001"=>TONE<="10111001000";CODE<="0010";H<=\'1\';--1480when"1010"=>TONE<="11000000110";CODE<="0011";H<=\'1\';--1542when"1100"=>TONE<="11001010110";CODE<="0101";H<=\'1\';--1622when"1101"=>TONE<="11010000100";CODE<="0110";H<=\'1\';--1678when"1111"=>TONE<="11011000000";CODE<="0001";H<=\'1\';--1728whenothers=>TONE<="11111111111";CODE<="0000";H<=\'0\';--2047endcase;endprocess;end;5.数控分频器模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYspeakerISPORT(CLK:INSTD_LOGIC;TN:INSTD_LOGIC_VECTOR(10DOWNTO0);FOUT:OUTSTD_LOGIC);ENDspeaker;ARCHITECTUREoneOFspeakerISSIGNALFULL:STD_LOGIC;BEGINP_REG:PROCESS(CLK)VARIABLECNT11:STD_LOGIC_VECTOR(10DOWNTO0);BEGINIFCLK\'EVENTANDCLK=\'1\'THENIFCNT11=16#7ff#THENCNT11:=TN;FULL<=\'1\';ELSECNT11:=CNT11+1;FULL<=\'0\';ENDIF;ENDIF;ENDPROCESSP_REG;P_DIV:PROCESS(FULL)VARIABLECNT2:STD_LOGIC;BEGINIFFULL\'EVENTANDFULL=\'1\'THENCNT2:=NOTCNT2;IFCNT2=\'1\'THENFOUT<=\'1\';ELSEFOUT<=\'0\';ENDIF;ENDIF;ENDPROCESSP_DIV;ENDone;',)


  • 编号:1700828325
  • 分类:标准规范
  • 软件: wps,office word
  • 大小:11页
  • 格式:docx
  • 风格:商务
  • PPT页数:163843 KB
  • 标签:

广告位推荐

相关标准规范更多>