当前位置:文档之家› 简单音乐播放器数电实验

简单音乐播放器数电实验

数字电路与逻辑设计综合设计实验报告
实验名称:简易音乐播放器
姓名:
班级: 班
班内序号:27
一、设计任务要求
设计制作一个简易乐曲播放器。
1)播放器内预存3首乐曲;
2)播放模式:顺序播放、随机播放,并用数码管或LED显示当前播放模式;
3)顺序播放:按内部给定的顺序依次播放3首乐曲;
4)随机播放:随机产生一个顺序播放3首乐曲;
3)Keycontrol模块:(时钟用的是未经分频的)
顺序播放:
可以看出,在mode=0,即顺序播放模式下,在没有按任何键时,音符计数器counter随时钟自动加1从而进入下一个音。Sequential表示顺序播放,random表示随机播放,由图可见此时sequential为高电平,random为低电平,可知此时为顺序播放状态。
);
end component;
component speaker
port(
clk1mhz,ppsymbol:in std_logic;
tonefreq:in integer range 0 to 1516 ;
sound:out std_logic
);
end component;
component shownumber
counter由144自动变到145是第一首播完自动到第二首
下一首:
当按一下一首键时,即nextone变为高电平,音符计数器counter由第一首歌的14变到了第二首歌开始音符所对应的数145,实现了切换到下一首的功能。
本首重放:
当播放到第二首歌的152时,按下了本首重放键,即previous变为高电平,这时counter变为第二首歌起始音对应的数145,进而实现了本首重放的功能。
暂停后再按“播放/暂停”键:
在暂停态再按一次播放/暂停键后,即pp再次变为高电平,ppout变为低电平,对应的LED会熄灭表示进入了播放状态,ppsymbol也变为低电平。
暂停后按下一首:
按了暂停键之后,即pp变为高电平之后,又按了下一首键,即nextone变为高电平,这时进入播放状态,同时counter变成了下一首歌的第一个音符对应的值,实现了通过按下一首退出暂停状态,同时进行歌曲的切换。
随机播放状态下按上一首:
按了上一首(lastone变为高电平)后,据随机数randnumber的值3,于是转入播放第三首。
按下一首:
和按上一首是一样的,也是根据当前randnumber值来确定下一首要播的是哪一首。Randnumber等于1、2、3、4分别对应第一、二、三、四首歌。
按本首重放:
随机播放模式下按本首重放,即previous变为高电平,实现的功能与在顺序播放模式是一样的。由图可见,播放到第一首的10时,counter变为1,即回到第一首的第一个音开始播。
sequential,random,ppout,sound:out std_logic;
col,row,number:out std_logic_vector(7 downto 0);
enable:out std_logic_vector(5 downto 0)
);
end player;
architecture one of player is --子模块定义
signal randnumber:integer range 1 to 4;
signal counter:integer range 1 to 400;
signal toneindex:integer range 0 to 13;
signal tonefreq:integer range 0 to 1516 ;
);
end component;
component keycontrol
port(
lastone,previous,nextone,pp,mode,reset,clk2hz,clk4hz:in std_logic;
randnumber:in integer range 1 to 4;
sequential,random,ppout,ppsymbol:out std_logic;
Begin --各模块间端口的连接
u1:div1 port map(clk50mhz=>clk50mhz,clk1mhz=>clk1mhz);
u2:div2 port map(clk1mhz=>clk1mhz,clk4hz=>clk4hz);
u3:div3 port map(clk1mhz=>clk1mhz,clk2hz=>clk2hz);
暂停后按上一首:
暂停后按上一首,即pp变为高电平后lastone也变为高电平,则进入播放状态,并且开始播上一首。(信号counter中158对应的是第二首的音符,1对应的是第一首的音符)
暂停后按本首重放:
暂停后按本首重放,即pp变为高电平后previous也变为高电平,这时进入播放状态,另外counter变为本首歌第一个音对应的数,实现了本首重放。
上一首:
当播放到第二首对应counter为151时,按下了上一首键,即lastone变为高电平,counter变为第一首歌起始音符所对应的值1,从而实现了切换到上一首的功能。
暂停:
当按下暂停键后,即pp变为高电平,暂停状态的标志ppsymbol就变为高电平,用于送给LED显示播放/暂停态的ppout变为周期信号,实际中周期为1s,即LED会在1s内一亮一灭进行闪烁,表示进入了暂停状态。
复位:
复位所要实现的是不管是在顺序播放还是随机播放状态下,只要一按下复位键,就从第一首歌开始播放。如图,counter等于272时reset变为高电平,counter变为1。
随机播放:
在随机播放状态,即mode=1时,在第一首歌的最后一个音(counter为144时)时程序会检测随机数randnumber的值,查到是3,于是下一次counter就变为第三首歌第一个音对应的数213,从而实现了随机播放。此时random为高电平,sequential为低电平,表示此时为随机播放状态。
component div1
port(
clk50mhz:in std_logic;
clk1mhz:out std_logic
);
end component;
comபைடு நூலகம்onent div2
port(
clk1mhz:in std_logic;
clk4hz:out std_logic
);
end component;
component index
port(
toneindex:in integer range 0 to 13;
tonefreq:out integer range 0 to 1516 ;
row:out std_logic_vector(7 downto 0);
col:out std_logic_vector(7 downto 0)
2)总体框图
3)分块设计
共分为9个模块。Div1,div2,div3都是用来分频的,分别是将50mhz变为1mhz,将1mhz变为4hz,将1mhz变为2hz。Rand模块用来产生随机数,用于随机播放模式。Keycontrol是核心模块,用来实现顺序播放、随机播放、播放/暂停、上一首、下一首、本首重放、复位、显示顺序或随机播放状态、显示播放/暂停态。Melody模块是将音符计数器的每一个值与一个音高相对应,即记录曲谱。Index模块是用melody模块传来的音高信号通过查表得到它所对应的音高的分频数,然后将这个分频数送给speaker模块,以发出不同的音,另外对应不同的音它还对点阵进行不同的输出,进而显示出音高。Speaker模块接收index模块送来的分频数,利用分频数对时钟信号进行分频,进而发出不同的音,另外它还接收keycontrol模块送来的暂停态的标志,以保证在暂停态的时候不发出声音。Shownumber模块通过对音符计数器值的判断确定现在播放的是哪首歌,进而输出不同的歌曲号。
3、仿真波形及波形分析
1)div1模块
由仿真结果可看出,它将50mhz的时钟信号变换为1mhz。Div2和div3模块分别是将1mhz变为4hz,将1mhz变为2hz,原理相同,因而不再列出仿真结果。
2)Rand模块
由仿真结果可以看出在每一个时钟周期内,randnumber改变一次,randnumber可作为随机数的产生信号。
counter:out integer range 1 to 400
);
end component;
component melody
port(
counter:in integer range 1 to 400;
toneindex:out integer range 0 to 13
);
end component;
四、主要部分源程序
1)外围模块player
library ieee;
use ieee.std_logic_1164.all;
entity player is
Port --整个系统对外的输入输出端口
(
clk50mhz,reset,lastone,previous,nextone,pp,mode:in std_logic;
5)用数码管显示当前播放乐曲的顺序号;
6)设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;
7)设置Next和Previous键,按Next键可以听下 一首,按Previous键回到本首开始;
8)选做:用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;
9)选做:自拟其它功能。
port(
counter:in integer range 1 to 400;
相关主题