完整word版EDA简易音乐播放器设计.docx
- 文档编号:11599078
- 上传时间:2023-03-20
- 格式:DOCX
- 页数:26
- 大小:180.48KB
完整word版EDA简易音乐播放器设计.docx
《完整word版EDA简易音乐播放器设计.docx》由会员分享,可在线阅读,更多相关《完整word版EDA简易音乐播放器设计.docx(26页珍藏版)》请在冰豆网上搜索。
完整word版EDA简易音乐播放器设计
1引言
《EDA课程设计》(注:
EDA即电子设计自动化,ElectronicsDesignAutomation)是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础实验》课程后,电气类、自控类和电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件,并能利用EDA软件设计一个电子技术综合问题,并在实验箱上成功下载,为以后进行工程实际问题的研究打下设计基础。
1.通过课程设计使学生能熟练掌握一种EDA软件的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。
2.通过课程设计使学生能利用EDA软件进行至少一个电子技术综合问题的设计,设计输入可采用图形输入法或AHDL硬件描述语言输入法。
3.通过课程设计使学生初步具有分析寻找和排除电子电路中常见故障的能力。
4.通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。
2设计任务及设计要求
设计一个简易硬件播放器并能播放多首音乐(最少四首),可通过按键手动控制音乐播放。
在播放音乐的同时可实现音谱与音高的显示,并通过16个LED小灯显示不同音调的变化。
使用VHDL语言设计音调发生模块,音调编码模块,乐曲存储模块,控制模块,小灯控制模块,数字显示模块,音谱与音高输出模块等各个模块。
3设计原理及总体思路
产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
根据设计要求,乐曲硬件演奏电路系统主要由音频发生模块和乐曲存储模块组成。
音频发生模块对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
3.1音名与频率的关系
音乐的十二平均率规定:
每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表3-1所示。
表3-1简谱中的音名与频率的关系
音名
频率/Hz
音名
频率/Hz
音名
频率/Hz
低音1
261.63
中音1
532.25
高音1
1046.50
低音2
293.67
中音2
587.33
高音2
1174.66
低音3
329.63
中音3
659.25
高音3
1318.51
低音4
349.23
中音4
698.46
高音4
1396.92
低音5
391.99
中音5
783.99
高音5
1567.98
低音6
440.00
中音6
880.00
高音6
1760.00
低音7
493.88
中音7
987.76
高音7
1975.52
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。
若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。
实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。
本例中选取12MHz的基准频率,若无12MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。
各音阶频率及相应的分频系数如表2所示。
为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。
表3-2中的分频系数就是从500KHZ频率二分频得到的250KHZ频率基础上计算得出的。
表3-2各音阶频率对应的分频值
音名
初始值
分频系数
音名
初始值
分频系数
低音1
773
1274
中音1
1410
637
低音2
912
1135
中音2
1480
567
低音3
1036
1011
中音3
1542
505
低音5
1197
850
中音5
1622
425
低音6
1290
757
中音6
1668
379
低音7
1372
675
高音1
1728
319
由于最大的分频系数为1274,故采用13位二进制计数器已能满足分频要求。
在表3-2,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为2047即可,此时扬声器将不会发声。
对于不同的分频系数,加载不同的初始值即可。
3.2节拍控制原理
该演奏电路演奏的乐曲是“梁祝”等片段,其最小的节拍为1拍。
将1拍的时长定为0.25秒,则需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过音符的多次重复的方式来完成。
对于占用时间较长的节拍,如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。
由于乐理规律对于任何一首音乐都是普遍适用的,所以以上原理对于其他三首乐曲同样适用。
4各单元模块的设计
4.1音频发生模块
4.1.1模块引脚
图4-1speaker模块
4.1.2模块功能
如图4-1,en为使能引脚,当en引脚接高电平时speaker模块使能可正常工作。
clk为时钟信号引脚,为speaker模块提供时钟信号。
tone[10..0]为11位的音调初始值信号并行总线,可快速的为speaker模块输送音调初始值信号,保证乐曲演奏的流畅性。
spks为电信号输出引脚,连接蜂鸣器将电信号转化为声信号。
该模块中有一个4位的计数器用于将12MHz时钟信号进行十二分频产生1MHz的基准信号。
一个11位的递增计数器用于赋音调初始值对基准信号进行频,最后进行二分频产生对称方波。
初始值D=计数最大值N-分频系数n
(1)
4.1.3VHDL程序
libraryieee;
useieee.std_logic_1164.all;
entityspeakeris
port(
en:
instd_logic;
clk:
instd_logic;
tone:
inintegerrange0to16#7ff#;--"2047"
spks:
outstd_logic);
endspeaker;
architecturebehavofspeakeris
signalpreclk:
std_logic;
signalfullspks:
std_logic;
begin
divideclk:
process(clk)--12分频
variablecount4:
integerrange0to15;
begin
preclk<='0';
ifcount4>11then
preclk<='1';
count4:
=0;
elsifclk'eventandclk='1'then
count4:
=count4+1;
endif;
endprocess;
genspks:
process(preclk,tone)--"preclk=1MHZ";
variablecount11:
integerrange0to16#7ff#;
begin
ifpreclk'eventandpreclk='1'then--频率控制
ifcount11=16#7ff#then--b"111,1111,1111"
count11:
=tone;--初始值D=计数最大值N-分频系数n
fullspks<='1';
elsecount11:
=count11+1;
fullspks<='0';
endif;
endif;
endprocess;
delay:
process(fullspks)--"fullspks=488.2815HZ";二分频
variablecount2:
std_logic;
begin
iffullspks'eventandfullspks='1'then
count2:
=notcount2;
ifen='0'then
spks<='0';--gaile
elsifcount2='1'then
spks<='1';
else
spks<='0';--"spks=244.14075HZ"
endif;
endif;
endprocess;
endbehav;
4.2音频编码模块
4.2.1模块引脚
图4-2tonetaba模块
4.2.2模块功能
如图4-2,index[3..0]为4位的音符输入并行总线,用于为tonetaba模块输送音符信号。
tone[10..0]为11位的音调初始值信号输出并行总线,为speaker模块提供音调初始值信号。
code[3..0]为4位的音谱输出并行总线,为SELTIME模块提供音谱信号。
high[1..0]为2位的音高输出并行总线,为SELTIME模块提供音高信号。
该模块将输入的音符信号转化为音调初始值(tone),对应的音谱(code)及音高(high)并输出。
4.2.3VHDL程序
libraryieee;
useieee.std_logic_1164.all;
entitytonetabais
port(
index:
inintegerrange0to15;
tone:
outintegerrange0to16#7ff#;--"2047"
code:
outintegerrange0to15;
high:
outintegerrange0to2);
endtonetaba;
architecturebehavoftonetabais
begin
search:
process(index)
begin
caseindexis
when0=>tone<=2047;code<=0;high<=0;
when1=>tone<=773;code<=1;high<=0;
when2=>tone<=912;code<=2;high<=0;
when3=>tone<=1036;code<=3;high<=0;
when5=>tone<=1197;code<=5;high<=0;
when6=>tone<=1290;code<=6;high<=0;
when7=>tone<=1372;code<=7;high<=0;
when8=>tone<=1410;code<=1;high<=1;
when9=>tone<=1480;code<=2;high<=1;
when10=>tone<=1542;code<=3;high<=1;
when12=>tone<=1622;code<=5;high<=1;
when13=>tone<=1668;code<=6;high<=1;
when15=>tone<=1728;code<=1;high<=2;
whenothers=>null;
endcase;
endprocess;
endbehav;
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程序
libraryieee;
useieee.std_logic_1164.all;
entitynotetabsis
port(
clk,clr:
instd_logic;
add:
instd_logic_vector(1downto0);
cs:
instd_logic;
index:
outintegerrange0to15);
endnotetabs;
architecturebehavofnotetabsis
signalcounter:
integerrange0to255;
begin
cnt8:
process(clk,cs)
begin
ifcs='0'then
counter<=0;
elsifadd="00"andcounter=138then
counter<=0;--每一首歌都循环播放
elsifadd="01"andcounter=127then
counter<=0;
elsifadd="10"andcounter=183then
counter<=0;
elsifadd="11"andcounter=131then
counter<=0;
elsifclr='1'andclr'LAST_VALUE='0'then
counter<=0;
elsifclk'eventandclk='1'then
counter<=counter+1;
endif;
endprocess;
search:
process(counter)
begin
ifadd="00"then
casecounteris
when00=>index<=3;
when01=>index<=3;
when02=>index<=3;
--此处省略
when135=>index<=5;
when136=>index<=0;
when137=>index<=0;
when138=>index<=0;
whenothers=>null;
endcase;
endif;
ifadd="01"then
casecounteris
when00=>index<=13;
when01=>index<=13;
when02=>index<=13;
--此处省略
when124=>index<=5;
when125=>index<=0;
when126=>index<=0;
when127=>index<=0;
whenothers=>null;
endcase;
endif;
ifadd="10"then
casecounteris
when00=>index<=10;
when01=>index<=10;
when02=>index<=12;
--此处省略
when180=>index<=8;
when181=>index<=8;
when182=>index<=8;
when183=>index<=8;
whenothers=>null;
endcase;
endif;
ifadd="11"then
casecounteris
when00=>index<=6;
when01=>index<=6;
when02=>index<=6;
--此处省略
when128=>index<=6;
when129=>index<=0;
when130=>index<=0;
when131=>index<=0;
whenothers=>null;
endcase;
endif;
endprocess;
endbehav;
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程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycontrolis
port(switch,en:
instd_logic;
add:
outstd_logic_vector(1downto0);
outcs:
outstd_logic);
endcontrol;
architectureoneofcontrolis
signaladd_r:
std_logic_vector(1downto0);
begin
add<=add_r;
process(switch,en)
begin
ifen='0'then
outcs<='0';
else
outcs<='1';
endif;
ifrising_edge(switch)then
add_r<=add_r+1;
endif;
endprocess;
endone;
4.5小灯控制模块
4.5.1模块引脚
图4-5LED模块
4.5.2模块功能
如图4-5,NUM[3..0]为4位的音符信号输入并行总线。
LIGHT[15..0]为16位的LED灯控制并行总线,控制LED小灯的亮灭及其亮灭个数。
能依次点亮并保持不同数目的LED小灯且不同的音符对应由低到高的不同的亮灯个数。
4.5.3VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYLEDIS
PORT(
NUM:
ININTEGERRANGE0to15;
LIGHT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0)
);
ENDLED;
ARCHITECTUREONEOFLEDIS
BEGIN
PROCESS(NUM)
BEGIN
CASENUMIS
WHEN0=>LIGHT<="0000000000000001";
WHEN1=>LIGHT<="0000000000000011";
WHEN2=>LIGHT<="0000000000000111";
WHEN3=>LIGHT<="0000000000001111";
WHEN4=>LIGHT<="0000000000011111";
WHEN5=>LIGHT<="0000000000111111";
WHEN6=>LIGHT<="0000000001111111";
WHEN7=>LIGHT<="0000000011111111";
WHEN8=>LIGHT<="0000000111111111";
WHEN9=>LIGHT<="0000001111111111";
WHEN10=>LIGHT<="0000011111111111";
WHEN11=>LIGHT<="0000111111111111";
WHEN12=>LIGHT<="0001111111111111";
WHEN13=>LIGHT<="0011111111111111";
WHEN14=>LIGHT<="0111111111111111";
WHEN15=>LIGHT<="1111111111111111";
ENDCASE;
ENDPROCESS;
ENDONE;
4.6数字显示模块
4.6.1模块引脚
图4-6DELED模块
4.6.2模块功能
如图,S[3..0]为4位的十六进制数字输入并行总线。
A,B,C,D,E,F,G,H各引脚分别连接数码管的对应段选引脚是数码管显示S[3..0]所输入的十六进制数字。
4.6.3VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDELEDIS
PORT(
S:
INSTD_LOGIC_VECTOR(3DOWNTO0);
A,B,C,D,E,F,G,H:
OUTSTD_LOGIC);
ENDDELED;
ARCHITECTUREBEHAVOFDELEDIS
SIGNALDATA:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALDOUT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
DATA<=S;
PROCESS(DATA)
BEGIN
CASEDATAIS
WHEN"0000"=>DOUT<="00111111";
WHEN"0001"=>DOUT<="00000110";
WHEN"0010"=>DOUT<="01011011";
WHEN"0011"=>DOUT<="010011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word EDA 简易 音乐 播放 设计