乐曲硬件演奏电路设计说明.doc

上传人:知****量 文档编号:58271999 上传时间:2022-11-07 格式:DOC 页数:23 大小:396.50KB
返回 下载 相关 举报
乐曲硬件演奏电路设计说明.doc_第1页
第1页 / 共23页
乐曲硬件演奏电路设计说明.doc_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《乐曲硬件演奏电路设计说明.doc》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路设计说明.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、湖南人文科技学院课程设计报告课程名称:VHDL语言与EDA课程设计设计题目: 乐曲硬件演奏电路设计 系 别: 通信与控制工程系 专 业: 电子信息工程 班 级: 09电信 学生:学 号:起止日期: 2012年06月13日 2012年06月22日指导教师:教研室主任:指导教师评语: 指导教师签名: 年 月 日成绩评定项 目权重成绩1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写与图纸规程度0.3总 成 绩教研室审核意见:教研室主任签字: 年 月 日教学系审核意见: 主任签字: 年 月 日摘 要 乐曲演奏广泛用于自动答录装置、手机铃声、集团、与智能仪器仪表设备。

2、实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普与与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,并定制LPM-ROM存储音乐数据,以“挥着翅

3、膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现四首不同乐曲的演奏效果。要想实现其他乐曲的演奏效果,只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。关键词:FPGA;EDA;VHDL;音乐目 录设计要求11、方案论证与对比11.1方案一11.2方案二21.3综合对比22、乐曲演奏电路原理22.1 乐曲演奏电路原理框图22.2 音符频率的获取32.3 乐曲节奏的控制32.4 乐谱发生器42.5 乐曲演奏电路原理图43、音乐硬件演奏

4、电路的设计实现53.1 地址发生器模块的VHDL语言设计53.2 分频预置数模块的VHDL语言设计83.3 数控分频模块的VHDL语言设计103.4 music模块123.4.1 音符数据文件133.4.2 LPM-ROM定制133.5 顶层文件144、时序仿真与下载调试过程164.1 时序仿真图164.2 引脚锁定以与下载174.3调试过程与结果17设计总结与心得体会18参考文献1919 / 23乐曲硬件演奏电路设计设计要求能够播放音乐,通过按键控制音乐的播放暂停。扩展功能:与演奏发音相对应的简谱码输出在数码管上显示,并用三个LED灯显示对应音符的高音,中音,低音。争取可以在一个ROM装上多

5、首歌曲,可手动或自动选择歌曲。1、方案论证与对比1.1方案一利用FPGA来实现乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。ROM中的音乐数据文件可由编辑好的音符填入HEX文件中,再定制LPM_ROM,将音符数据加载入ROM中。在EDA技术与VHDL课程中,我们已经学习过数

6、控分频器设计,即输入不同的预置数即可发出不同频率的声音。由此我们设计一功能模块,能够将乐曲中的音符逐一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。我们这次课程设计使用的是C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发出声音的频率一一对应。在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,以与驱动蜂鸣器发声的频率。为了能够在ROM中同时存放多首歌曲,并可以手动选择需要的歌曲,故可将ROM中分若干段存放不同曲子。当手动选择歌曲时,可根据输入的选择信号,读出ROM中对应地址的曲子,并将ROM中的曲子完整的播放出来。

7、为了显示高、中、低三种音调,可在音符到预置数的译码过程中,同时译出高、中、低三种音阶的信号,并利用三个LED灯输出信号。同时,也可利用该译码模块,将当前演奏的音符简谱表达出来。1.2方案二利用单片机来实现乐曲硬件演奏电路电路主要由AT89C52芯片,LED发光二极管,喇叭,晶振电路组成,由引脚输出定时器产生的各种固定频率的方波信号,然后由喇叭产生各种频率的声音。乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。同理,方波信号通过发光二极管可以使二极管闪烁发光,产生韵律灯的效果。由于该方案中使用部振荡电路,XTAL1

8、、XTAL2引脚外界石英晶体和微调电容构成的晶振电路。单片机音乐播放器系统总体设计由五个部分构成:晶振电路模块、复位电路模块、AT89C52单片机、发声模块以与按键模块。其中五个模块连接在AT89C52单片机上构成一个完整的系统,如图1所示。图1 单片机音乐播放器系统总体设计图1.3综合对比与利用EDA微处理器来实现乐曲演奏相比,以单片机完成乐曲演奏的逻辑要复杂一些,而且利用C语言编程的时候,必需了解单片机各端口功能与其外围电路。而用VHDL语言编程不需了解硬件,只需在锁定引脚的时候了解硬件。综合考虑,所以选择方案一。2、乐曲演奏电路原理2.1 乐曲演奏电路原理框图如图2所示: 图2 音乐演奏

