硬件课程设计基于FPGA的MP3音乐播放器说明书.docx

上传人:b****2 文档编号:2760333 上传时间:2023-05-04 格式:DOCX 页数:20 大小:38.13KB
下载 相关 举报
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第1页
第1页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第2页
第2页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第3页
第3页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第4页
第4页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第5页
第5页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第6页
第6页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第7页
第7页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第8页
第8页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第9页
第9页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第10页
第10页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第11页
第11页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第12页
第12页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第13页
第13页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第14页
第14页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第15页
第15页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第16页
第16页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第17页
第17页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第18页
第18页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第19页
第19页 / 共20页
硬件课程设计基于FPGA的MP3音乐播放器说明书.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

硬件课程设计基于FPGA的MP3音乐播放器说明书.docx

《硬件课程设计基于FPGA的MP3音乐播放器说明书.docx》由会员分享,可在线阅读,更多相关《硬件课程设计基于FPGA的MP3音乐播放器说明书.docx(20页珍藏版)》请在冰点文库上搜索。

硬件课程设计基于FPGA的MP3音乐播放器说明书.docx

硬件课程设计基于FPGA的MP3音乐播放器说明书

MP3播放器说明文档

 

目录

一、实现过程2

二、代码说明4

2.1设计代码4

2.1.1顶层模块:

【songer.vhd】4

2.1.2乐谱发生模块【NoteTabs.vhd】6

2.1.3乐谱码查表模块【ToneTaba.vhd】7

2.1.4时钟分频模块【DCM_12MHZ.vhd】8

2.1.5数控分频模块【Speakera.vhd】10

2.2.测试代码:

11

2.2.1测试顶层模块【tb_songer.vhd】11

2.2.2测试Speakera模块【tb_spk.vhd】12

2.2.3测试DCM_12MHZ模块【tb_clk12mhz.vhd】12

三、操作过程14

 

一、实现过程

1.制作乐谱查找表:

找出不同音符的发音频率,寻找最佳待分频频率,计算分频数和分频预置数,制作乐谱查找表。

如何选择基准频率很关键。

若基准频率比较小,用他除以音符频率得到的分频系数也就比较小,这样的话进行四舍五入后误差相对而言会比较大。

若基准频率偏大,分频系数也就偏大,这会增加系统的负担。

综合考虑分频系数的准确性和大小,基准频率为750khz是比较合适的。

由于我们从开发板的内部时钟分频得到的750khz的频率信号是脉宽极窄的尖脉冲信号,为了提高扬声器有足够的功率发音,我们对尖脉冲信号再进行二分频,得到对称方波后再输出。

因此,在表1中,就是以375khz为基准频率计算了各个音符的分频系数和分频预置数。

选择11位二进制数表示分频系数和分频预置数(计数初值),因此最大值为2047。

休止符不用进行分频,分频系数为0,频率为375000hz。

分频系数和分频预置数的计算方法:

分频系数=375000/音符频率

分频预置数(计数初值)=2047-分频系数

表1各个音符的频率及其对应的分频系数(基准频率375KHz)

音符名

频率

(Hz)

分频

系数

计数

初值

音符名

频率

(Hz)

分频

系数

计数

初值

休止符

375000

0

2047

中音4

698.456

537

1510

低音1

261.525

1435

513

中音5

783.990

478

1569

低音2

293.664

1277

770

中音6

880

426

1621

低音3

329.627

1138

909

中音7

987.766

380

1667

低音4

349.228

1022

1025

高音1

1046.502

358

1689

低音5

391.995

957

1090

高音2

1147.659

327

1720

低音6

440

852

1195

高音3

1318.510

284

1763

低音7

493.883

759

1288

高音4

1396.919

268

1799

中音1

523.251

717

1330

高音5

1567.981

239

1808

中音2

587.329

638

1409

高音6

1760

213

1834

中音3

656.255

571

1476

高音7

1975.537

190

1857

2.预置曲谱:

定义一个转换规则,将音乐音符转换为代码预置在程序里。

我们称预置在程序里的代码为乐谱代码。

音符转换为乐谱代码的规则为:

休止符转换为代码0,低音1-低音7转换为代码1-7,中音1-中音7转换为代码8-14,高音1-高音7转换为15-21。

