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

上传人:b****8 文档编号:10685805 上传时间:2023-02-22 格式:DOCX 页数:25 大小:77.53KB
下载 相关 举报
基于FPGA的音乐播放器的设计.docx_第1页
第1页 / 共25页
基于FPGA的音乐播放器的设计.docx_第2页
第2页 / 共25页
基于FPGA的音乐播放器的设计.docx_第3页
第3页 / 共25页
基于FPGA的音乐播放器的设计.docx_第4页
第4页 / 共25页
基于FPGA的音乐播放器的设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

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

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

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

基于FPGA的音乐播放器的设计

摘要

根据国家发改委与专业教学委员会对教育机构的要求,为培养适应我国21世纪国民经济发展的电子设计人才;同时基于国家教委面向21世纪电工电子课程体系改革和电工电子工科教学基地建设两项教学改革研究成果。

要求高等本科在校学生能够自己动手完成简单的数字器件设计。

本次设计在自己手动焊接简易的PFGA板子上实现,并且在QusrtusII9.0上利用VHDL设计数控分频器电路,利用数控分频原理设计音乐硬件演奏电路,并制定LPM-ROM存储音乐数据,以“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了已纯硬件的手段来实现乐曲演奏的效果,只要修改LPM-ROM所存储的音乐数据,将其转换为其他的音乐数据,再重新制定LPM-ROM,在连接到程序中就可以实现其他与取得演奏。

本次设计采用的FPGA主芯片位ALTERA公司的FLEX系列的EPF10K10LC84-4。

由于板子是自己手动在万用板上焊接的所以只焊接了必要的外设如蜂鸣器和LED。

 

关键词

FPGA;音乐播放器;QuartusII;VHDL;

 

第一章前言

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规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。

总而言之,EDA技术的出现,给电子信息产业带来了革命性的变革。

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.1音乐演奏电路原理

先介绍一下硬件电路的发声原理。

声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。

乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。

乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。

而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。

2.1.1音符频率的获得

多个不同频率的信号可通过对某个基准频率进行分频器获得。

由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。

若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。

若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。

实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。

本文中选取750KHz的基准频率。

由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。

对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。

为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。

表1中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。

由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。

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

音符名

频率

(Hz)

分频

系数

计数

初值

音符名

频率

(Hz)

分频

系数

计数

初值

休止符

375000

0

2047

中音4

796.178

468

1579

低音1

294.349

1274

773

中音5

882.353

425

1622

低音2

330.396

1135

912

中音6

989.446

379

1668

低音3

370.92

1011

1036

中音7

1136.363

330

1717

低音4

386.598

970

1077

高音1

1175.549

319

1728

低音5

394.737

950

1197

高音2

1353.790

277

1770

低音6

495.376

757

1290

高音3

1512.097

248

1799

低音7

555.56

675

1372

高音4

1609.442

233

1814

中音1

588.697

637

1410

高音5

1802.884

208

1839

中音2

638.84

587

1480

高音6

2027.027

185

1862

中音3

742.574

505

1542

高音7

2272.727

165

1882

2.1.2乐曲节奏的控制

本文中的梁祝乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。

计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。

2.1.3乐谱发生器

本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。

当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。

2.1.4乐曲演奏电路原理框图

当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。

曲子也就流畅的播放出来了。

2.2音乐硬件演奏电路的设计实现

音乐硬件演奏电路主要是用VHDL语言来设计,并利用QuartusII软件工具来编译、测试和仿真。

2.2.1各个模块的功能简介

根据顶层原理图,共分为music模块、地址发生器模块、分频预置数模块、十六进制模块、数控分频模块这五个模块。

music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。

数控分频模块根据分频预置数输出各个音符所对应的频率。

 

2.2.2music模块

Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。

它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。

因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。

然后对音符数据进行ROM定制,最后对定制好的ROM文件进行测试和仿真。

图2-1音符数据文件

形成ROM中的配置数据(初始化数据)文件的方法如下:

在QuartusII中编辑.mif文件。

首先在File菜单下的New菜单上选择MemoryInitializationFile命令,进入编辑器,然后在空格处输入以上格式的数据文件。

如46位置处为9,表示46为地址,9为该地址中的数据。

这样每读到一个地址,即可输出其相应的数据。

文件编辑好后,保存时取文件名为“c.mif”,存盘的路径为“工程文件夹下”。

LIBRARYieee;

USEieee.std_logic_1164.all;

LIBRARYaltera_mf;

USEaltera_mf.all;

ENTITYcIS

PORT

address:

INSTD_LOGIC_VECTOR(7DOWNTO0);

clock:

INSTD_LOGIC:

='1';

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDc;

ARCHITECTURESYNOFcIS

SIGNALsub_wire0:

STD_LOGIC_VECTOR(3DOWNTO0);

COMPONENTaltsyncram

GENERIC(

clock_enable_input_a:

STRING;

clock_enable_output_a:

STRING;

init_file:

STRING;

intended_device_family:

STRING;

lpm_hint:

STRING;

lpm_type:

STRING;

numwords_a:

NATURAL;

operation_mode:

STRING;

outdata_aclr_a:

STRING;

outdata_reg_a:

STRING;

widthad_a:

NATURAL;

width_a:

NATURAL;

width_byteena_a:

NATURAL

);