9、电路原理框图该主系统由三个模块:Songer顶层文件,Spkout,分频器、译码器组成。且Songer顶层文件还包括3个子文件分别是NoteTabs,ToneTaba和Speakera,此外,我们还需建立一个名为“music”的LPM_ROM模块和与NoteTabs模块连接。2.2 音符频率的获取多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因

10、素,在尽量减少误差的前提下,选取合适的基准频率。本文中选取1MHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行12分频,才能获得1MHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2,即为500KHZ。由于最大分频系数是3795,故分频器采用12位二进制计数器才能满足要求。2.3 乐曲节奏的控制“挥着翅膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐

11、曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。2.4 乐谱发生器本次设计将乐谱中的音符数据存储在LPM-ROM中,如“挥着翅膀的女孩”乐曲中的第一个音符为“10”,此音在逻辑中停留了3个时钟节拍,即0.75秒的时间,相应地,音符“10”就要在LPM-ROM中连续的三个地址上都存储。当一个4Hz的时钟来时

12、,相应地就从LPM-ROM中输出一个音符数据。当外部的按键选择不同的乐曲播放时,乐谱发生器会从相应的LPM-ROM地址中连续输出音符。2.5 乐曲演奏电路原理图我们知道,组成乐曲的每个音符的发音频率值与其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以与通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。图2中,模块NoteTabs类似于弹琴人的手指;ToneTaba类似于琴键;Speakera类似于琴弦或音调发声器。音符的频率可以由图2中的Speakera获得,这是一个数控分频器。由其clk端输入一具有较频率(这里是12MHz)的信号,通过Speak

13、era分频后由Spkout输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。Speakera对clk输入信号的分频比由12位预置数Tone11.0决定。Spkout的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone11.0与Spkout的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度与每个音符的节拍数来确定,图2中模块ToneTaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间即为此音符的节拍值。输向ToneTab

14、a中Index4.0的值ToneIndex4.0的输出值与持续的时间由模块NoteTabs决定。在NoteTabs中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。综上得到乐曲演奏电路的原理图如图3所示。图3 乐曲演奏电路的原理图3、音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用VHDL语言来设计,并利用QuartusII软件工具来编译、测试和仿真。根据顶层原理图,共分为地址发生器模块、分频预置数模块、数控分频模块这三个模块。而music模块是存放乐曲中的音符数据,在我们的顶层原理图中并没有显示出来,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置

15、数模块提供分频预置数即给数控分频模块提供计数初值。数控分频模块根据分频预置数输出各个音符所对应的频率。3.1 地址发生器模块的VHDL语言设计地址发生器模块设置了一个9位二进制计数器(计数最大值为512)。作为音符数据LPM-ROM的地址发生器,能够恰好读出存放在LPM-ROM地址中四首乐曲的所有音符。每来一个时钟脉冲信号(Clk),9位二进制计数器就计数一次,LPM-ROM文件中的地址也就随着递增,音符数据LPM-ROM中的音符也就一个接一个连续的取出来了。当外部的按键选择不同的乐曲播放时,乐谱发生器会从相应的LPM-ROM地址中连续输出音符。这个计数器的计数频率选为4Hz,即每一计数值的停

16、留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“挥着翅膀的女孩”乐曲的第一个音符为“10”,此音在逻辑中停留了3个时钟节拍,即0.75秒时间。那么相应随着程序中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出3个音符“10”通过toneindex4.0端口输向分频预置数模块。这样四首乐曲中的音符就一个接一个的通过toneindex4.0端口输向分频预置数模块。地址发生器程序如下所示:library ieee; use ieee.std_logic_1164.all; use ieee.std

