“两只老虎”EDA课程设计(详细)(共14页).doc
-
资源ID:14159522
资源大小:163.50KB
全文页数:14页
- 资源格式: DOC
下载积分:20金币
快捷下载

会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
“两只老虎”EDA课程设计(详细)(共14页).doc
精选优质文档-倾情为你奉上课 程 设 计课程设计名称: 专 业 班 级 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间: 1 设计任务及要求设计任务:乐曲自动播放器。自行选择一首自己喜爱的经典乐曲,用FPGA设计实现一个该曲目的自动演奏电路。要求:(1)根据设计题目要求编写相应程序代码(2)对编写的VHDL程序代码进行编译和仿真(3)利用实验箱完成硬件验证(4)总结设计内容,完成课程设计说明书 与利用微处理器,以纯硬件完成乐曲演奏电路的逻辑要复杂得多。本实验设计项目作为“两只老虎”乐曲演奏电路的实现,组成每个乐曲的每个音符的发音频率值及持续的时间是乐曲能连续演奏所需要的两个基本要素。 (1) 音乐硬件演奏电路基本原理 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。 (2) 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。根据分频系数,可计算数控分频器得到的初始值。初始值的计算公式如下: 由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:其中为音阶对应的频率。 表1 简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1532.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52 表2 各音阶频率对应的分频值音名分频系数初始值音名分频系数初始值音名分频系数初始值低音17644547中音138224369高音119116280低音268101381中音234054786高音212706921低音360672124中音330345157高音315176674低音457272464中音428645327高音414326759低音551023089中音525515640高音512566935低音645453646中音622735918高音611377054低音740504141中音720256166高音710137178 (3) 乐曲节奏的控制 一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。 (4) 乐谱的发生本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。(5) 选择模块 选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述。2设计原理及总体框图(1)音符的发音频率设定及实现 音符的频率可由一个数控分频器SPEAKERA获得,由其CLK端输入一个有较高频率的信号,通过SPEAKERA分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2.SPEAKERA对clk输入信号的分频比由11位预置数Tone10.0决定。SPKOUT的输出频率就有了对应关系。例如,在TONETABA模块中若取Tone10.0=1036,将对应法音符为“3”音的信号频率。(2)音符的持续时间 音符的持续时间需根据乐曲的速度及每个一怒的节拍数来确定,图中模块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKER输入口停留的时间即为次音符的节拍值。 模块TONETABA是乐曲简谱码对应的分频预置数查表电路,其中设置“两只老虎”乐曲全部音符所对应的分频预置数,共11个,每一音符的停留时间由音乐节拍和音调发生器模块NOTETABS的clk输入频率决定,这11个值的输出由对应于TONETABA中Index3.0的值ToneIndex3.0的输出值与持续时间由模块NOTETABS决定。在NOTETABS中设置了一个8位二进制计数器(计数最大值为138),这个计数器的技术频率选为4Hz,即每一个计数值停留时间为0.25S,恰为当全音符设为1s时,四四拍的4分音符持续时间。例如,NOTETABS在以下的VHDL逻辑描述中,“两只老虎”乐曲的第一个音符为“5”,此音在逻辑中停留了1个时钟节拍,即0.25S时间,相应地,所对应的“”音符分频预置值为在SPEAKERA的输入端开始连续自然地演奏起来了。设计的总体框图如下:3 程序设计VHDL程序如下:(1) SONGER.VHD是设计电路的顶层设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Songer IS PORT(CLK12MHZ:IN STD_LOGIC; CLK8HZ:IN STD_LOGIC; CODE1:OUT INTEGER RANGE 0 TO 15; HIGH1:OUT STD_LOGIC; SPKOUT:OUT STD_LOGIC);END;ARCHITECTURE one OF Songer IS COMPONENT NoteTabs PORT(clk:IN STD_LOGIC; ToneIndex:OUT INTEGER RANGE 0 TO 15); END COMPONENT; COMPONENT ToneTaba PORT(Index:IN INTEGER RANGE 0 TO 15; CODE:OUT INTEGER RANGE 0 TO 15; HIGH:OUT STD_LOGIC; Tone:OUT INTEGER RANGE 0 TO 16#7FF#); END COMPONENT; COMPONENT Speakera PORT(clk:IN STD_LOGIC; Tone:IN INTEGER RANGE 0 TO 16#7FF#; SpkS:OUT STD_LOGIC); END COMPONENT; SIGNAL Tone:INTEGER RANGE 0 TO 16#7FF#; SIGNAL ToneIndex:INTEGER RANGE 0 TO 15;BEGINu1:NoteTabs PORT MAP(clk=>clk8HZ,ToneIndex=>ToneIndex);u2:ToneTaba PORT MAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);u3:Speakera PORT MAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);END;(2) TONETABA.VHD是乐曲简谱码对应的分频预置数查表电路。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ToneTaba IS PORT(Index:IN INTEGER RANGE 0 TO 15; CODE:OUT INTEGER RANGE 0 TO 15; HIGH:OUT STD_LOGIC; Tone:OUT INTEGER RANGE 0 TO 16#7FF#);END;ARCHITECTURE one OF ToneTaba ISBEGIN Search:PROCESS(Index) BEGIN CASE Index IS WHEN 0 =>Tone<=2047;CODE<=0;HIGH<='0' WHEN 1 =>Tone<=773;CODE<=1;HIGH<='0' WHEN 2 =>Tone<=912;CODE<=2;HIGH<='0' WHEN 3 =>Tone<=1036;CODE<=3;HIGH<='0' WHEN 4 =>Tone<=1110;CODE<=4;HIGH<='0' WHEN 5 =>Tone<=1197;CODE<=5;HIGH<='0' WHEN 6 =>Tone<=1290;CODE<=6;HIGH<='0' WHEN 7 =>Tone<=1372;CODE<=1;HIGH<='1' WHEN 8 =>Tone<=1410;CODE<=2;HIGH<='1' WHEN 9 =>Tone<=1480;CODE<=3;HIGH<='1' WHEN 10 =>Tone<=1542;CODE<=4;HIGH<='1' WHEN OTHERS=>NULL; END CASE; END PROCESS;END;(3) SPEAKERA.VHD是设计电路的数控分频器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Speakera IS PORT(clk:IN STD_LOGIC; Tone:IN INTEGER RANGE 0 TO 16#7FF#; SpkS:OUT STD_LOGIC);END;ARCHITECTURE one OF Speakera IS SIGNAL PreCLK:STD_LOGIC; SIGNAL FullSpkS:STD_LOGIC; BEGIN DivideCLK:PROCESS(clk) VARIABLE Count4:INTEGER RANGE 0 TO 15; BEGIN PreCLK<='0' IF Count4 > 11 THEN PreCLK<='1'Count4:=0; ELSIF clk'EVENT AND clk='1' THEN Count4:=Count4+1; END IF; END PROCESS; GENSpkS:PROCESS(PreCLK,Tone) VARIABLE Count11:INTEGER RANGE 0 TO 16#7FF#; BEGIN IF PreCLK'EVENT 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) VARIABLE Count2:STD_LOGIC; BEGIN IF FullSpkS'EVENT AND FullSPKS='1'THEN Count2:=NOT Count2; IF Count2 ='1'THEN SpkS<='1' ELSE SpkS<='0' END IF; END IF; END PROCESS;END; (4) NOTETABS模块决定音乐的输出值与持续时间: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY NoteTabs IS PORT(clk:IN STD_LOGIC; ToneIndex:OUT INTEGER RANGE 0 TO 15);END;ARCHITECTURE one OF NoteTabs IS SIGNAL Counter:INTEGER RANGE 0 TO 35;BEGIN CNT8:PROCESS(clk) BEGIN IF Counter=35 THEN Counter<=0; ELSIF (clk'EVENT AND clk='1')THEN Counter<=Counter+1; END IF; END PROCESS; Search:PROCESS(Counter) BEGINCASE Counter IS WHEN 00 =>ToneIndex<=1; WHEN 01 =>ToneIndex<=2; WHEN 02 =>ToneIndex<=3; WHEN 03 =>ToneIndex<=1; WHEN 04 =>ToneIndex<=1; WHEN 05 =>ToneIndex<=2; WHEN 06 =>ToneIndex<=3; WHEN 07 =>ToneIndex<=1; WHEN 08 =>ToneIndex<=3; WHEN 09 =>ToneIndex<=4; WHEN 10 =>ToneIndex<=5; WHEN 11 =>ToneIndex<=5; WHEN 12 =>ToneIndex<=3; WHEN 13 =>ToneIndex<=4; WHEN 14 =>ToneIndex<=5; WHEN 15 =>ToneIndex<=5; WHEN 16 =>ToneIndex<=5; WHEN 17 =>ToneIndex<=6; WHEN 18 =>ToneIndex<=5; WHEN 19 =>ToneIndex<=4; WHEN 20 =>ToneIndex<=3; WHEN 21 =>ToneIndex<=1; WHEN 22 =>ToneIndex<=5; WHEN 23 =>ToneIndex<=6; WHEN 24 =>ToneIndex<=5; WHEN 25 =>ToneIndex<=4; WHEN 26 =>ToneIndex<=3; WHEN 27 =>ToneIndex<=1; WHEN 28 =>ToneIndex<=1; WHEN 29 =>ToneIndex<=5; WHEN 30 =>ToneIndex<=1; WHEN 31 =>ToneIndex<=1; WHEN 32 =>ToneIndex<=1; WHEN 33 =>ToneIndex<=5; WHEN 34 =>ToneIndex<=1; WHEN 35 =>ToneIndex<=1; WHEN OTHERS=>NULL;END CASE;END PROCESS;END;4 编译及仿真在这次EDA课程设计过程中,用的是MAX+plus II,它是一种集成的开发环境,提供了一种与结构无关的设计环境,设计者无需精通器件的内部结构,而只需要用自己熟悉的设计输入方式去表达设计内容,MAX+plus II便会自动把这些设计转换成最终结构,所需的格式。并且MAX+plus II使用方便,具有强大的编程,设计,仿真功能。顶层设计仿真波形图如下:5 硬件调试与结果分析本实验器件选用EP1K30TC144-1,利用GW48-CK实验开发系统,并使用其中结构图NO.1.引脚排列如下:Clk8hz>chip=zuhe;input pin=54Clk12mhz>chip=zuhe;input pin=126Code10>chip=zuhe;output pin=33Code10>chip=zuhe;output pin=32Code10>chip=zuhe;output pin=31Code10>chip=zuhe;output pin=30High1>chip=zuhe;output pin=81SPKOUT>chip=zuhe;output pin=99引脚锁定后再通过编译器对文件重新编译以便将引脚信息编入下载文件中。然后再将文件下载到实验箱当中,观察实验结果,试验箱开始循环播放“两只老虎”乐曲。 心得体会通过两周的课程设计,我对EDA的设计有了进一步的认识,对MAX PLUSII的设计步骤也有了更进一步的了解。 这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性通过课程设计,感觉还是学到了不少的实践动手能力。本次课程设计使我对EDA设计的能力和兴趣有很大提高,受益良多,对自己以后的发展也会起到一定的作用。专心-专注-专业