PORT(

clock0:

INSTD_LOGIC;

address_a:

INSTD_LOGIC_VECTOR(7DOWNTO0);

q_a:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDCOMPONENT;

BEGIN

q<=sub_wire0(3DOWNTO0);

altsyncram_component:

altsyncram

GENERICMAP(

clock_enable_input_a=>"BYPASS",

clock_enable_output_a=>"BYPASS",

init_file=>"c.mif",

intended_device_family=>"FLEX",

lpm_hint=>"ENABLE_RUNTIME_MOD=NO",

lpm_type=>"altsyncram",

numwords_a=>256,

operation_mode=>"ROM",

outdata_aclr_a=>"NONE",

outdata_reg_a=>"CLOCK0",

widthad_a=>8,

width_a=>4,

width_byteena_a=>1

PORTMAP(

clock0=>clock,

address_a=>address,

q_a=>sub_wire0

);

ENDSYN;

定制的基本步骤如下:

1)进入QuartusII,选菜单tools->megawizardplug-inmanager,选择“creatanew…”,然后按“next”键,进入图3所示界面。

选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:

“f:

\FPGA_music\c.vhd”,注意后缀vhd小写。

2)单击“next”键,将出现图4所示的界面,选择ROM数据位宽度为4,地址线宽为8,即设置此ROM能存储8位二进制数据共64个,然后进入图5所示的窗口。

3)通过在图5所示窗口的“browse”钮,找到ROM中的加载文件路径和文件名:

“f:

\FPGA_music\c.mif”,注意ROM元件的inclock是地址锁存时钟。

4)在QuartusII中打开已定制的ROM文件。

将它设置为工程,并确定目标器件,进行测试。

2.3地址发生器模块

地址发生器模块设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。

每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。

2.3.1地址发生器的VHDL设计

这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。

例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。

那么相应随着程序[4]中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[3..0]端口输向分频预置数模块。

这样梁祝乐曲中的音符就一个接一个的通过toneindex[3..0]端口输向分频预置数模块。

程序如下

Libraryieee;

Useieee.std_logic_1164.all;

Useieee.std_logic_unsigned.all;

Entitynotetabsis

Port(clk:

instd_logic;

Toneindex:

outstd_logic_vector(3downto0));

End;

Architectureoneofnotetabsis

Componentc

Port(address:

instd_logic_vector(7downto0);

clock:

instd_logic;

q:

outstd_logic_vector(3downto0));

Endcomponent;

Signalcounter:

std_logic_vector(7downto0);

Begin

Cnt8:

process(clk)

Begin

Ifcounter="11111111"thencounter<="00000000";

Elsif(clk'eventandclk='1')thencounter<=counter+1;

Endif;

Endprocess;

U1:

cportmap(address=>counter,q=>toneindex,clock=>clk);

End;

2.3.2波形仿真

将所编写的地址发生器模块的程序设为工程,选用FLEX10K中的EPF10K10LC84-4为目标芯片进行仿真。

仿真结果如下图:

图2-2地址发生器模块的仿真波形图

程序的功能是每来一个时钟,地址值递增1,并将这个地址上所存储的音符数据输出。

从图中可以看到,当Clk来了一个时钟脉冲,输出相应地址上的音符3,地址值递增1;接下来的三个时钟脉冲来时,输出也是音符3,地址连续递增3次;再下一个脉冲来时,输出为音符5等等都符合模块中的音符数据文件中的地址/数据表。

这个仿真波形图证明了程序实现了地址发生器模块的功能。

2.4分频预置数模块

分频预置数模块是乐曲简谱码对应的分频预置数查表电路。

它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。

2.4.1分频预置数模块的VHDL设计

在这个模块的VHDL逻辑描述中设置了“梁祝”乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。

这13个值的输出由程序[3]的4位输入值index[3..0]确定。

输向程序中index[3..0]的值又由地址发生器模块的输出toneindex[3..0]的输出值和持续时间决定。

程序如下:

Libraryieee;

Useieee.std_logic_1164.all;

Entitytonetabais

Port(index:

instd_logic_vector(3downto0);

code:

outstd_logic_vector(3downto0);

high:

outstd_logic;

tone:

outstd_logic_vector(10downto0));

End;

Architectureoneoftonetabais

Begin

Search:

process(index)

Begin

Caseindexis

When"0000"=>tone<="11111111111";code<="0000";high<='0';--2047,休止符

When"0001"=>tone<="01100000101";code<="0001";high<='0';--773,低音1

When"0010"=>tone<="01110010000";code<="0010";high<='0';--912,低音2

When"0011"=>tone<="10000001100";code<="0011";high<='0';--1036,低音3,

When"0101"=>tone<="10010101101";code<="0101";high<='0';--1197,低音5

When"0110"=>tone<="10100001010";code<="0110";high<='0';--1290,低音6

When"0111"=>tone<="10101011100";code<="0111";high<='0';--1372,低音7

When"1000"=>tone<="10110000010";code<="0001";high<='1';--1410,中音1

When"1001"=>tone<="10111001000";code<="0010";high<='1';--1480,中音2

When"1010"=>tone<="11000000110";code<="0011";high<='1';--1542,中音3

When"1100"=>tone<="11001010110";code<="0101";high<='1';--1622,中音5

When"1101"=>tone<="11010000100";code<="0110";high<='1';--1668,中音6

When"1111"=>tone<="11011000000";code<="0001";high<='1';--1728,高音1

Whenothers=>null;

Endcase;

Endprocess;

End;End;

2.4.2波形仿真

将所编写的分频预置数模块的程序设为工程,仿真选用的目标芯片是EPF10K10LC84-4。

仿真结果如下图:

图2-3分频预置数模块的仿真波形图

模块的功能是输出各个音符所对应的分频预置数

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

当前位置:首页 > IT计算机 > 计算机硬件及网络

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

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