17、_logic_unsigned.all; entity notetabs is port(clk:in std_logic; rst:in std_logic;en:in std_logic; choose:in std_logic_vector (1 downto 0); toneindex:out std_logic_vector (4 downto 0); end; architecture one of notetabs is component music port(address:in std_logic_vector(8 downto 0); inclock:in std_log

18、ic;q:out std_logic_vector(4 downto 0); end component; signal counter:std_logic_vector(8 downto 0); signal tmp:std_logic_vector(8 downto 0); signal rset:std_logic; begin choosemusic:process(choose(0),choose(1),clk) -选歌信号检测进程: variable a:std_logic_vector(1 downto 0); variable b:std_logic_vector(1 down

19、to 0); variable c:std_logic_vector(1 downto 0); begin if clkevent and clk=1 then b:=a; a:=choose; c:=b-a; end if;if c=00 then rset=0; else rset=1; end if; end process; cnt8: process(clk,counter,rset,rst,choose,tmp) -ROM地址控制输出进程 begin if rst=1 then tmp=000000000; elsif rset=1 then tmp=000000000; elsi

20、f tmp=127 then tmp =000000000; elsif (clkevent and clk=1) if then en=0 then tmp counter counter counter counter countercounter,q=toneindex,inclock=clk);end;程序的功能是通过按键选取要播放的乐曲,在每到来一个时钟时,当复位键clk和暂停键en没有按下时,地址值address递增1,把选中的乐曲在LPM_ROM地址上所存储的音符连续数据输出。当复位键clk按下时,停止播放乐曲,再次按下复位键clk,重新输出当前乐曲音符;当暂停键en按下时,停止

21、播放乐曲,再次按下暂停键en,从暂停处开始输出当前乐曲的音符;3.2 分频预置数模块的VHDL语言设计分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,以“挥着翅膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐曲为例,列出了在这个乐曲中所用到的21个音符的分频预置数。表1是音符频率与其对应的预置数表1音符频率与其对应的预置数音阶频率频率设定数 预置数音阶频率频率设定数预置数低74152891 1 中35543193 1 低63702745 0 中24933082 1 低53292576 0 中14402960

22、1 低42932390 1 高716613795 0 低32772291 0 高614793758 1 低22462063 1 高513183717 0 低12201823 高411743670 0 中78303494 1 高311083645 0 中67403420 0 高29873589 1 中56593337 1 高18803528 1 中45873244 0 0音0 40951在这个模块的VHDL逻辑描述中设置了以“挥着翅膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐曲的全部音符所对应的分频预置数,共21个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)

