基于fpga的音乐播放器的设计1.docx

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

基于fpga的音乐播放器的设计1.docx

《基于fpga的音乐播放器的设计1.docx》由会员分享,可在线阅读,更多相关《基于fpga的音乐播放器的设计1.docx(19页珍藏版)》请在冰点文库上搜索。

基于fpga的音乐播放器的设计1.docx

基于fpga的音乐播放器的设计1

1引言

1.1关于EDA技术

随着科学技术的进步,电子器件和电子系统设计方法日新月异,电子设计自动化(ElectronicsDesignAutomation,EDA)技术正是适应了现代电子产品设计的要求,吸收了多学科最新成果而形成的一门新技术。

现如今掌握EDA技术是电子信息类专业的学生、工程技术人员所必备的基本能力和技能。

传统电子电路的设计,首先要对系统进行分析,然后按功能对系统进行划分,接下来就要选择特定芯片,焊接成PCB电路板,最后对成品PCB电路板进行调试。

这样的设计没有灵活性可言,搭成的系统需要的芯片种类多且数目大,而且对于电路图的设计和电路板的设计都需要很大的工作量,工作难度也很高。

然而,随着可编程器件和EDA技术的发展,传统设计的劣势被克服,采用可编程逻辑器件基于芯片的设计方法,期间的内部逻辑和引脚可以由设计者自行决定,大大提高了设计的灵活性,提高了工作效率;同时,将系统集成在一个芯片上的设计,使系统具有体积小、功耗低、可靠性高等特点。

EDA技术的发展大致经历了三个阶段:

20世纪70年代的CAD(计算机辅助设计)阶段、20世纪80年代的CAE(计算机辅助工程)阶段、20世纪90年代后的EDA(电子设计自动化)阶段。

以下主要介绍第三个阶段。

EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(HDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。

它主要采用“自顶向下”的设计方法,设计流程主要包括:

设计输入、综合、仿真、适配、下载。

EDA技术主要有以下特征:

(1)高层综合的理论和方法取得进展,从而将EDA设计层次由RT级提高到了系统级,并推出了相应的系统级综合优化工具,大大缩短了复杂ASIC的设计周期。

(2)采用硬件描述语言来描述10万门以上的设计,并形成了VHDL和Verilog-HDL两种标准硬件描述语言。

(3)采用平面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。

(4)可测性综合设计。

(5)为带有嵌入式IP核的ASIC设计提供软、硬件协同设计工具。

(6)建立并行设计工具框架结构的集成化设计环境,以适应当今ASIC规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。

1.2关于VHDL

VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。

使用VHDL语言描述的电路,可以进行综合和仿真。

然而,值得注意的是,尽管所有VHDL代码都是可仿真的,但并不是所有代码都能综合。

VHDL被广泛使用的基本原因在于它是一种标准语言,是与工具和工艺无关的,从而可以方便地进行移植和重用。

VHDL两个最直接的应用领域是可编程逻辑器件(PLD)和专用集成电路(ASIC),其中可编程逻辑器件包括复杂可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)。

关于VHDL最后要说明的是:

与常规的顺序执行的计算机程序不同,VHDL从根本上讲是并发执行的。

在VHDL中,只有在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。

1.3EDA工具

目前有多种EDA工具支持采用VHDL进行电路综合、仿真以及实现。

比较常见的是Altera公司的QuartusⅡ开发平台和Xilinx公司的ISE开发平台。

这些平台中使用的综合工具和仿真工具通常由专业的EDA厂商提供。

本次设计中所使用的平台正是QuartusⅡ7.2,它是Altera公司提供的一套集成了编译、布局布线和仿真工具在内的综合开发环境。

它能完成从代码输入到编译到仿真再到物理实现的全部设计流程。

1.4有关于本次课程设计

本次课程设计要求使用EDA工具,设计实现简易音乐演奏器,理解音名与频率的关系及数控分频原理,经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。

我们知道,与利用单片机来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具与硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。

在后面的章节中会详细介绍利用EDA技术实现简易音乐演奏器的过程。

2设计实现

2.1准备知识

在本次设计中采用了铃声《祝你生日快乐》作为要播放的乐曲,它的旋律如下:

55|651|7—55|652|1—55|531|76—|0044|312|1—

