音乐播放器课程设计报告.docx

上传人:b****5 文档编号:5038656 上传时间:2022-12-12 格式:DOCX 页数:24 大小:151.37KB
下载 相关 举报
音乐播放器课程设计报告.docx_第1页
第1页 / 共24页
音乐播放器课程设计报告.docx_第2页
第2页 / 共24页
音乐播放器课程设计报告.docx_第3页
第3页 / 共24页
音乐播放器课程设计报告.docx_第4页
第4页 / 共24页
音乐播放器课程设计报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

音乐播放器课程设计报告.docx

《音乐播放器课程设计报告.docx》由会员分享,可在线阅读,更多相关《音乐播放器课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。

音乐播放器课程设计报告.docx

音乐播放器课程设计报告

音乐播放器

摘要

本设计是一个音乐播放器,由节拍发生器、歌曲存储器、译码器、分频器四部分组成。

能够连续播放或选曲播放预存在ROM里的4首歌曲。

该播放器用QuartusII仿真软件设计并测试功能正常,下载到试验箱验证成功。

关键词:

音乐播放器,节拍发生器,存储器,译码器,分频器

 

目 录

前 言3

第1章系统原理6

1.1音乐编码6

1.1.1编码原理6

1.1.2编码参照表6

1.2设计原理7

第2章系统工作过程8

2.1.1工作原理8

2.1.2仿真分析9

2.2歌曲存储器9

2.2.1工作原理9

2.2.2歌曲编码10

2.2.2ROM定制14

2.3译码器电路设计15

2.3.1译码器工作原理15

2.3.2仿真分析16

2.4分频器电路设计16

2.4.1工作原理16

2.4.2仿真分析19

第3章下载验证20

3.1引脚锁定设置20

3.1.1器件选择20

3.1.2引脚分配20

3.2配置文件下载21

3.3硬件测试21

结论22

参考文献23

前 言

世界上第一片FPGA由美国Xilinx公司于1985年率先推出。

进入21世纪之后,以FPGA为核心的单片系统(SOC)和可编程系统(SOPC)有了显著的发展,单片FPGA的集成规模已达到几百万门,其工作速度已超过300MHz。

FPGA在结构上已经实现了复杂系统所需要的主要功能,并将多种功能集成在一片FPGA器件中,如嵌入式存储器、嵌入式乘法器、嵌入式处理器、高速I/O缓冲器、外置存储器接口和实现数字信号处理的DSP等功能。

随着FPGA性能的不断完善,FPGA器件的种类日益丰富,受到世界范围内电子设计人员的普遍欢迎,并占据了较大的市场,其生产厂家也由原来的Xilinx公司一家增加到Altera、Actel、lattice等十几家公司。

Altera公司的主要产品有:

属于FPGA的FLEX、ACEX、APEX、Mercury、Excalibur、Stratix和Cyclone等系列;属于CPLD的MAX和Classic系列。

开发工具有,被普遍认为是最优秀PLD开发平台之一的MAX+PlusII和支持APEX、Mercury、Excalibur、Stratix和Cyclone系列器件的QuartusII开发软件。

Cyclone系列器件是Altera公司推出的低价位FPGA产品,是Stratix系列的简化版,分为CycloneI和CycloneII两个系列。

CycloneI系列产品为基于1.5V、采用0.13um全铜SRAM工艺的低成本FPGA。

CycloneII系列产品基于1.2V,采用0.09um全铜CMOS工艺,SRAM编程技术,其成本更低、容量更高、速度更快。

它和高性能的StratixII系列的FPGA是目前Altera公司主流产品。

我的音乐播放器主要是用VHDL语言编写,以Cyclone器件为依托,并下载到Altera仿真工具箱Cyclone-EP1C6Q240C8验证功能成功,能够初步完成音乐播放器的雏形。

随着大规模集成电路技术和计算机技术的高速发展,在涉及通信、国防、工业自动化、计算机设计与应用、仪器仪表等领域的电子系统设计工作中,FPGA技术的含量正以惊人的速度提升。

电子类的新技术项目的开发也更多地依赖于FPGA技术的应用,特别是随着HDL等硬件描述语言综合功能和性能的提高,计算机中许多重要的元件(包括CPU)都用硬件描述语言来设计和表达,许多微机CPU、硬核嵌入式系统(如ARM、MIPS)、软核嵌入式系统(如NiosII)、大型CPU,乃至整个计算机系统都用FPGA来实现,即所谓的单片系统SOC或SOPC(SystemOnaChip、SystemOnaProgrammerableChip)。