23、的输入频率决定,在此为4Hz。这21个值的输出由程序的5位输入值index4.0确定。输向分频预置数模块的程序中index4.0的值又由地址发生器模块的输出toneindex4.0的输出值和持续时间决定。程序如下:library ieee; use ieee.std_logic_1164.all; entity tonetaba is port(index:in std_logic_vector (4 downto 0); code:out std_logic_vector(3 downto 0); high0:out std_logic_vector(2 downto 0); tone:ou

24、t std_logic_vector(11 downto 0); end; architecture one of tonetaba is begin search:process(index) begin case index is when00000=tone=1;code=0000;high0tone=1;code=0001;high0tone=1;code=0010;high0tone=0;code=0011;high0tone=1;code=0100;high0tone=0;code=0101;high0tone=0;code=0110;high0tone=1;code=0111;h

25、igh0tone=1;code=0001;high0tone=1;code=0010;high0tone=1;code=0011;high0tone=0;code=0100;high0tone=1;code=0101;high0tone=0;code=0110;high0tone=1;code=0111;high0tone=1;code=0001;high0tone=1;code=0010;high0tone=0;code=0011;high0tone=0;code=0100;high0tone=0;code=0101;high0tone=1;code=0110;high0tone=0;cod

26、e=0111;high0null; end case; end process; end; 程序的功能是输出各个音符所对应的分频预置数,当index是“00000”,tone输出为4095,即休止符的分频预置数,同时数码管code显示0,high0的值为“000”;当index是“00010”时, tone输出为2063,即低音2的分频预置数,同时数码管code显示2,high0的值为“001”;当index是“10101”时, tone输出为3795即高音7的分频预置数,同时数码管code显示7,high0的值为“100”。当index取不同的值时,tone分别输出相应音符的分频预置数和不同

27、的code值与其不同的high0值。3.3 数控分频模块的VHDL语言设计音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为4095,当计数器记满时,计数器产生一个溢出信号,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。其时钟(Clk)端输入的是12MHz的信号,从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比

28、由12位预置数tone11.0决定。Spkout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone11.0与Spkout的输出频率就有了对应关系。数控分频模块程序如下所示: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsined.all; entity speakera is port(clk:in std_logic; tone:in std_logic_vector(11 downto 0); spks:out std_logic); end; architecture one of spe

29、akera is signal preclk,fullspks:std_logic; begin divideclk:process(clk)variable count4:std_logic_vector(3 downto 0); begin preclk11 then preclk=1;count4:=0000; elsif clkevent and clk=1 then count4:=count4+1; end if; end process; genspks:process(preclk,tone)-12位预置数数控分频器 variable count11:std_logic_vec

30、tor(11 downto 0); begin if preclkevent and preclk=1 then if count11=1then 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

31、 count2=1 then spks=1; else spksmegawizard plug-in manager,选择“creat a new”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:“D:mucic.vhd”,注意后缀vhd小写。 (2)单击“next”键,选择ROM数据位宽度为5,地址线宽为9,即设置此ROM能存储9位二进制数据共512个。 (3)通过单击当前窗口中的“browse”钮,找ROM中的载文件路径和文件名:“D:alteraQuartusIImusic.mif”。 (4)单击“next”键,选择允许在线编程,地址线宽为9,

32、即设置此ROM能存储9位二进制数据共512个,在指定位置输入ROM中的加载文件路径和文件名:“D:alteraQuartusIImusic.mif”,注意ROM元件的inclock文件名:“D:alteraQuartusIImusic.mif”,注意ROM元件的inclock是地址锁存钟,然后单击Next完成LPM_ROM的定制。3.5 顶层文件程序如下所示:library ieee; use ieee.std_logic_1164.all; entity songer is port(clk12mhz:in std_logic; rst:in std_logic; en:in std_log

33、ic; choose:in std_logic_vector (1 downto 0); Clk4hz:in std_logic; code1:out std_logic_vector(3 downto 0); high1:out std_logic_vector(2 downto 0); spkout:out std_logic); end; architecture one of songer is component notetabs port(clk:in std_logic; rst:in std_logic; en:in std_logic; choose:in std_logic

34、_vector (1 downto 0); toneindex:out std_logic_vector (4 downto 0); end component; component tonetaba port(index:in std_logic_vector (4 downto 0); code:out std_logic_vector (3 downto 0); high0:out std_logic_vector (2 downto 0); tone:out std_logic_vector(11 downto 0); end component; component speakera

35、 port (clk:in std_logic; tone:in std_logic_vector(11 downto 0);spks:out std_logic); end component; signal tone:std_logic_vector(11 downto 0); signal toneindex:std_logic_vector (4 downto 0); begin u1:notetabs port map (clk=clk8hz,toneindex=toneindex,rst=rst,choose=choose,en=en); u2:tonetaba port map

36、(index=toneindex,tone=tone,code=code1,high0=high1); u3:speakera port map (clk=clk12mhz,tone=tone,spks=spkout); end;将所编写的顶层文件程序设为当前工程,通过对程序进行编译,仿真,确定工程没有错误后经过引脚锁定就可以下载到EDA试验箱中了。通过试验箱上的蜂鸣器我们可以听到“挥着翅膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐曲。4、时序仿真与下载调试过程 关于乐曲演奏电路设计的实现关键是要实现它的时序仿真,下面就是各部分的仿真图示。4.1 时序仿真图图4 Notet

37、abas的时序仿真图 图5 Tonetaba的时序仿真 图6 Speakerea的时序仿真 图7 songer的时序仿真4.2 引脚锁定以与下载为实现所设计的功能,管脚锁定时,选用实验箱的模式5。锁定引脚如表3所示。表3锁定引脚对应表4.3调试过程与结果把程序下载到硬件上,蜂鸣器马上发出声音,演奏出第一首乐曲。当按下键2与键1进行选择时,可选择00:挥着翅膀的女孩 ,01:菊花台 10:两只老虎 11:世上只有妈妈好等四首乐曲。当按下键8时,即从当前选择乐曲重新演奏。当按下键7时,即从当前乐曲暂停处开始演凑。演奏过程中,数码管会按音符不同显示所演奏的音符简谱。同时,LED灯8、9、10也会按音

38、符显示出此音符为高音或低。设计总结与心得体会本课设介绍了基于FPGA的音乐硬件演奏电路的设计,实现了一个乐曲播放器,而且描述了其工作原理、设计思路与实现方法,并在QUARTUS II6.0上选用目标芯片仿真实现了音乐硬件演奏电路的功能。实践证明:采用FPGA设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