根据声乐知识,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是本实验的关键。

表2-1为简谱中音名与频率的对应关系。

表2-1简谱音名与频率的关系

音名

频率(Hz)

音名

频率(Hz)

中音1

523

高音1

1047

中音2

587

高音2

1175

中音3

659

高音3

1382

中音4

698

高音4

1397

中音5

784

高音5

1568

中音6

880

高音6

1760

中音7

988

高音7

1976

 

频率点及音符与音谱对应定义如表2-2所示。

表2-2音符语音谱定义

音符

对应频率点

对应音谱

区别高中低音

0

2047

0

0

1

1091

1

1

2

1195

2

1

3

1288

3

1

4

1331

4

1

5

1409

5

1

6

1479

6

1

7

1541

7

1

8

1569

1

2

9

1621

2

2

10

1668

3

2

11

1689

4

2

12

1728

5

2

13

1763

6

2

14

1794

7

2

 

2.2乐曲演奏电路的结构示意

本设计由四个模块组成,如图2-3所示。

 

图2-3乐曲演奏电路的结构示意

2.3乐曲演奏电路的子结构

顶层结构所包含的模块分别有音调发生器(ydfsq)模块、手动\自动选择(bmux)模块、音调编码器(ydbmq)模块及数控分频器(skfpq)模块。

以下便是对各个子模块的分析。

2.3.1音调发生器模块

1.音调发生器模块的功能

在此模块中设置了一个8位二进制计数器(计数最大值为107),这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时,四四拍的4分音符的持续时间。

例如,ydfsq在以下的VHDL逻辑描述中,《祝你生日快乐》乐曲的第一个音符为“5”,此音在逻辑中停留了4个时钟节拍,即为1s时间,相应地所对应“1”音符分频预置数为1409在skfpq的输入端停留了1s。

随着ydfsq中的计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,《祝你生日快乐》乐曲就开始自然连续而且循环的演奏起来了。

2.音调发生器模块的VHDL源程序

libraryieee;

useieee.std_logic_1164.all;

entityydfsqis

port(clk:

instd_logic;

clkj:

instd_logic_vector(1downto0);

rst:

instd_logic;

toneindex:

outintegerrange0to14);

endydfsq;

architecturebhvofydfsqis

signalcounter:

integerrange0to107;

signalclker:

std_logic;

signalcount4:

integer;

begin

process(clk)

begin

ifclk'eventandclk='1'then

ifclkj="10"then

count4<=count4+1;

ifcount4>0then

clker<=notclker;count4<=0;

endif;

elsifclkj="01"then

count4<=count4+1;

ifcount4>2then

clker<=notclker;count4<=0;

endif;

elsecount4<=count4+1;

ifcount4>1then

clker<=notclker;count4<=0;

endif;

endif;

endif;

endprocess;

process(clker,counter,rst)

begin

ifrst='1'then

counter<=0;

elsifcounter=107then

counter<=0;

elsifclker'eventandclker='1'then

counter<=counter+1;

endif;

endprocess;

process(counter)

begin

casecounteris

when0to3|8to11|24to27|32to35|48to51=>toneindex<=5;

when4to7|28to31|68to75=>toneindex<=6;

when16to23|64to67=>toneindex<=7;

when12to15|40to47|60to63|92to95|100to107=>toneindex<=8;

when96to99=>toneindex<=9;

when56to59|88to91=>toneindex<=10;

when84to87=>toneindex<=11;

when52to55=>toneindex<=12;

when76to83=>toneindex<=0;

whenothers=>NULL;

endcase;

endprocess;

endbhv;

3.音调发生器模块的仿真图

图2-4音调发生器模块的仿真波形图

通过仿真图可以清楚的看到,时钟clk由0开始计数,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。

然后把输出toneindex输入到音调编码器模块,进行下一步编码工作。

于是,由仿真图印证了ydfsq模块逐次选取音符的功能。

2.3.2手动\自动选择模块

1.手动\自动选择模块的功能

根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。

于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。

与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。

以上提到的手动与自动的选择只能在rst为0时有效。

2.手动\自动选择模块的VHDL源程序

libraryieee;

useieee.std_logic_1164.all;

entitybmuxis