计算机和CPU的设计技术及其实现途径进入了一个全新的时代!

不但如此,传统的CPU结构模式,如冯诺依曼结构和哈佛结构正在接受巨大的挑战。

例如美国WincomSystems公司推出一款令人惊叹的服务器,其核心部分是由FPGA完成的超强功能CPU。

该系统工作能力超过50台DELL或IBM计算机,或SUNMicrosystems公司的服务器。

该服务器的处理速度要比传统服务器快50到300倍。

我们知道,传统的PC机及服务器通常采用诸如Intel公司的奔腾处理器或SUN公司的SPARC芯片作为中央处理单元,而WincomSystems的这款产品却没有采用微处理器,而是由FPGA芯片驱动。

FPGA芯片的运行速度虽比奔腾处理器慢,但可并行处理多项任务,而微处理器一次仅能处理一项任务。

因此,WincomSystems的服务器只需配置几个价格仅为2000多美元的FPGA芯片,便可击败SUN公司的服务器或采用Intel处理器的计算机。

50多年前,匈牙利数学家冯诺依曼提出了计算机的设计构想:

通过中央处理器从储存器中存取数据,并逐一处理各项任务。

然而现在,却采用FPGA取代传统微处理器获得了更高的性能,致使美国Xilinx公司的首席执行官WillemRoelandts认为:

“由冯诺依曼提出的电脑架构已经走到尽头”,“可编程芯片将掀起下一轮应用高潮”。

FPGA芯片操作灵活,可以重复擦写无限次,而微处理器均采用固定电路,只能进行一次性设计。

设计人员可通过改变FPGA中晶体管的开关状态对电路进行重写,即重配置,从而尽管FPGA芯片的时钟频率要低于奔腾处理器,但是由于FPGA芯片可并行处理各种不同的运算,所以可以完成许多复杂的任务。

正如WillemRoelandts所说的,“我们认为下一代超级电脑将基于可编程逻辑器件”,他声称,这种机器的功能比目前最大的超级电脑还要强大许多倍。

EDA专家WilliamCarter认为,只要EDA开发工具的功能允许,将有无数的证据证明FPGA具有这种神奇的能力,进而实现基于FPGA的超级电脑的开发。

此外,美国加州大学伯克利分校和杨百翰大学的研究人员也正在设计基于FPGA的电脑,这些电脑可在运行中实现动态重配置。

这对定位危险目标等军事应用和面容识别之类的计算密集型安全应用十分有用。

由此看来,在计算机应用领域和计算机系统设计领域中,EDA技术和FPGA的应用方兴未艾!

硬件描述语言HDL(HardwareDescriptionLanguage)是EDA技术的另一重要组成部分,常见的HDL有:

VHDL、VerilogHDL、SystemVerilog和SystemC。

其中VHDL、Verilog在现在EDA设计中使用最多,也得到几乎所有的主流EDA工具的支持。

而后两种HDL语言尚处于完善过程中。

VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。

VHDL具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述能力,在语言易读性和层次化结构设计方面表现了强大的生命力和应用潜力。

因此,VHDL支持各种模式的设计方法:

自顶向下与自底向上或混合方法,在面对当今许多电子产品生命周期缩短,需要多次重新设计以融入最新技术、改变工艺等方面,VHDL都表现了良好的适应性。

第1章系统原理

 

1.1音乐编码

1.1.1编码原理

1.音乐的十二平均率规定

(1)每两个八度音之间的频率相差一倍。

(2)两个八度音之间又可以分为十二个伴音,每两个伴音的频率比为1.059463。

(3)低音6(音名A)的频率是440Hz,音名B到C之间、E到F之间为伴音,其余为全音。

2.乐谱编码

选取65536Hz为基准频率,以此频率分频得到简谱高音各音调的分频比。

计算公式为N=65536/f。

表1-1简谱高音频率与分频系数

音名

f(Hz)

N(65536Hz)

1

1046.5

63

2

1174.7

56

3

1318.5

50

4

1396.9

47

5

1568.0

42

6

1760.0

37

7

1975.5

33

1.1.2编码参照表

为了让ROM能够识别各音频的分频系数,需将个音频分频系数按照一定格式转换成十六进制格式。

我们采用8位的ROM,D6D5位表示高中低音,如表1-2所示,11为高音,10为中音,01为低音;用D4D3D2D1D0位表示分频系数,将表1-1的分频系数转换成二进制格式表示;ROM的高位全部补0。

然后转换成十六进制如表1-2所示。

