fpga课设蜂鸣器音乐演奏.docx
- 文档编号:25499464
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:17
- 大小:132.61KB
fpga课设蜂鸣器音乐演奏.docx
《fpga课设蜂鸣器音乐演奏.docx》由会员分享,可在线阅读,更多相关《fpga课设蜂鸣器音乐演奏.docx(17页珍藏版)》请在冰豆网上搜索。
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fpga 蜂鸣器 音乐 演奏