port(d1:

inintegerrange0to14;

d2:

inintegerrange0to14;

cs,rst:

instd_logic;

q:

outintegerrange0to14);

endbmux;

architecturebhvofbmuxis

begin

process(cs,rst)

begin

ifrst='1'then

q<=0;

else

casecsis

when'0'=>q<=d1;

when'1'=>q<=d2;

whenothers=>q<=d1;

endcase;

endif;

endprocess;

endbhv;

3.手动\自动选择模块的仿真图

图2-5手动\自动选择模块的仿真波形图

此仿真图中输入cs代表手动\自动演奏的选择端,输入rst代表整体复位端,输入d1、d2分别代表手动和自动要演奏的音符,输出q代表经过选择后,要演奏的或是手动输入或是自动输入的音符。

由此仿真图可清楚的看到当rst=1时,不论选择的是手动还是自动,输出都为零,达到了整体复位的功能;当rst=0且cs=1时,自动演奏乐曲,因为q与d2的值相同;当rst=0且cs=0时,手动演奏乐曲,因为这时的q与d1的值相同,从而也达到了演奏方式选择的功能。

2.3.3音调编码器模块

1.音调编码器模块的功能

此模块的功能首先是为skfpq提供决定所发音符的分频预置数,而此数在skfpq输入端口停留的时间即为此音符的节拍值。

ydbmq模块是乐曲简谱码对应的分频预置数查表电路,其中设置了《祝你生日快乐》乐曲全部音符所对应的分频预置数,共9个,每一音符的停留时间由音乐节拍和音调发生器模块ydfsq的clk输入频率决定,在此为4Hz。

这9个值的输出由对应于ydbmq的4位输入值index[3..0]来确定。

与此同时,code[3..0]和code1[3..0]这两个输出接2个数码管分别显示乐曲音符的高、中、低音(“0”代表低音,“1”代表中音,“2”代表高音)和乐曲演奏的音符(高、中、低1~7音符)。

2.音调编码器模块的VHDL源程序

libraryieee;

useieee.std_logic_1164.all;

entityydbmqis

port(index:

inintegerrange0to14;

code:

outintegerrange0to15;

code1:

outintegerrange0to15;

tone:

outintegerrange0to2047);

endydbmq;

architecturebhvofydbmqis

begin

process(index)

begin

caseindexis

when0=>tone<=2047;code<=0;code1<=0;

when1=>tone<=1091;code<=1;code1<=1;

when2=>tone<=1195;code<=2;code1<=1;

when3=>tone<=1288;code<=3;code1<=1;

when4=>tone<=1331;code<=4;code1<=1;

when5=>tone<=1409;code<=5;code1<=1;

when6=>tone<=1479;code<=6;code1<=1;

when7=>tone<=1541;code<=7;code1<=1;

when8=>tone<=1569;code<=1;code1<=2;

when9=>tone<=1621;code<=2;code1<=2;

when10=>tone<=1668;code<=3;code1<=2;

when11=>tone<=1689;code<=4;code1<=2;

when12=>tone<=1728;code<=5;code1<=2;

when13=>tone<=1763;code<=6;code1<=2;

when14=>tone<=1794;code<=7;code1<=2;

whenothers=>NULL;

endcase;

endprocess;

endbhv;

3.音调编码器模块的仿真图

图2-6音调编码器模块的仿真波形图

在此仿真图中从上到下依次代表输出code、输出code1、输入index和输出tone。

通过此仿真图能清楚的看到当音符分别为3、5、8、13、0时,它们所对应的分频预置数tone分别是1288、1409、1569、1763、2047;所对应的音谱code分别是3、5、1、6、0;所对应的高中低音code1又分别是1(中)、1(中)、2(高)、2(高)、0(低)。

其中code、code1能分别在两个数码管上显示,而tone则输入到数控分频模块作为分频的依据。

于是,由仿真图印证了音调编码模块传送预置数及显示功能。

2.3.4数控分频器模块

1.数控分频器模块的功能

该模块的clk端输入一个具有较高频率(本实验为12MHz)的信号,通过skfpq分频后由spkout输出。

由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个D触发器均衡其占空比,也即作二分频处理。

skfpq对clk输入信号的分频比由11位预置数tone[10..0]决定。

