FPGA设计简易音乐播放器.docx
《FPGA设计简易音乐播放器.docx》由会员分享,可在线阅读,更多相关《FPGA设计简易音乐播放器.docx(14页珍藏版)》请在冰豆网上搜索。
FPGA设计简易音乐播放器
FPGA设计简易音乐播放器
————————————————————————————————作者:
————————————————————————————————日期:
课程设计报告
题目:
FPGA简易音乐播放器设计
学院:
电子信息学院
班级:
08041301
学生(学号):
汪顺2013302011
学生(学号):
叶尔达·叶尔丁巴图2013302014
日期:
2015年12月
摘要
利用EDA软件设计一个简易硬件播放器并能播放多首音乐(最少四首),
可通过按键手动控制音乐播放。
在播放音乐的同时可实现音谱与音高的显示,并
通过10个LED小灯显示不同音调的变化。
使用硬件描述语言设计音调发生模
块,音调编码模块,乐曲存储模块,控制模块,小灯控制模块,数字显示模块,
音谱与音高输出模块等各个模块。
并下载到DE0—CV上实现。
关键词:
EDA、音乐播放器、音调编码、数字显示、DE0-CV
简易音乐播放器设计
一、课程设计目的
《模拟、数字电路课程设计》是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础实验》课程后,电气类、自控类和电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过二周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件,并能利用EDA软件设计一个电子技术综合问题,并在实验箱上成功下载,为以后进行工程实际问题的研究打下设计基础。
(1)通过课程设计使学生能熟练掌握一种EDA软件的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程.
(2)通过课程设计使学生能利用EDA软件进行至少一个电子技术综合问题的设计,设计输入可采用图形输入法或硬件描述语言输入法。
(3)通过课程设计使学生初步具有分析寻找和排除电子电路中常见故障的能力。
(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告.
二、设计任务与要求
(1)设计一个简易硬件播放器并能播放多首音乐(最少四首),可通过按键手动控制音乐播放。
(2)在播放音乐的同时可实现音谱与音高的显示.
(3)并通过10个LED小灯显示不同音调的变化。
(4)使用硬件描述语言设计音调发生模块,音调编码模块,乐曲存储模块,控制模块,小灯控制模块,数字显示模块,音谱与音高输出模块等各个模块。
三、方案设计与论证
(1)音乐产生
产生音乐的两个因素是音乐频率和音乐的持续时间(即节拍),以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多。
如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
根据设计要求,乐曲硬件演奏电路系统主要由音频发生模块(speaker)和乐曲存储模块(notetabs)组成。
音频发生模块对FPGA的基准频率进行分频(设计采用1MHZ),得到与各个音阶对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
(设计采用16HZ)
(2)音名与频率的关系
音乐的十二平均率规定:
每两个八度音(如简谱中的中音1与高音1)之间
的频率相差一倍。
在两个八度音之间,又可分为十二个半音,每两个半音为1个全音(如简谱中的低音1与低音2),每两个半音之间频率之比是
两个全音之间的频率之比是
。
另外,音名A(简谱中的低音6)的频率为440Hz,音名E到F之间,B到C之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表3-1所示
1MHz的基准频率各音阶频率及相应的分频系数如表2所示。
为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。
由于最大的分频系数为1274,故采用11位二进制计数器已能满足分频要求。
在表3—2,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为2047即可,此时扬声器将不会发声.对于不同的分频系数,加载不同的初始值即可。
(3)节拍控制原理
该演奏电路演奏的乐曲是“梁祝”等片段,其最小的节拍为1拍.将1拍的
时长定为0。
125秒,则需要再提供一个8Hz的时钟频率即可产生1拍的时长,演奏的时间控制通
(4)设计图如下:
8Hz节拍
四、单元电路设计与参数计算
4。
1音频发生模块
4。
1.1音频发生模块图
图4-1speaker模块
4.1。
2模块功能
如图4—1,en为使能引脚,当en引脚接高电平时speaker模块使能可正常
工作。
clk为时钟信号引脚,为speaker模块提供时钟信号.tone[10。
。
0]为11位的音调初始值信号并行总线,可快速的为speaker模块输送音调初始值信号,保证乐曲演奏的流畅性。
spks为电信号输出引脚,连接蜂鸣器将电信号转化为声信号。
该模块中采用1MHz的基准信号。
一个11位的递增计数器用于赋音调初始值对基准信号进行频,最后进行二分频产生对称方波。
初始值D=计数最大值N-分频系数n
4.1。
3VHDL程序
定义部分省略
ifclk'eventandclk='1’then
ifcount1=2047then
count1:
=tone;
fullspks<='1';
elsecount1:
=count1+1;
fullspks〈='0’;———-—---——-—----—-——-—-初始值转化成频率
此处省略
iffullspks’eventandfullspks=’1'then-——--————-——-—-—2分频
count2:
=notcount2;
ifen='0'thenspks<=’0';
elsifcount2='1'then
spks〈=’1’;
elsespks<=’0';
音频编码模块
4。
2.1音频编码模块图
图4-2tonetaba模块
4.2.2模块功能
如图4-2,index[3..0]为4位的音调输入并行总线,用于为bianma模块输送音符信号.tone[10。
.0]为11位的音调初始值信号输出并行总线,为speaker模块提供音调初始值信号。
code[3..0]为4位的音谱输出并行总线,为shumaguan模块提供音谱信号。
height[1.。
0]为2位的音高输出并行总线,为shumaguan模块提供音高信号。
该模块将输入的音符信号转化为音调初始值(tone),对应的音谱(code)及音高(height)并输出.
4。
2.3VHDL程序
定义部分省略
caseindexis
when0=>tone<=2047;code<=0;height〈=0;—---—----把音符编译成音谱音高及音名对应初始值
when1=〉tone<=773;code〈=1;height<=0;
when2=〉tone〈=912;code<=2;height<=0;
此处省略
when14=〉tone<=1695;code<=7;height<=1;
when15=>tone<=1728;code〈=1;height〈=2;
whenothers=〉null;
4。
3乐曲储存模块
4。
3.1乐曲储存模块图
图4—3notetabs模块
4.3。
2模块功能
如图4—3,clk为时钟信号引脚为模块提供时钟信号,clr为计数器清零引脚,当clr为高电平时notetabs模块中的乐曲播放计数器清零。
add[1。
。
0]为2位的乐曲地址选择并行总线,可通过不同的地址值选择不同的乐曲。
cs为片选信号引脚当cs为高电平时模块才能正常工作反之无法工作.index[3。
。
0]为4位的音符信号输出并行总线,为tonetaba模块和led模块提供音符信号。
该模块中有一个8位的播放计数器为乐谱的连续查询提供计数,当达到一定计数值后自动清零实现同一首乐曲的重复播放.
4。
3。
3VHDL
定义部分省略
ifclk’eventandclk='1'then
ifcs='0’then
counter<=0;
elsifadd="00"andcounter=395then-—-—--—-—-—-—----换歌
counter〈=0;
elsifadd=”01"andcounter=128then
counter<=0;
elsifadd=”10"andcounter=96then
counter<=0;
elsifadd=”11”andcounter=120then
counter〈=0;
elsifclr='1’andclr'last_value=’0’then--—--——-————————counter计数清0
counter〈=0;
else
counter〈=counter+1;
---此处省略
ifadd=”00"then---———----—-————--—---—--——---—-———-梁祝
casecounteris
when0=〉index〈=0;—--0
when1=>index<=0;
-—此处省略
when396=〉index〈=5;
whenothers=>null;
ifadd="01”then----—-——--—--—---—-———-----———--——两只老虎
casecounteris
when0=〉index〈=0;-—-0
when1=〉index〈=8;
--此处省略
when128=>index<=8;
whenothers=〉null;
ifadd="10"then———--———-—--—--—---—--—-——-—-—-—-—-生日快乐
casecounteris
when0=>index<=0;——-0
when1=〉index〈=5;-——5_
--此处省略
when96=>index<=8;
whenothers=>null;
ifadd="11”then——-—-—--———-——————---—-—--———-—-—--—世上只有妈妈好
casecounteris
when0=〉index<=0;
when1=〉index〈=13;-——6
——此处省略
when120=>index〈=5;
whenothers=〉null;
4。
4控制模块
4。
4。
1控制模块图
图4—4control模块
4。
4。
2模块功能
如图4—4,switch为控制引脚当其为上升沿时乐曲地址自动加一,当加到最大值时自动清零.en为使能引脚当刚en引脚为高电平时outcs引脚也为高电平,反之为低电平.add[1。
.0]为乐曲地址总线当add为00时选择第1首乐曲,为01时选择第2首乐曲,为10时选择第3首乐曲,为11时选择第4首乐曲。
outcs为notetabs模块片选控制引脚,当outcs引脚为高电平时选中notetabs模块。
4.4.3VHDL程序
定义部分省略
ifen='0'then—--—-—--—-—--—---——--en为总开关
outcs〈='0’;
elseoutcs<='1';
endif;
ifswitch'eventandswitch='1’then-—-----—-—-—----—-控制add计数(切歌)
flag<=flag+1;
endif;
.1小灯显示模块图
图4—5led模块
4.5。
2模块功能
如图4-5,input[3。
.0]为4位的音调信号输入并行总线。
light[7。
.0]为8位的led灯控制并行总线,控制led小灯的亮灭及其亮灭个数。
能依次点亮并保持不同数目的led小灯且不同的音调对应由低到高的不同的亮灯个数.(其中相邻的两个音调共用一个灯,如休止符和低音1共用第一个灯,低音2低音3共用前两个灯,以此类推)
4。
5。
3VHDL程序
定义部分省略
caseinputis
when0=>light<=”00000001”;
when1=>light<="00000001";
此处省略
when15=>light<=”11111111";
endcase;
4.6。
1数字显示模块
图4—6shumaguan模块
4。
6.2模块功能
如图,code[3..0]为4位的音谱输入并行总线。
height[1。
。
0]为2位的音高输入并行总线,输出yinggao[6。
.0]和yingpu[6..0]分别连接一个7段数字译码管用于显示音高和音谱。
4.6.3VHDL程序
定义部分省略
casecodeis
when0=〉yinpu〈="1000000”;---0————-—————--—-———————-—-—--——音谱显示
when1=〉yinpu〈="1111001";——1
此处省略
when15=〉yinpu〈=”0001110”;-—-F
whenothers=>null;
endcase;
caseheightis
when0=〉yingao<="1000000";-----—-——-—--—-———-—-—-—--——音高显示
when1=〉yingao〈=”1111001”;
when2=〉yingao<=”0100100”;
whenothers=〉null;
endcase;
分频模块
图
图4—7fenpin模块
4。
7。
2模块功能
如图,clk为DE0板提供的50MHZ,输出clk_out8为8HZ连接notetabs模块,起到控制节拍的作用。
输出clk_out1M连接speaker模块,提供基准频率。
4.7.3VHDL程序
定义部分省略
constantm:
integer:
=3125000;---——--——--———-—---———----—----—8HZ
ifclk'eventandclk='1'then
count8:
=count8+1;
ifcount8〈=mthentmp1<='0’;—-----——--———----——————-———--———8HZ
elsifcount8elsecount8:
=0;
ifcount1M=25then
count1M:
=0;
tmp2<=nottmp2;-——-—-——-——--————------——-——-————-—-——-——-—1M
elsecount1M:
=(count1M+1);
endif;
4。
8总体设计
总体电路图如图4-8
4.8.2总体功能介绍
该电路可以播放四首乐曲,可通过按按键的次数来切换曲目,接通电源后默认为播放第一首乐曲.接通电源后按一次播放第二首乐曲,接通电源后按两次播放第三首乐曲,接通电源后按三次播放第四首乐曲,接通电源后按第四次地址归零播放第一首乐曲。
每按按键四次一个循环.可重复播放当前乐曲。
在播放乐曲的同时8位的LED小灯点亮,其点亮的个数与音调对应。
四位数码管的第一位显示乐谱(0,1,2,3,4,5,6,7),第二位显示音高(0(低音),1(中音),2(高音))
五、电路的安装与调试
5。
1音频编码模块(bianma)
图5—1bianma模块仿真波形
图5-1中,当输入音符为0时其输出的音调初始值信号为2047(二进制,音高为0(低音),对应的音谱为0。
当输入音符为9时其输出的分频系数为1480
5。
2乐曲储存模块(notetabs)
图5-2notetabs模块仿真波形
图5—2中,当clr为高电平时每首乐曲的输出保持不变,当cs为高电平且
clr为低电平时模块正常工作,当add[1..0]为2时输出第三首乐曲的音符。
与原理相符合.
5。
3控制模块(control)
图5-3control模块仿真波形
图5-3中,引脚en与引脚outcs同步变化当en为高电平时outcs同样为
高电平,反之亦然。
当switch经历一次上升沿时add自动加1,当add大于3
时自动归零,按键每按一次add继续自动加一,以此不断循环.与原理相符合。
5。
4小灯控制模块(led)
图5—4led模块仿真波形
图5—4中,当input[3。
.0]的输入为音符4时light[7.。
0]的输出的低3位都为高电平,当input[3.。
0]的输入为音符6时light[7..0]的输出的低4位都为高电平,当input[3..0]的输入为音符15时light[7。
。
0]的输出的所有位都为高电平,LED小灯全点亮。
不同的音符对应由低到高的不同的亮灯个数,相邻的两个音符亮灯情况一致。
与原理相符合。
5。
5音谱与音高输出模块(shumaguan)
图5—5shumaguan模块仿真波形
图5—5中,当音谱输入为1时,输出yinpu显示1(7段译码器为1111001)输入音高为1时,输出yinggao显示1(7段译码器为1111001),,与原理相符。
六、遇到问题的解决方法
(1)由于对乐理方面知之甚少,所以在理解课题设计要求时有些困难,再搜集资料理解音调、音谱、音高之间的关系,理解了音调如何通过初始值转化成音名所对应的频率后思路就清晰了。
(2)编写的歌曲放出来节奏太慢,且听起来不顺畅。
通过分频器把控制节拍的4HZ脉冲改为16HZ脉冲,在音乐存储模块中半音则音调重复2次,全音重复4次,一个半音重复6次。
如若频率再高一些会明显加大乐曲编码的工作量。
(3)要求10个灯显示16个音调(包括休止符)不够,所以改为相邻两个音共用一种亮灯情况。
(4)由于切歌是要求从第一个音符播放,需要一个清0端,设计中把clk设计为下降沿清0,本想设计为与切歌按钮共用一个按钮,结果在DE0板上运行结果是音符不动,最后单独给清0端设置一个开关才实现功能。
七、结论与心得
(1) 本次简易音乐播放器的设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,硬件实现了整体复位、按键选择演奏方式、循环演奏以及数码管显示乐谱的功能。
(2)设计中不但要考虑模块基本功能的实现,还要通过一些高电平有效的端口避免一些不必要的工作.
(3)音乐初始值的设置方面,只要各个音名间的相对品频率关系不变,听起来都不会走调。
(4)程序内部设计逻辑关系要清晰,各层次条件要分好等级关系,否则运行结果会丢失一部分功能。
(5)本次设计基本达到了设计要求,但尚有需要改进的地方。
随着乐谱的复
杂程度加大,如果依然在音调发生器的程序中通过时钟计数来决定音符的输出,会加大编程的繁杂度,这时一个很好的解决办法就是把将要演奏的乐谱存放在人为开辟的存储空间里,这样只需要在相应地址中读出音符即可.
八、参考文献
[1]潘松,黄继业.EDA技术实用教程[M].北京:
科学出版社,2002。
[2]高歌.电子技术EDA仿真设计[M].出版地:
中国电力出版社,2007。
[3]黄任.VHDL入门•经典实例•经验总结[M].北京航天大学出版社,2005.
[4]王振红,张常年.综合电子设计与实践[M]。
北京:
清华大学出版社,2005.
[5]阎石.数字电子技术基础(第五版)[M].出版地:
高等教育出版社,2006.
[6]李国丽,朱维勇,栾铭.EDA与数字系统设计[M].机械工业出版社,2004。