最新fpga课设蜂鸣器音乐演奏.docx

上传人:b****8 文档编号:9967499 上传时间:2023-05-22 格式:DOCX 页数:17 大小:129.72KB
下载 相关 举报
最新fpga课设蜂鸣器音乐演奏.docx_第1页
第1页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第2页
第2页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第3页
第3页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第4页
第4页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第5页
第5页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第6页
第6页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第7页
第7页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第8页
第8页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第9页
第9页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第10页
第10页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第11页
第11页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第12页
第12页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第13页
第13页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第14页
第14页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第15页
第15页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第16页
第16页 / 共17页
最新fpga课设蜂鸣器音乐演奏.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

最新fpga课设蜂鸣器音乐演奏.docx

《最新fpga课设蜂鸣器音乐演奏.docx》由会员分享,可在线阅读,更多相关《最新fpga课设蜂鸣器音乐演奏.docx(17页珍藏版)》请在冰点文库上搜索。

最新fpga课设蜂鸣器音乐演奏.docx

最新fpga课设蜂鸣器音乐演奏

 

fpga课设——蜂鸣器音乐演奏

FPGA实验报告

 

实验名称:

蜂鸣器音乐演奏

实验日期:

姓名:

学号:

 

一、实验目的

1.熟悉QuartusII软件的使用。

2.熟悉EDA实验开发系统的基本使用。

3.学习VHDL基本单元电路的设计应用。

进一步掌握EDA的多层次设计方法。

4.学习音乐发生器的设计。

除了报警,蜂鸣器还可以用来奏乐。

让它发出悦耳动听的声音,加深理解蜂鸣器的控制电路原理。

二.设计要求

1.自动循环播放歌曲《义勇军进行曲》。

2.由数码管分别显示高、中、低音的音符。

三.实验原理

1、乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需根据乐曲的速度和每个音符的节拍数来确定。

其简谱中音符和频率的关系如下:

 

2、该演奏电路演奏的乐曲是《友义勇军进行曲》,其最小的节拍为1拍,将1拍的时长定位0.2S,则只需要再提供一个5hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。

对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。

3、乐曲硬件演奏电路系统主要有音调分频器和乐曲存储模块两个部分组成,其余还有音乐节拍发生器等等。

音调分频器对1mhz(由基准频率产生)的频率进行分频,得到与各个音节对应的频率输出。

乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的ROM存储),由一个计数器来控制此真值表的输出,而由计数器的技术时钟信号作为乐曲节拍控制信号。

4、其中5hz和1mhz的频率由基准频率分频产生,分别作用给每个模块。

四、方案设计

a.设计分析:

实验中采用层次化设计思路,音乐发生器的设计包括四个模块:

时钟分频模块fdiv、自动演奏模块autoplay、查表及显示模块table、音调分频模块fenpin。

分好层次之后,编写每个模块的程序。

时钟分频模块fdiv通过基准时钟频率clk(50mhz)产生两个时钟信号clk1(1mhz),clk2(5hz)。

自动演奏模块autoplay接收clk1的时钟信号,输出index_auto。

查表及显示模块table利用index_auto查找并输出分频系数tone。

同时将音调对应的给三个数码管,分别显示高中低音符。

音调分频模块fenpin接收tabled输出的分频系数tone,并据此分频,将对应频率的信号buzz输出给扬声器供其发声。

b.流程图:

数码管显示

clk输出buzz

 

五.实验过程

1.时钟分频模块fdiv

通过基准时钟频率clk(50mhz)产生两个时钟信号clk1(1mhz),clk2(5hz)。

程序见附录1:

其仿真结果如下:

 

2.自动演奏autoplays模块

这个模块用FPGA的片内ROM存放乐曲的简谱真值表,由一个二进制计数器为乐曲数据存储ROM的地址发生器随着autoplay中计数器按clk2时钟频率做加法计数时,乐曲数据存储器ROM中的音符数据,将从ROM中的输出口输向音符查表模块table,所存储的乐曲就开始连续自然地演奏起来。

ROM的定制过程,利用MegawizardPlug-InManager定制音符数据存储器music,其中music_rom的程序见附录二。

在定制ROM的过程中,由于需要存入296个音符数据,选择ROM的数据位宽为8,地址为64(共计512个字),ROM的类型选择为Auto。

根据义勇军进行曲的音乐简谱,以及简谱中的低、中、高和额节拍与发生频率的关系等等,化成个音符数字有296个,存入ROM中。

在数据文件编辑窗中,在mif格式表格中填入义勇军进行曲的296个音符数据,并以十进制填入,最后保存数据文件名为music.mif,存入原路径中。

其中1—7表示低音,8—14表示中音,15—21表示高音。