spkout的输出频率将决定每一音符的音调,这样分频计数器的预置数tone[10..0]与spkout的输出频率就有了对应关系。

例如在ydbmq模块中取tone[10..0]=1479,作为发音符为“6”音的信号频率。

2.数控分频器模块的VHDL源程序

libraryieee;

useieee.std_logic_1164.all;

entityskfpqis

port(clk:

instd_logic;

tone:

inintegerrange0to2047;

spks:

outstd_logic);

endskfpq;

architecturebhvofskfpqis

signalpreclk:

std_logic;

signalfullspks:

std_logic;

begin

process(clk)

variablecount4:

integerrange0to14;

begin

preclk<='0';

ifcount4>11then

preclk<='1';count4:

=0;

elsifclk'eventandclk='1'then

count4:

=count4+1;

endif;

endprocess;

process(preclk,tone)

variablecount11:

integerrange0to2047;

begin

ifpreclk'eventandpreclk='1'then

ifcount11=2047then

count11:

=tone;fullspks<='1';

else

count11:

=count11+1;fullspks<='0';

endif;

endif;

endprocess;

process(fullspks)

variablecount2:

std_logic;

begin

iffullspks'eventandfullspks='1'then

count2:

=notcount2;

ifcount2='1'then

spks<='1';

else

spks<='0';

endif;

endif;

endprocess;

end;

3.数控分频器模块的仿真图

图2-7数控分频器模块的仿真波形图

音符的分频预置数,输出spks则代表将输入clk先经过12次分频,再经过(预置数终值2048-tone)次分频,最终在进行二分频处理后的信号,而这个信号的频率就是我们需要演奏在此仿真图中,输入clk是一个频率较大的时钟信号,输入tone代表着某个的音谱的频率,根据频率的不同,从而能通过喇叭听到不同的声音,这就是我们一直想要演奏的乐曲了!

 

2.4顶层文件

2.4.1顶层音乐演奏器源程序

libraryieee;

useieee.std_logic_1164.all;

entityyyyzqis

port(clk1,clk2,cs,rst:

instd_logic;

d1:

inintegerrange0to14;

clkj:

instd_logic_vector(1downto0);

code,code1:

outintegerrange0to15;

spks:

outstd_logic);

endyyyzq;

architecturebhvofyyyzqis

signalx,y:

integerrange0to14;

signalz:

integerrange0to2047;

componentydfsqis

port(clk:

instd_logic;

rst:

instd_logic;

clkj:

instd_logic_vector(1downto0);

toneindex:

outintegerrange0to14);

endcomponent;

componentbmuxis

port(d1:

inintegerrange0to14;

d2:

inintegerrange0to14;

cs,rst:

instd_logic;

q:

outintegerrange0to14);

endcomponent;

componentydbmqis

port(index:

inintegerrange0to14;

code:

outintegerrange0to15;

code1:

outintegerrange0to15;

tone:

outintegerrange0to2047);

endcomponent;

componentskfpqis

port(clk:

instd_logic;

tone:

inintegerrange0to2047;

spks:

outstd_logic);

endcomponent;

begin

u1:

ydfsqportmap(clk=>clk1,clkj=>clkj,toneindex=>x,rst=>rst);

u2:

bmuxportmap(d1=>d1,d2=>x,cs=>cs,rst=>rst,q=>y);

u3:

ydbmqportmap(index=>y,code=>code,code1=>code1,tone=>z);

u4:

skfpqportmap(clk=>clk2,tone=>z,spks=>spks);

endbhv;

2.4.2顶层音乐演奏器原理图

经过了各个子模块的分析与验证后,我们只需将各个子模块之间的输入输出端、子模块与整体电路之间的输入输出端进行正确的硬件连接就得到了顶层音乐演奏器的原理图,如图2-8所示:

图2-8乐曲演奏电路的顶层原理图

 

2.4.3顶层程序仿真波形图

图2-9顶层程序的仿真波形图

首先,介绍一下总体程序中各个引脚的作用及硬件连接情况:

输入clk1是一个频率较小的时钟信号,在进行硬件下载时它与实验箱上clock0模块的16Hz频率相连,它决定着乐曲演奏的快慢;输入clk2是一个频率较大的时钟信号,因为要

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

当前位置:首页 > 初中教育 > 语文

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

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