完整word版EDA简易音乐播放器设计.docx

上传人:b****1 文档编号:2222496 上传时间:2023-05-02 格式:DOCX 页数:26 大小:180.48KB
下载 相关 举报
完整word版EDA简易音乐播放器设计.docx_第1页
第1页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第2页
第2页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第3页
第3页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第4页
第4页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第5页
第5页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第6页
第6页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第7页
第7页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第8页
第8页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第9页
第9页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第10页
第10页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第11页
第11页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第12页
第12页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第13页
第13页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第14页
第14页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第15页
第15页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第16页
第16页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第17页
第17页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第18页
第18页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第19页
第19页 / 共26页
完整word版EDA简易音乐播放器设计.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

完整word版EDA简易音乐播放器设计.docx

《完整word版EDA简易音乐播放器设计.docx》由会员分享,可在线阅读,更多相关《完整word版EDA简易音乐播放器设计.docx(26页珍藏版)》请在冰点文库上搜索。

完整word版EDA简易音乐播放器设计.docx

完整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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2