EDA乐曲播放器设计(附源代码).doc_第1页
EDA乐曲播放器设计(附源代码).doc_第2页
EDA乐曲播放器设计(附源代码).doc_第3页
EDA乐曲播放器设计(附源代码).doc_第4页
EDA乐曲播放器设计(附源代码).doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

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

文档简介

在系统编程技术项目设计报告课程名称 在系统编程技术 任课教师 设计题目 乐曲硬件演奏电路 班 级 09电子信息工程(1)班 姓名学号 成 绩 日 期 2012年5月29日 目录1项目要求31.1功能要求31.2工作原理32设计方案42.1顶层实体描述42.2模块划分52.3模块描述52.3.1音乐谱对应分频预制数查表电路模块:TONETABA52.3.2音乐符数控11分频电路模块:SPEAKERA62.3.3音乐节拍和音调发生器模块:NOTETABS72.4顶层电路图83方案实现83.1模块仿真及实现83.1.1 TONETABA模块83.1.2 SPEAKERA模块93.1.3 NOTETABS模块93.2顶层电路仿真及实现104硬件测试及说明105结论116课程总结117附录:程序代码12乐曲硬件演奏电路1项目要求1.1功能要求这次我设计的乐曲演奏电路设参考书上的实验,并对其进行功能扩展:1、 顺序播放音乐;2、 复位初始化;3、 选择播放。1.2工作原理硬件电路的发声原理:声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。音符频率的获得:多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。下表中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。音符名频 率(Hz)分频系数计数初值音符名频 率(Hz)分频系数计数初值休止符37500002047中音4796.1784681579低音1294.3491274773中音5882.3534251622低音2330.3961135912中音6989.4463791668低音3370.9210111036中音71136.3633301717低音4386.5989701077高音11175.5493191728低音5394.7379501197高音21353.7902771770低音6495.3767571290高音31512.0972481799低音7555.566751372高音41609.4422331814中音1588.6976371410高音51802.8842081839中音2638.845871480高音62027.0271851862中音3742.5745051542高音72272.7271651882各个音符的频率及其对应的分频系数(基准频率375KHz)2设计方案2.1顶层实体描述播放器顶层实体包括4个输入、3个输出。RET复位功能信号输入端,具有复位功能:当RET输入高电平时顺序播放音乐,输入低电平时讲清零;SEL是选择信号输入端,当RET输入高电平时,根据SEL输入的高低电平播放不同的音乐。CLK8HZ输入端输入8HZ的时钟信号,CLK12MHZ输入端输入12MHZ的时钟信号;CODE13.0输出端输出与演奏发音相对应的简谱码;HIGH1是高八度音指示信号输出端,SPKOUT是声音输出端口,与扬声器相连播放音乐。顶层实体 2.2模块划分主系统由三个模块组成:TONETABA.VHD、NOTETABS.VHD和SPEAKERA.VHD。其中在NOTEBAS.VHD中要订制一个ROMMUSIC。由自顶向下设计思想设计如下图:SONGERNOTETABS.VHDTONETABA.VHDSPEAKERA.VHD2.3模块描述2.3.1音乐谱对应分频预制数查表电路模块:TONETABA音乐谱分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。在这个模块的VHDL逻辑描述中设置了四四拍乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由程序3的4位输入值index3.0确定。输向程序4中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间决定。模块的功能是输出各个音符所对应的分频预置数,即当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时, tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。2.3.2音乐符数控11分频电路模块:SPEAKERA音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值可由下式来表示。计数初值(Tone)=2047-分频系数而分频系数又可有下式来求:分频系数=基准频率/音符的发生频率低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036,将发出音符为“3”音的信号频率。2.3.3音乐节拍和音调发生器模块:NOTETABS地址发生器模块设置了一个4位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk),4位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。在地址发生器的VHDL设计中,这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序4中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex3.0端口输向分频预置数模块。 ROM的定制:WIDTH = 4 ;-乐曲演奏数据DEPTH = 256 ;Address_radix = dec;Data_radix = dec;CONTENT BEGIN 3333555688896855121212151312101299999990.END;其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。形成ROM中的配置数据(初始化数据)文件的方法如下:在QUARTUS|中编辑.mif文件。首先在File菜单下的New菜单上选择Text Editor File命令,进入文本编辑器,然后输入以上格式的数据文件。文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,即4位数据的数量,文件中设置的256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENT BEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据,如46:9,表示46为地址,9为该地址中的数据。这样每读到一个地址,即可输出其相应的数据。文件编辑好后,保存时取文件名为“MUSIC.mif”,存盘的路“F:huchuanshu0905071022MUSICMUSIC.mif”。2.4顶层电路图当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了,当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,按下SEL键时播放第二首歌,按下RST键时从头开始播放歌曲。3方案实现3.1模块仿真及实现3.1.1 TONETABA模块(1)仿真波形 本模块由VHDL程序设计(代码见附录),编译成功后选择目标芯片EP1C3T144-C8,然后进行仿真,结果如下: Index=1000; CODE=0001; Tone=10110000010; HIGH=1Index=0000; CODE=0000; Tone=1111111111; HIGH=0(2)仿真结果分析ToneTaba 分频预置数模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到若当Index是“0000”,Tone输出为11111111111,即休止符的分频预置数,;当Index是“1000”时, Tone输出为10110000010即开始高音的分频预置数;当Tndex是“1111”时, Tone输出为11011000000即高音1的分频预置数等等其它状态时,Tone分别输出相应音符的分频预置数,仿真波形图证明了程序实现了模块的功能。 3.1.2 SPEAKERA模块(1)仿真波形本模块由VHDL程序设计(代码见附录),编译成功后选择目标芯片EP1C3T144-C8,然后进行仿真,结果如下:(2)仿真结果分析Spks的输出频率决定每一音符的音调,分频计数器的预置值Tone10.0与Spks的输出频率一一对应,仿真结果正是如此。3.1.3 NOTETABS模块(1)仿真波形 本模块由VHDL程序设计(代码见附录),编译成功后选择目标芯片EP1C3T144-C8,然后进行仿真,结果如下:(2)仿真结果分析 由仿真波形可以看出当RET为低电平时,无论SEL为高电平还是低电平Tone输出都是“0000”,当RET为高电平时,根据SEL的高低电平选择播放音乐,实现了选择复位功能。3.2顶层电路仿真及实现(1)仿真波形顶层电路设计是利用原理图设计的。将前面已经做好的模块进行封装入库,然后在设计顶层原理图时一一调用,在根据程序将端口一一连接,再编译。编译成功后选择目标芯片EP1C3T144-C8,然后进行仿真,结果如下:(2)仿真结果分析 由仿真结果可以看出,但RET为低电平时,CODE1为“0000”,这说明此时不播放音乐;当RET为高电平时,CODE1开始变化,SPKOUT的输出频率也开始变动,高八度音指示HIGH1也开始变化。4硬件测试及说明(1) 引脚锁定选择实验电路模式1。先将引脚锁定,使CLK12MHZ与clock9相接;CLK8HZ与clock2相连,接受4HZ频率;发音输出SPKOUT接Speaker;与演奏发音相对应的简谱码输出显示可由CODE1在数码管5显示;HIGH1为高八度指示,可由发光管D5指示;复位键RET、选择键SEL分别接键7、键8。查表得对应引脚号如下:CLK12MHZ-PIN92CLK8HZ-PIN17RET-PIN107SEL-PIN108HIGH1-PIN77SPKOUT-PIN129CODE0-PIN39CODE1-PIN40CODE2-PIN41CODE3-PIN42 存储这些引脚信息后,再编译一次,此时原理图变为如下图所示:(2)硬件测试结果分析 程序下载后,按下键7,D15灯亮,开始从头播放音乐,再按下键8,D16灯亮,播放第二首;再按下RET,D15灯灭,停止播放。与预期结果一致,硬件实现结果正确。5结论由顶层硬件测试结果可知,我的设计已经满足了预期的实验目标。可以实现复位选择功能。但是,我的设计还不能向有些同学设计的东西基本上可以应用到实际当中去。现实生活中都快要淘汰掉的MP3功能都比我这强上一万倍,不过我想我这是基础,只有基础打好了才可以做到更好。6课程总结在系统编程技术这门课贯穿整个学期。第一节课就让我感觉老师要求很严格,但也很负责任。EDA技术像我以前学的一些课一样:要求会编程,还要熟知各种器件,可这些我都不行;特别是和这门课紧密联系的数电我更没学好(由于生病住院我就上过前三四个单元)。但是,似乎好像大多数人的数电都不行,老师也是很着急。然后老师要求我们一边学习现在的知识一边复习数电,用到什么就查什么,学什么。就这样我们开始了在系统编程技术的学习。EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对硬件描述语言HDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、逻辑简化、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。硬件描述语言HDL是EDA技术的重要组成部分,常见的HDL有下列几种:VHDL、VERILOG、SYSTEM VERILOG和SYSTEM C,我们学习的是VHDL。基于VHDL的设计有一个重要的设计思想:自顶向下设计。自顶下下设计有许多优点:1)设计人员不受芯片结构的约束,进行最适应市场需求的设计,避免再设计风险,缩短产品的上市周期;2)设计成果的再利用得以保证(IP) ;3)采用结构化开发手段,一旦系统基本功能结构确定,可以实行多人、多任务并行工作方式;4)选择实现系统的目标器件的类型、规模,硬件结构的自由度更大。在一开始老师就强调这一设计思想,但是这一切还要建立在扎实的语言基础之上。VHDL语言有很多地方和C语言相似,因此学起来并不是太难。因为我们采用自顶向下逐步求精,模块化设计,所以我们一定要搞清每个模块的功能,输入、输出端口的作用和各个端口的连接关系。前几周我们一直在学习VHDL语言,VHDL包括实体和结构体两大部分。实体描述了电路器件的外部情况及各信号端口的基本性质;结构体负责描述电路器件的内部逻辑功能或电路结构。我们还学习了数据对象、数据库和程序包、IF语句、进程语句、并行语句、仿真延时等。为后面的上机实践打下基础。开始上机的实验都是用原理图进行设计,原理图不复杂,因此实验过程也不难,主要是为了熟悉QUARTUS II软件。然后改用VHDL语言设计,逐步采用自顶向下的设计思想。最后我们采用自顶向下的方法各自设计一个器件,我选择了书本上的一个实验乐曲硬件电路设计。我选择这个实验的原因是:1)我不敢选择太难的怕做不出来,这个书上有代码和分析,适当容易些。2)这个实验需要定制ROM,而定制ROM以前没用到过,老师也只是在最后一课上提了一下。自己很想多学点,所以就选择了这个课题。开始我设计的是只能播放一首歌曲,也没有选择和复位功能。经过两个半天的努力我实现了这一目标,心里有点小喜悦,同时也不愿意满足现状,我想设计一个具有选择和复位可以播放多首歌曲的器件。但是这个努力好久也没实现了,最后看到我班的一位同学实现了可以选择可以播放多首歌曲。但是他的不能复位而且他的乐谱数据是存储在不同的ROM里,而且ROM定制在独立的工程里,我感觉这很浪费,同时也使顶层结构看上去复杂的多。于是我决定再设计一个在同一个ROM里输入两首音乐,ROM定制在NOTETABS模块中,并且能实现选择复位功能,经过一番努力终于实现了。在实验的过程中我感受颇多。平时做实验的时候大家做的都是一样的实验,不会了就忍不住问同学。现在各做各的,大家都很忙,不会的时候只好自己摸索,反复尝试。这次实验对频率的设置要求很高,平时仿真的时候要求不高,自己也就是随便设一个,仿真结果也就出来了。而这次需要输入一个8HZ的时钟信号,这下可真难住我了,平时机械式的设置参数,对真正的作用一点都不知,经过这次实验后我搞清楚了许多东西。给我留下影响最深刻的是顶层的仿真。那天晚上把一切准备工作搞定后,又经过一番努力终于把参数设置好。第一次仿真用了接近两个小时才仿真出结果,但是仿真结果不能反映所有的功能;第二天早上我又重新设置截止时间,这次仿真了5个多小时,这次终于达到了预期的仿真结果。千呼万唤始出来的结果真的让我有点骄傲与自豪。这门课伴随着这份课程设计的结束而结束,可是我们要学的东西还很多。要说我们现在的水平,估计连入门都难。因此我们还要继续学习,不断探索。在此也向不辞辛苦的老师表示感谢,感谢你教会我的知识和学习的方法,我受益匪浅。7附录:程序代码1、Speakea.vhdLIBRARY IEEE;-音乐符数控分频电路模块USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;-运算符重载ENTITY Speakera IS PORT ( clk : IN STD_LOGIC;-音调频率信号12MHZ Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);-音乐符对应分频11位 SpkS : OUT STD_LOGIC );-声音输出END;ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC;BEGIN DivideCLK : PROCESS(clk) VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN PreCLK 11 THEN PreCLK = 1; Count4 := 0000;-变量 ELSIF clkEVENT AND clk = 1 THEN Count4 := Count4 + 1; END IF; END PROCESS;GenSpkS : PROCESS(PreCLK, Tone)- 11位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN IF PreCLKEVENT AND PreCLK = 1 THEN IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS = 1; ELSE Count11 := Count11 + 1; FullSpkS = 0; END IF; END IF;END PROCESS;DelaySpkS : PROCESS(FullSpkS)-将输出再2分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC; BEGIN IF FullSpkSEVENT AND FullSpkS = 1 THEN Count2 := NOT Count2; IF Count2 = 1 THEN SpkS = 1; ELSE SpkS Tone=11111111111 ; CODE=0000; HIGH Tone=01100000101 ; CODE=0001; HIGH Tone=01110010000 ; CODE=0010; HIGH Tone=10000001100 ; CODE=0011; HIGH Tone=10010101101 ; CODE=0101; HIGH Tone=10100001010 ; CODE=0110; HIGH Tone=10101011100 ; CODE=0111; HIGH Tone=10110000010 ; CODE=0001; HIGH Tone=10111001000 ; CODE=0010; HIGH Tone=11000000110 ; CODE=0011; HIGH Tone=11001010110 ; CODE=0101; HIGH Tone=11010000100 ; CODE=0110; HIGH Tone=11011000000 ; CODE=0001; HIGH NULL;END CASE;END PROCESS;END;3、NoteTabs.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs IS PORT (ret,sel,clk : IN STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END;ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSIC PORT( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT; SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN CNT8 : PROCESS(clk, Counter) BEGINIF ret=1 THEN if(clkEVENT AND clk = 1)THEN Counter=Counter+1; IF sel=1 THENIF (Counter254) THEN Counter 138) THEN Counter = 00000001;END IF;ELSE null;END IF; end if; ELSE Counter Counter,q=toneindex,inclock=clk);end;4、定制ROM后生成的MUSIC.vhdLIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY MUSIC ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);inclock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END MUSIC;ARCHITECTURE SYN OF music ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (3 DOWNTO 0);COMPONENT altsyncramGENERIC (address_aclr_a:

温馨提示

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

评论

0/150

提交评论