现在一般乐曲中,最小的节拍为1/4拍。

若定义1拍的持续时间为1秒,那么1/4拍的持续时间就为1/4秒,即0.25秒。

其他的节拍数为1/4拍的整数倍,因此他们的持续时间就为0.25秒的整数倍。

将乐曲中每个音符以及持续的节拍数写进程序,定义一个4hz的时钟频率,每当时钟上升沿来临时就输出1/4拍音符,若是其他1/4拍整数倍的音符就连续输出整数倍的次数。

这样,音符就源源不断的输出了。

3.对预置的曲谱码在乐谱查表码里进行查找,找出相应音符对应频率的分频系数和分频预置数。

4.根据查找到的分频预置数对待分频频率(750khz)进行分频并把输出连接到集成运放电路Vin实现音量调节。

音量调节的原理图如图1所示。

按图1所示电路图连接电路,Vout接扬声器。

通过调节滑动变阻器R2就调节音量。

图1音量控制电路

 

二、代码说明

2.1设计代码

2.1.1顶层模块:

【songer.vhd】

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;--加入函数库

ENTITYSongerIS

PORT(clock:

inSTD_LOGIC;--时钟信号输入

rst:

inSTD_LOGIC;--复位信号输入

CODE1:

OUTINTEGERRANGE0TO7;--简谱码输出显示

HIGH1:

OUTstd_logic;--高八度音显示

SPKOUT:

OUTSTD_LOGIC);--发音输出

ENDSonger;

ARCHITECTUREBehavioralOFSongerIS

COMPONENTNoteTabs—添加notetabs元件

PORT(clk:

INSTD_LOGIC;

ToneIndex:

OUTINTEGERRANGE0TO15);

ENDCOMPONENT;

COMPONENTToneTaba—添加tonetaba元件