之所以采用高音分频比的二分之一为基准分频系数,是因为ROM的位宽限制,而每两个八度音频率相差一倍,所以我们后面用译码器译成各音频的分频系数输出给分频器,这样由分频器输出到扬声器,扬声器就可发声了。

表1-2简谱音频分频系数十六进制格式表示

高音

中音

低音

分频系数

十六进制格式

音名

D6D5

D6D5

D6D5

D4D3D2D1D0

高音

中音

低音

1

11

10

01

11111

7F

5F

3F

2

11

10

01

11100

7C

5C

3C

3

11

10

01

11001

79

59

39

4

11

10

01

11000

78

58

38

5

11

10

01

10101

75

55

35

6

11

10

01

10011

73

53

33

7

11

10

01

10001

71

51

31

1.2设计原理

通过circle与sel[1..0]进行选曲,circle的功能是循环播放,sel的功能是分别选取四首歌中的一首。

操作步骤是先进行选取再按下start便开始播放了。

如选circle,再按下start则四首歌循环播放,若选sel中的任意一个,再按下start则单曲循环,将start置为0则播放结束。

无论选取哪种播放模式,节拍器的输出q为ROM的地址线,clkout为ROM的时钟,然后按地址读取数据,按节拍ROM输出数据给译码器,译码器的时钟频率为系统的时钟频率,译码器的作用是按照音调编码的规则进行解码,使输出的数据能够被分频器所识别。

分频器设计为对任意奇数、偶数分频,且输出脉冲占空比严格为50%,这样就有足够的功率驱动扬声器,从而发声。

图1-1顶层设计

 

第2章系统工作过程

 

2.1节拍产生电路

2.1.1工作原理

1.功能介绍

(1)clk为系统时钟,预设频率为65536Hz。

(2)乐曲的播放模式分为四首循环播放和单曲循环,分别有circle和sel控制

(3)选取模式circle的优先级别比sel的高,若circle为1,则当start=‘1’时,进行四首歌曲循环播放,若circle为0,则选择sel中的一个,当start=‘1’时,将选中的歌曲单曲循环。

(4)在播放的过程中每一次clkout发出脉冲的同时q加1并输出,提供ROM的地址。

2.VHDL实现

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entityjpqis

generic(m:

integer:

=105);

port(start,clk,circle:

instd_logic;

sel:

instd_logic_vector(1downto0);

clkout:

outstd_logic;

q:

outstd_logic_vector(10downto0));

endjpq;

architecturebehaveofjpqis

signalcout:

std_logic_vector(8downto0);

signalc:

integer:

=0;

signalclko:

std_logic;

signals:

std_logic_vector(1downto0);

begin

process(clk)

variablen:

integer:

=0;

begin

n:

=integer(6536*15/m);

ifclk='1'andclk'eventthen

ifc=(integer(n/2))*2-1thenc<=0;

elsec<=c+1;

ifc<(integer(n/2))thenclkO<='0';

elseclkO<='1';

endif;

endif;

endif;

endprocess;

process(clko,start)

begin

ifstart='0'thencout<="000000000";

elsifstart='1'then

ifclko'eventandclko='1'then

ifcout<"11111111"thencout<=cout+1;

elsecout<=(others=>'0');

endif;

endif;

endif;

endprocess;

process(cout,sel,circle,s)

begin

ifcircle='1'then

ifcout="11111111"thens<=s+1;

endif;

elses<=sel;

endif;

endprocess;

clkout<=clko;

q<=s&cout;

end;

2.1.2仿真分析

图1-2节拍器的波形仿真分析

2.2歌曲存储器

2.2.1工作原理

按照歌曲的简谱编码规则,生成十六进制歌曲文件,再定制一个ROM,用十六进制歌曲文件初始化ROM

2.2.2歌曲编码

1.编码规则

(1)参照1.1.2编码参照表。

(2)由C语言编程文件生成十六进制文件。

2.C编程实现乐谱编码

#include

#include

#include

intfhex(chara)/*将十六进制数转换为十进制数*/

{

intc;

if(a=='F')c=15;

elseif(a=='E')c=14;

elseif(a=='D')c=13;

elseif(a=='C')c=12;

elseif(a=='B')c=11;

elseif(a=='A')c=10;

elseif(a=='9')c=9;

elseif(a=='8')c=8;

elseif(a=='7')c=7;

elseif(a=='6')c=6;

elseif(a=='5')c=5;

elseif(a=='4')c=4;

elseif(a=='3')c=3;

elseif(a=='2')c=2;

elseif(a=='1')c=1;

elseif(a=='0')c=0;

return(c);

}

charhex(inta)/*将十进制数转换为十六进制数*/

