基于FPGA音乐硬件演奏电路设计.docx
- 文档编号:26615794
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:23
- 大小:281.05KB
基于FPGA音乐硬件演奏电路设计.docx
《基于FPGA音乐硬件演奏电路设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA音乐硬件演奏电路设计.docx(23页珍藏版)》请在冰豆网上搜索。
基于FPGA音乐硬件演奏电路设计
设计报告
课程名称
任课教师
设计题目乐曲硬件演奏电路
班级
姓名
学号
日期
一.题目分析
1、利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,其结构框图如下图所示:
2、功能要求
利用数控分频器设计硬件乐曲电路,由键盘输入控制音响,同时可自动演奏乐曲。
演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个扬声器,该设计产生的音乐选自“梁祝”片段。
二、方案选择
与利用微处理器来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
三、细化框图
(1)音乐硬件演奏电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取750KHz的基准频率。
由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。
对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。
为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。
下表中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。
由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。
音符名
频率(Hz)
分频
系数
计数初值
音符名
频率(Hz)
分频
系数
计数
初值
休止符
375000
0
2047
中音4
796.178
468
1579
低音1
294.349
1274
773
中音5
882.353
425
1622
低音2
330.396
1135
912
中音6
989.446
379
1668
低音3
370.92
1011
1036
中音7
1136.363
330
1717
低音4
386.598
970
1077
高音1
1175.549
319
1728
低音5
394.737
950
1197
高音2
1353.790
277
1770
低音6
495.376
757
1290
高音3
1512.097
248
1799
低音7
555.56
675
1372
高音4
1609.442
233
1814
中音1
588.697
637
1410
高音5
1802.884
208
1839
中音2
638.84
587
1480
高音6
2027.027
185
1862
中音3
742.574
505
1542
高音7
2272.727
165
1882
各个音符的频率及其对应的分频系数(基准频率375KHz)
(3)乐曲节奏的控制
本设计中的梁祝的乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。
(4)乐谱发生器
本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。
当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
(5)音乐硬件演奏电路总体设计流程
当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。
曲子也就流畅的播放出来了。
音乐硬件演奏电路主要是用VHDL语言来设计,并利用Quartus6.0软件工具来编译、测试和仿真,音乐硬件演奏电路设计总体设计方框图如下图所示
四、程序与仿真
4.1单元模块程序设计
根据顶层原理图,共分为music模块、地址发生器模块、分频预置数模块、十六进制模块、数控分频模块这五个模块。
music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。
数控分频模块根据分频预置数输出各个音符所对应的频率。
4.1.1音乐节拍和音调发生器模块
(1)音乐节拍和音调发生器模块RTL电路图
(2)地址发生器模块
地址发生器模块设置了一个8位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。
每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。
在地址发生器的VHDL设计中,这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。
例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。
那么相应随着程序[4]中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[3..0]端口输向分频预置数模块。
这样梁祝乐曲中的音符就一个接一个的通过toneindex[3..0]端口输向分频预置数模块。
4.2音乐谱对应分频预制数查表电路模块
(1)音乐谱分频预置数模块
(2)音乐谱对应分频预制数查表电路VHDL程序设计
音乐谱分频预置数模块是乐曲简谱码对应的分频预置数查表电路。
它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。
在这个模块的VHDL逻辑描述中设置了四四拍乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。
这13个值的输出由程序[3]的4位输入值index[3..0]确定。
输向程序[4]中index[3..0]的值又由地址发生器模块的输出toneindex[3..0]的输出值和持续时间决定。
模块的功能是输出各个音符所对应的分频预置数,即当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时,tone输出为1197即低音5的分频预置数;当index是“1111”时,tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。
4.3音乐符数控11分频电路模块
(1)音乐符数控11分频电路模块
(2)音乐符数控11分频电路模块RTL电路图
(3)音乐符数控11分频模块电路VHDL程序设计
音符的频率由数控分频模块获得,这是一个数控分频电路。
它是由一个初值可变的加法计数器构成。
该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。
在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。
它计满时所需要的计数初值可由下式来表示。
计数初值(Tone)=2047-分频系数
而分频系数又可有下式来求:
分频系数=基准频率/音符的发生频率
低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。
这就是利用数控分频器自动演奏音乐的原理。
时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。
此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。
数控分频模块中对Clk输入信号的分频比由11位预置数tone[10..0]决定。
Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone[10..0]与Fout的输出频率就有了对应关系。
例如在分频预置数模块中若取tone[10..0]=1036,将发出音符为“3”音的信号频率。
4.4乐曲演奏音符数据文件(梁祝)
WIDTH=4;--乐曲演奏数据
DEPTH=256;
Address_radix=dec;
Data_radix=dec;
CONTENTBEGIN
33335556
88896855
1212121513121012
99999990
999107766
55568899
33886568
55555555
101010127799
68555555
350335679
66666656
888912121210
991098865
33338888
68653568
55555555
00000000
05135173
50506716
65500321
11321112
32116232
16232000
52671210
03532157
00671112
32000513
51735567
16655032
11132111
23026712
其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。
形成ROM中的配置数据(初始化数据)文件的方法如下:
在QUARTUS||中编辑.mif文件。
首先在File菜单下的New菜单上选择TextEditorFile命令,进入文本编辑器,然后输入以上格式的数据文件。
文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,即4位数据的数量,文件中设置的256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENTBEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据,如46:
9,表示46为地址,9为该地址中的数据。
这样每读到一个地址,即可输出其相应的数据。
文件编辑好后,保存时取文件名为“singer.mif”,存盘的路径为“F:
\music\singer”。
4.5定制音符数据的ROM文件
1.定制的基本步骤如下:
(1)进入QUARTUS||,选菜单TOOL->megawizardplug-inmanager,选择“creatanew…”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名,注意后缀vhd小写。
(2)单击“next”键,,选择ROM数据位宽度为4,地址线宽为256,即设置此ROM能存储4位二进制数据共256个。
(3)通过“browse”钮,找到ROM中的加载文件路径和文件名:
注意ROM元件的inclock是地址锁存时钟。
(4)打开已定制的ROM文件,将它设置为工程,并确定目标器件,进行测试仿真波形,
按照定制步骤对音符数据文件进行ROM定制。
五、VHDL音乐硬件演奏电路系统仿真与调试
5.1NoteTabs音乐节拍和音调发生器模块的仿真
(1)波形仿真
将所编写的音乐节拍和音调模块NoteTabs的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。
仿真结果如下图:
5.2ToneTaba分频预置数查表模块的仿真
(1)波形仿真
将所编写的分频预置数查表模块ToneTaba的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。
仿真结果如下图:
(2)模块功能分析与调试
ToneTaba分频预置数模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到若当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时,tone输出为1197即低音5的分频预置数;当index是“1111”时,tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数,仿真波形图证明了程序实现了模块的功能。
5.3Speakera音乐符数控分频模块的仿真
(1)波形仿真
将所编写的音乐符数控分频模块Speakera的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。
仿真结果如下图:
(2)模块功能分析与调试
Speakera音乐符数控分频此模块的功能是根据初始值Tone的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。
此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。
在clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。
这里是对12MHz的信号进行16分频得到750KHz的信号。
750KHz的时钟脉冲信号是给数控分频模块提供时钟信号。
数控分频模块中对Clk输入信号的分频比由11位预置数tone[10..0]决定。
spkout的输出频率将决定每一个音符的音调,这样,分频计数器的预置tone[10..0]与Fout的输出频率就有了对应关系。
若在分频预置数模块中若取tone[10..0]=1036,将发出音符为“3”音的信号频率。
在这个仿真波形图中,Tone的值可设为6c0(即高音1的分频预置数1728),Clk的频率为750KHz,spkout输出的脉冲信号的周期为849.9291us(即1176.568Hz),接近高音1的发声频率。
由表中可知高音1的分频系数为319,即对输入时钟Clk进行319次分频就可得高音1的发声频率,因此这个程序实现了模块的功能。
六、硬件测试
引脚锁定图:
七、总结
通过以上硬件和软件的结合运行,主控制模块能够完全实现乐曲播放的功能,对于本次实验乐曲硬件演奏电路的设计,通过上网查资料,我弄清了其原理并输出了正确系统时序仿真图与系统功能仿真图。
做硬件仿真实现的时候出现了问题,通过自己的探索与老师同学的帮助指点,最终得以解决,最后能顺利完成预期的目标,实现歌曲的自然演奏。
八.心得体会
课程设计是针对某一理论课程的要求,对学生进行综合性实践训练的实践教学环节,可以提高学生运用课程中所学的理论知识与实践紧密结合,独立地解决实际问题的能力。
在这次课程设计过程中使我学到了许多以前在课本和课堂上所无法学到的知识,从而丰富了自己。
在本次课程设计的过程中,曾得到过老师与几位同学的悉心指导与帮助,才使得我们的设计非常圆满的完成,在此对他们表示我们最衷心的感谢,谢谢你们!
因学习知识的能力和时间有限,并且此次EDA课程设计对于我们来说还只是初体验,因此在本次的课程设计过程中,难免存在错误,恳请老师给以批评指正,并再次感谢曾帮助过我们的老师和几位同学。
九.参考文献
1潘松编著.EDA技术实用教程.北京:
科学教育出版社.2006
2Quartus Semiconductordatabooks.QuartusSemiconductor Corporation.2001
3杭州康芯电子有限公司GW48-PK3实验系统说明书.杭州康芯电子有限公司.2006
十、附录(源程序)
1、顶层电路VHDL程序设计
LIBRARYIEEE;--硬件演奏电路顶层设计
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSongerIS
PORT(CLK12MHZ:
INSTD_LOGIC;--音调频率信号
CLK8HZ:
INSTD_LOGIC;--节拍频率用于控制音长(节拍)的时钟频率;
SEL:
INSTD_LOGIC;--音乐选择键
RST:
INSTD_LOGIC;--复位键
CODE1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--简谱码输出显示
HIGH1:
OUTSTD_LOGIC;--高8度指示
SPKOUT:
OUTSTD_LOGIC);--声音输出
END;
ARCHITECTUREoneOFSongerIS
COMPONENTNoteTabs--元件U1例换化
PORT(clk:
INSTD_LOGIC;
SEL:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTToneTaba--元件U2例换化
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
ENDCOMPONENT;
COMPONENTSpeakera--元件U3例换化
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALTone:
STD_LOGIC_VECTOR(10DOWNTO0);
SIGNALToneIndex:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
NoteTabsPORTMAP(clk=>CLK8HZ,RST=>RST,SEL=>SEL,ToneIndex=>ToneIndex);--参数传递映射语句
u2:
ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);
u3:
SpeakeraPORTMAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);
END;
2、音乐节拍和音调发生器模块VHDL程序设计
LIBRARYIEEE;--音乐节拍和音调发生器模块
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYNoteTabsIS
PORT(clk:
INSTD_LOGIC;--音乐节拍时钟4HZ
SEL:
INSTD_LOGIC;--音乐选择键
RST:
INSTD_LOGIC;--复位键
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREoneOFNoteTabsIS
COMPONENTmusic--音符数据ROM1
PORT(address:
INSTD_LOGIC_VECTOR(7DOWNTO0);
clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
SIGNALCounter:
STD_LOGIC_VECTOR(7DOWNTO0);--8位二进制计数器
BEGIN
CNT8:
PROCESS(clk,Counter,sel,rst)
BEGIN
IF((clk'EVENTANDclk='1')and(Counter=256orrst='0'))thenCounter<="00000000";Counter<=Counter+1;
endif;
IF((clk'EVENTANDclk='1')and(sel='0'))THENCounter<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 音乐 硬件 演奏 电路设计
![提示](https://static.bdocx.com/images/bang_tan.gif)