PORT(Index:

ININTEGERRANGE0TO21;

CODE:

OUTINTEGERRANGE0TO7;

HIGH:

OUTstd_logic;

Tone:

OUTINTEGERRANGE0TO16#7FF#);

ENDCOMPONENT;

COMPONENTSpeakera—添加speakera元件

PORT(clk:

INSTD_LOGIC;

Tone:

ININTEGERRANGE0TO16#7FF#;

SpkS1:

OUTSTD_LOGIC);

ENDCOMPONENT;

SIGNALTone1:

INTEGERRANGE0TO16#7FF#;--定义信号量,连接ToneTaba的输出

SIGNALToneIndex1:

INTEGERRANGE0TO15;----定义信号量,连接NoteTabs的输出

componentDCM_12MHZ—添加dcm-12mhz元件

port(

clkin:

instd_logic;

rst:

instd_logic;

clk_750khz:

outstd_logic;

clk_4hz:

outstd_logic);

endcomponent;

signalclkout_4hz:

STD_LOGIC;--定义信号量,连接DCM_12MHZ的4hz输出

signalclkout_750khz:

std_logic;--定义信号量,连接DCM_12MHZ的750khz输出

BEGIN

--定义映射关系

u1:

NoteTabsPORTMAP(clk=>clkout_4hz,ToneIndex=>ToneIndex1);

u2:

ToneTabaPORTMAP(Index=>ToneIndex1,Tone=>Tone1,CODE=>CODE1,HIGH=>HIGH1);

u3:

DCM_12MHZportmap(clkin=>clock,rst=>rst,clk_750khz=>clkout_750khz,clk_4hz=>clkout_4hz);

u4:

SpeakeraPORTMAP(clk=>clkout_750khz,Tone=>Tone1,SpkS1=>SPKOUT);

END;

2.1.2乐谱发生模块【NoteTabs.vhd】

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;--加入函数库

entityNoteTabsis--定义实体

Port(clk:

inSTD_LOGIC;--音乐节拍时钟

ToneIndex:

outintegerrange0to15);--乐谱码输出

endNoteTabs;

architectureBehavioralofNoteTabsis

signalCounter:

integerrange0to2000;--乐谱码计数器

begin

CNT8:

process(clk)

begin

ifCounter=130thencounter<=0;--循环计数

elsif(clk'eventandclk='1')--时钟上升沿触发

thenCounter<=Counter+1;--计数器加1

endif;

endprocess;

Search:

process(Counter)--译码器查歌曲的乐谱表查表结果为音调表的索引值

begin

caseCounteris

when00to01=>ToneIndex<=8;--节拍00和01是中音1

when02to03=>ToneIndex<=9;--节拍02和03是中音2

when04to05=>ToneIndex<=10;--中音3

when06to07=>ToneIndex<=12;--中音5

when08to11=>ToneIndex<=13;--中音5

when12to15=>ToneIndex<=13;--中音5

when16to19=>ToneIndex<=13;--中音5

when20to21=>ToneIndex<=10;--中音3

when22to23=>ToneIndex<=6;--低音6

when24to25=>ToneIndex<=6;--低音6

when26to29=>ToneIndex<=8;--中音1

when30to31=>ToneIndex<=10;--中音3

when32to33=>ToneIndex<=9;--中音2

when34=>ToneIndex<=9;--中音2

when35=>ToneIndex<=10;--中音3

when36=>ToneIndex<=9;--中音2

when37to38=>ToneIndex<=8;--中音2

when39to40=>ToneIndex<=9;--写入的歌为最炫民族风的前奏

when41to42=>ToneIndex<=8;--中音2

when43to46=>ToneIndex<=6;--低音6

when47to50=>ToneIndex<=10;--中音3

when51to54=>ToneIndex<=6;--低音6

when55to56=>ToneIndex<=8;--中音1

when57to60=>ToneIndex<=10;

when61to62=>ToneIndex<=12;

when63=>ToneIndex<=9;

when64=>ToneIndex<=10;

when65=>ToneIndex<=9;

when66to67=>ToneIndex<=8;

when68to69=>ToneIndex<=9;

when70to71=>ToneIndex<=8;

when72to73=>ToneIndex<=7;

when74to75=>ToneIndex<=5;

when76to79=>ToneIndex<=10;

when80to83=>ToneIndex<=6;

when84to87=>ToneIndex<=8;

when88to91=>ToneIndex<=10;

when92to94=>ToneIndex<=9;

when95=>ToneIndex<=10;

when96=>ToneIndex<=9;

when97to98=>ToneIndex<=8;

when99to100=>ToneIndex<=9;

when101to102=>ToneIndex<=8;

when103to104=>ToneIndex<=6;

when105to106=>ToneIndex<=5;

when107to110=>ToneIndex<=10;

when111to114=>ToneIndex<=6;

when115to118=>ToneIndex<=8;

when119to122=>ToneIndex<=10;

when123to124=>ToneIndex<=12;

when125to126=>ToneIndex<=10;

when127to130=>ToneIndex<=12;--节拍127128130是中音5

whenothers=>null;

endcase;

endprocess;

endBehavioral;

2.1.3乐谱码查表模块【ToneTaba.vhd】

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;--加入函数库

entityToneTabais

Port(Index:

inINTEGERRANGE0TO21;--简谱代码输入

CODE:

outINTEGERRANGE0TO7;--简谱代码输出

HIGH:

outstd_logic;--高八度音显示

Tone:

outINTEGERRANGE0TO16#7FF#);--输入的简谱码查表值

endToneTaba;

architectureBehavioralofToneTabai

begin

search:

PROCESS(Index)

begin

caseIndexis--译码电路,tone输出对应分频预置数,CODE输出对应的简谱码,HIGH输出对应的音调高低

when0=>Tone<=2047;CODE<=0;HIGH<='0';--休止符

when1=>Tone<=513;CODE<=1;HIGH<='0';--低音1

when2=>Tone<=770;CODE<=2;HIGH<='0';--低音2

when3=>Tone<=909;CODE<=3;HIGH<='0';--低音3

when4=>Tone<=1025;CODE<=4;HIGH<='0';--低音4

when5=>Tone<=1090;CODE<=5;HIGH<='0';--低音5

when6=>Tone<=1195;CODE<=6;HIGH<='0';--低音6

when7=>Tone<=1288;CODE<=7;HIGH<='0';--低音7

when8=>Tone<=1330;CODE<=1;HIGH<='1';--中音1

when9=>Tone<=1409;CODE<=2;HIGH<='1';--中音2

when10=>Tone<=1476;CODE<=3;HIGH<='1';--中音3

when11=>Tone<=1510;CODE<=4;HIGH<='1';--中音4

when12=>Tone<=1569;CODE<=5;HIGH<='1';--中音5

when13=>Tone<=1621;CODE<=6;HIGH<='1';--中音6

when14=>Tone<=1667;CODE<=7;HIGH<='1';--中音7

when15=>Tone<=1689;CODE<=1;HIGH<='1';--高音1

when16=>Tone<=1720;CODE<=2;HIGH<='1';--高音2

when17=>Tone<=1763;CODE<=3;HIGH<='1';--高音3

when18=>Tone<=1799;CODE<=4;HIGH<='1';--高音4

when19=>Tone<=1808;CODE<=5;HIGH<='1';--高音5

when20=>Tone<=1834;CODE<=6;HIGH<='1';--高音6

when21=>Tone<=1857;CODE<=7;HIGH<='1';--高音7

whenOTHERS=>NULL;

endcase;

endPROCESS;

endBehavioral;

2.1.4时钟分频模块【DCM_12MHZ.vhd】

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;--加入函数库

entityDCM_12MHZis—定义实体

port(

clkin:

instd_logic;--时钟信号输入

rst:

instd_logic;--复位信号输入

clk_750khz:

outstd_logic;--750khz输出

clk_4hz:

outstd_logic);--4hz输出

endDCM_12MHZ;

architectureBehavioralofDCM_12MHZis

COMPONENTclk12mhz_dcm--语句结构对所要调用的元件作了声明

PORT(

CLKIN_IN:

INstd_logic;

RST_IN:

INstd_logic;

CLKFX_OUT:

OUTstd_logic;

CLKIN_IBUFG_OUT:

OUTstd_logic;

LOCKED_OUT:

OUTstd_logic

);

ENDCOMPONENT;

signalclk_temp:

std_logic;--类型为变量

signalcounter750:

integerrange0to15;--类型为变量范围是0到15

signalcounter4:

integerrange0to2999999;--范围是0到29999999

begin

Inst_CLK12MHZ:

clk12mhz_dcmPORTMAP(

CLKIN_IN=>clkin,

RST_IN=>rst,

CLKFX_OUT=>clk_temp,

CLKIN_IBUFG_OUT=>open,

LOCKED_OUT=>open

);

process(clk_temp,rst)--进程

begin

if(rst='1')then

counter750<=0;--赋初值

clk_750khz<='0';--赋初值

elsifrising_edge(clk_temp)then

if(counter750<=7)then--当变量等于7时,信号量为上升沿

clk_750khz<='1';

counter750<=counter750+1;--计数器加1

elsif(7

clk_750khz<='0';

counter750<=counter750+1;--计数器加一

elsif(counter750=15)then

counter750<=0;--计数器为15时再返回继续为0

endif;

endif;

endprocess;

process(clk_temp,rst)

begin

if(rst='1')then

counter4<=0;--赋初值

clk_4hz<='0';--赋初值

elsifrising_edge(clk_temp)then

if(counter4<=1499999)then--变量小于1499999时信号量为上升沿

clk_4hz<='1';

counter4<=counter4+1;--计数器加一

elsif(1499999

clk_4hz<='0';--信号量为下降沿

counter4<=counter4+1;--计数器加一

elsif(counter4=2999999)then--计数器加到2999999时为0

counter4<=0;

endif;

endif;

endprocess;

endBehavioral;

2.1.5数控分频模块【Speakera.vhd】

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;--加入函数库

entitySpeakerais--数控分频与演奏发生器

Port(clk:

inSTD_LOGIC;--待分频时钟

Tone:

inintegerrange0to16#7ff#;--分频预置数输入,11位二进制数

Spks1:

outSTD_LOGIC);--发声输出

endSpeakera;

architectureBehavioralofSpeakerais--结构体

begin

GenSpks:

process(clk,Tone)--进程

VARIABLECount1:

integerrange0to16#7FF#;--11位2进制数

begin

if

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

当前位置:首页 > PPT模板 > 其它模板

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

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