Autoplay的程序见目录三。

在源程序中index_auto是音乐节拍发生器输出地音符数据;clk2是计数时钟输入端,该信号作为音符的快慢信号,频率越高,时钟的输出节拍速度就越快,演奏的速度也越快。

该模块仿真结果如下:

3、查表及显示table模块

利用index_auto查找并输出分频系数tone。

同时将音调对应的给三个数码管,分别显示高中低音符。

其程序见目录四。

在源程序中,tone是音调分频模块提供音符频率的分频系数,此处有一个位选信号come和段选信号seg可以通过数码管来显示乐曲演奏时对应的高中低音符。

在此模块中假设index_auto音符为15,其仿真结果如下:

4、音调分频模块(speakera)设计

分频器对FPGA的clk1进行分频,得到与各个音阶对应的频率输出,里面包含一个计数器,当计数器满时,产生一个进位信号,该信号就是用作发音的频率信号,在计数器端的预置值端给定不同的初值时,产生不同频率的信号。

其程序见附录五。

假设tone为252,其仿真结果如下:

5、根据层次化设计要求把各个部分根据实验设计流程,设计成顶层文件。

其程序见附录六。

6、经编译无错后,绑定引脚,下载测试。

其管脚分配如下:

 

六、实验结果及分析

下载测试,下载完毕,听到完整的一段《义勇军进行曲》音乐,并且音调很好,数码管显示没有错误。

频率折算中,由于频率计数不能是小数,采用了四舍五入的方法,所以得到的频率并不是十分精确的,但是不会影响结果。

附录

附录一

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityfdivis

port(clk:

instd_logic;

clk1:

outstd_logic;

clk2:

outstd_logic);--50MHz

endfdiv;

architecturebehaveoffdivis

signaltemp:

std_logic;--f=1/(2*(cnt+1))*f0

signaltemp1:

std_logic;--f=1/(2*(cnt+1))*f0

signalcnt1:

integerrange0to25;--1mhz

signalcnt2:

integerrange0to5000000;--5hz

begin

process(clk)--1mhz

begin