{

charc;

if(a==15)c='F';

elseif(a==14)c='E';

elseif(a==13)c='D';

elseif(a==12)c='C';

elseif(a==11)c='B';

elseif(a==10)c='A';

elseif(a==9)c='9';

elseif(a==8)c='8';

elseif(a==7)c='7';

elseif(a==6)c='6';

elseif(a==5)c='5';

elseif(a==4)c='4';

elseif(a==3)c='3';

elseif(a==2)c='2';

elseif(a==1)c='1';

elseif(a==0)c='0';

return(c);

}

voidaddress(inti,char*m)/*计算每一字节的地址码*/

{

inta,b,c,d;

a=i/4096;

b=(i-a*4096)/256;

c=(i-a*4096-b*256)/16;

d=i-a*4096-b*256-c*16;

*(m+3)=hex(a);

*(m+2)=hex(b);

*(m+1)=hex(c);

*(m+0)=hex(d);

}

voidmain()/*主函数*/

{

FILE*fp;

inti,j,k,t[3],n,s[3],x=0;

inth[6];

charfilename[20],l[2],d[4],*c;

printf("creathexfile,inputfilename:

\n");/*输入要创建的文件名字*/

scanf("%s",filename);

if((fp=fopen(filename,"w"))==NULL)

{

printf("cannotopenfile\n");/*若不能打开文件返回错误*/

exit(0);

}

getchar();

c=d;

printf("INPUTYUEPU:

\n");

for(;;)

{i++;

printf("inputtune,pitchandtime:

\n");/*按照音调、音高、音长的格式输入乐谱*/

scanf("%d%d%d",&t[0],&t[1],&t[2]);

n=0;

for(;;)

{

j++;

n++;

if(t[0]==8)

{

fputs(":

00000001FF",fp);

fclose(fp);

exit(0);

}

else

{if(n==t[2]+1)break;

else

{

fputc(':

',fp);

fputc('0',fp);

fputc('1',fp);

address(x,c);

x++;

for(k=3;k>=0;k--)

{

h[k]=fhex(d[k]);

fputc(d[k],fp);

}

fputc('0',fp);

fputc('0',fp);

if(t[1]==0)

{

fputc('0',fp);

h[5]=0;

}

elseif(t[1]==1)

{

fputc('3',fp);

h[5]=3;

}

elseif(t[1]==2)

{

fputc('5',fp);

h[5]=5;

}

elseif(t[1]==3)

{

fputc('7',fp);

h[5]=7;

}

if(t[0]==0)

{

fputc('0',fp);

h[4]=0;

}

if(t[0]==7)

{

fputc('1',fp);

h[4]=1;

}

elseif(t[0]==6)

{

fputc('3',fp);

h[4]=3;

}

elseif(t[0]==5)

{

fputc('5',fp);

h[4]=5;

}

elseif(t[0]==4)

{

fputc('8',fp);

h[4]=8;

}

elseif(t[0]==3)

{

fputc('9',fp);

h[4]=9;

}

elseif(t[0]==2)

{

fputc('C',fp);

h[4]=12;

}

elseif(t[0]==1)

{

fputc('F',fp);

h[4]=15;

}

s[2]=255-(h[3]*16+h[2]+h[1]*16+h[0]+h[4]+h[5]*16)%256;

s[1]=s[2]/16;

s[0]=s[2]-s[1]*16;/*产生十六进制文件的奇偶校验码*/

l[0]=hex(s[1]);

l[1]=hex(s[0]);

fputc(l[0],fp);

fputc(l[1],fp);

fputc('\n',fp);

}

}

}

printf("%d|",x);/*显示输入的节拍数*/

}

}

2.2.2ROM定制

从菜单里的Tools选择MegaWizardPlug-InManager…,按照向导完成ROM的定制。

图2-1ROM定制向导

图2-2ROM初始化文件

2.3译码器电路设计

2.3.1译码器工作原理

1.译码器功能

(1)识别由ROM输出的数据并转换成分频器能识别的分频数据。

(2)按照乐谱编码规则进行反编码。

2.VHDL实现

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitydecoderis

port(input:

instd_logic_vector(7downto0);

clk:

instd_logic;

output:

outstd_logic_vector(7downto0));

enddecoder;

architecturebehaveofdecoderis

begin

process(input,clk)

begin

ifclk='1'andclk'eventthen

ifinput(6downto5)="11"thenoutput<="00"&input(4downto0)&'0';

elsifinput(6downto5)="10"thenoutput<='0'&input(4downto0)&"00";

elsifinput(6downto5)="01"thenoutput<=input(4downto0)

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

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1