整理fpga课设蜂鸣器音乐演奏文档格式.docx
- 文档编号:21757102
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:129.93KB
整理fpga课设蜂鸣器音乐演奏文档格式.docx
《整理fpga课设蜂鸣器音乐演奏文档格式.docx》由会员分享,可在线阅读,更多相关《整理fpga课设蜂鸣器音乐演奏文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的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:
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+1;
endif;
endif;
endprocess;
clk1<
=temp;
process(clk)--5hz
if(cnt2=4999999)then
cnt2<
temp1<
=nottemp1;
cnt2<
=cnt2+1;
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:
numwords_a:
operation_mode:
outdata_reg_a:
address_aclr_a:
outdata_aclr_a:
width_byteena_a:
init_file:
lpm_hint:
lpm_type:
STRING
);
PORT(
clock0:
address_a:
q_a:
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=>
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
ENDcomponent;
SIGNALCQI:
STD_LOGIC_VECTOR(8DOWNTO0);
PROCESS(clk2)
IFclk2'
EVENTANDclk2='
THENCQI<
=CQI+1;
ENDIF;
ENDPROCESS;
u1:
music_romPORTMAP(address=>
CQI,q=>
index_auto,inclock=>
clk2);
附录四:
entitytableis
port(index_auto:
inSTD_LOGIC_VECTOR(4DOWNTO0);
come:
outstd_logic_vector(7downto0);
seg:
tone:
outintegerrange0to1910);
architecturesearchoftableis
process(index_auto)
caseindex_autois
when"
00001"
=>
tone<
=1910;
come<
="
11111110"
;
seg<
11111001"
00010"
=1701;
10100100"
00011"
=1516;
10110000"
00100"
=1431;
10011011"
00101"
=1275;
10010010"
00110"
=1135;
00111"
=1011;
11111000"
01000"
=954;
11111101"
01001"
=850;
01010"
=757;
01011"
=715;
01100"
=637;
01101"
=567;
01110"
=505;
01111"
=477;
11111011"
10000"
=425;
10001"
=378;
10010"
=357;
10011"
=318;
10100"
=283;
10101"
=252;
whenothers=>
=0;
00000000"
endcase;
附录五
entityfenpinis
port(clk1:
--1MHz
inintegerrange0to1910;
buzz:
architecturebehaveoffenpinis
signalclk_data:
signali:
integerrange0to1910;
yinpin:
process(clk1)
if(clk1'
eventandclk1='
if(i=tone)then
i<
clk_data<
=notclk_data;
=i+1;
endprocessyinpin;
--f=1/(2*(tone+1))*f0
buzz<
=clk_data;
附录六
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitytopis
port(clk:
come_top:
seg_top:
spkout:
endtop;
architecturebehaveoftopis
componentfdiv
--4hz
endcomponent;
componenttable
componentautoplay
componentfenpin
--输入分频系数
signalclk1_top:
std_logic;
signalclk2_top:
signalindex_auto_top:
std_logic_vector(4downto0);
signaltone_top:
integerrange0to1910;
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 蜂鸣器 音乐 演奏