if(clk'eventandclk='1')then

if(cnt1=24)then

cnt1<=0;

temp<=nottemp;

else

cnt1<=cnt1+1;

endif;

endif;

endprocess;

clk1<=temp;

process(clk)--5hz

begin

if(clk'eventandclk='1')then

if(cnt2=4999999)then

cnt2<=0;

temp1<=nottemp1;

else

cnt2<=cnt2+1;

endif;

endif;

endprocess;

clk2<=temp1;

end;

附录二

LIBRARYieee;

USEieee.std_logic_1164.all;

LIBRARYaltera_mf;

USEaltera_mf.altera_mf_components.all;

ENTITYmusic_romis

PORT

address:

INSTD_LOGIC_VECTOR(8DOWNTO0);

inclock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(4DOWNTO0));

ENDmusic_rom;

ARCHITECTURESYNOFmusic_romIS

SIGNALsub_wire0:

STD_LOGIC_VECTOR(4DOWNTO0);

COMPONENTaltsyncram

GENERIC(

intended_device_family:

STRING;

width_a:

NATURAL;

widthad_a:

NATURAL;

numwords_a:

NATURAL;

operation_mode:

STRING;

outdata_reg_a:

STRING;

address_aclr_a:

STRING;

outdata_aclr_a:

STRING;

width_byteena_a:

NATURAL;

init_file:

STRING;

lpm_hint:

STRING;

lpm_type:

STRING

);

PORT(

clock0:

INSTD_LOGIC;

address_a:

INSTD_LOGIC_VECTOR(8DOWNTO0);

q_a:

OUTSTD_LOGIC_VECTOR(4DOWNTO0));

ENDCOMPONENT;

BEGIN

q<=sub_wire0(4DOWNTO0);

altsyncram_component:

altsyncram

GENERICMAP(

intended_device_family=>"Cyclone",

width_a=>8,

widthad_a=>9,

numwords_a=>512,

operation_mode=>"ROM",

outdata_reg_a=>"UNREGISTERED",

address_aclr_a=>"NONE",

outdata_aclr_a=>"NONE",

width_byteena_a=>1,

init_file=>"music.mif",

lpm_hint=>"ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=ROM",

lpm_type=>"altsyncram"

PORTMAP(clock0=>inclock,address_a=>address,q_a=>sub_wire0);

END;

附录三

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYautoplayIS

PORT(clk2:

INSTD_LOGIC;

index_auto:

OUTSTD_LOGIC_VECTOR(4DOWNTO0));

ENDautoplay;

ARCHITECTUREbehavOFautoplayIS

componentmusic_rom

PORT

address:

INSTD_LOGIC_VECTOR(8DOWNTO0);

inclock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(4DOWNTO0));

ENDcomponent;

SIGNALCQI:

STD_LOGIC_VECTOR(8DOWNTO0);

BEGIN

PROCESS(clk2)

BEGIN

IFclk2'EVENTANDclk2='1'THENCQI<=CQI+1;

ENDIF;

ENDPROCESS;

u1:

music_romPORTMAP(address=>CQI,q=>index_auto,inclock=>clk2);

END;

附录四:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entitytableis

port(index_auto:

inSTD_LOGIC_VECTOR(4DOWNTO0);

come:

outstd_logic_vector(7downto0);

seg:

outstd_logic_vector(7downto0);

tone:

outintegerrange0to1910);

end;

architecturesearchoftableis

begin

process(index_auto)

begin

caseindex_autois

when"00001"=>tone<=1910;come<="11111110";seg<="11111001";

when"00010"=>tone<=1701;come<="11111110";seg<="10100100";

when"00011"=>tone<=1516;come<="11111110";seg<="10110000";

when"00100"=>tone<=1431;come<="11111110";seg<="10011011";

when"00101"=>tone<=1275;come<="11111110";seg<="10010010";

when"00110"=>tone<=1135;come<="11111110";seg<="10010010";

when"00111"=>tone<=1011;come<="11111110";seg<="11111000";

when"01000"=>tone<=954;come<="11111101";seg<="11111001";

when"01001"=>tone<=850;come<="11111101";seg<="10100100";

when"01010"=>tone<=757;come<="11111101";seg<="10110000";

when"01011"=>tone<=715;come<="11111101";seg<="10011011";

when"01100"=>tone<=637;come<="11111101";seg<="10010010";

when"01101"=>tone<=567;come<="11111101";seg<="10010010";

when"01110"=>tone<=505;come<="11111101";seg<="11111000";

when"01111"=>tone<=477;come<="11111011";seg<="11111001";

when"10000"=>tone<=425;come<="11111011";seg<="10100100";

when"10001"=>tone<=378;come<="11111011";seg<="10110000";

when"10010"=>tone<=357;come<="11111011";seg<="10011011";

when"10011"=>tone<=318;come<="11111011";seg<="10010010";

when"10100"=>tone<=283;come<="11111011";seg<="10010010";

when"10101"=>tone<=252;come<="11111011";seg<="11111000";

whenothers=>tone<=0;come<="00000000";seg<="00000000";

endcase;

endprocess;

end;

附录五

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityfenpinis

port(clk1:

instd_logic;--1MHz

tone:

inintegerrange0to1910;

buzz:

outstd_logic);

end;

architecturebehaveoffenpinis

signalclk_data:

std_logic;

signali:

integerrange0to1910;

begin

yinpin:

process(clk1)

begin

if(clk1'eventandclk1='1')then

if(i=tone)then

i<=0;

clk_data<=notclk_data;

else

i<=i+1;

endif;

endif;

endprocessyinpin;--f=1/(2*(tone+1))*f0

buzz<=clk_data;

end;

附录六

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

entitytopis

port(clk:

instd_logic;

come_top:

outstd_logic_vector(7downto0);

seg_top:

outstd_logic_vector(7downto0);

spkout:

outstd_logic);

endtop;

architecturebehaveoftopis

componentfdiv

port(clk:

instd_logic;

clk1:

outstd_logic;--1mhz

clk2:

outstd_logic);--4hz

endcomponent;

componenttable

port(index_auto:

inSTD_LOGIC_VECTOR(4DOWNTO0);

come:

outstd_logic_vector(7downto0);

seg:

outstd_logic_vector(7downto0);

tone:

outintegerrange0to1910);

endcomponent;

componentautoplay

PORT(clk2:

INSTD_LOGIC;

index_auto:

OUTSTD_LOGIC_VECTOR(4DOWNTO0));

endcomponent;

componentfenpin

port(clk1:

instd_logic;--1MHz

tone:

inintegerrange0to1910;--输入分频系数

buzz:

outstd_logic);

endcomponent;

signalclk1_top:

std_logic;

signalclk2_top:

std_logic;

signalindex_auto_top:

std_logic_vector(4downto0);

signaltone_top:

integerrange0to1910;

begin

u1:

fdivportmap(clk=>clk,clk1=>clk1_top,clk2=>clk2_top);

u2:

tableportmap(index_auto=>index_auto_top,tone=>tone_top,come=>come_top,seg=>seg_top);

u3:

autoplayportmap(clk2=>clk2_top,index_auto=>index_auto_top);

u4:

fenpinportmap(clk1=>clk1_top,tone=>tone_top,buzz=>spkout);

endbehave;

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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