实验课
:简易乐曲播放器
学院:
班级:
姓名:
学号:
班内序号:
一、设计课题要求...................................................................................................2
二、设计思路和总体框图........................................................................................2
三、分块电路设计 .................................................................................................4
四、仿真波形...........................................................................................................6
五、源程序..............................................................................................................7
六、功能说明.........................................................................................................20
七、所用元器件情况.............................................................................................20
八、故障及问题分析.............................................................................................21
九、总结和结论.....................................................................................................22
十、参考文献.........................................................................................................22
一 设计课题的任务要求
设计制作一个简易乐曲播放器:
1. 播放器内预存3 首乐曲;
2. 播放模式:顺序播放、随机播放,并用数码管或LED 显示当前播放模式;
顺序播放:按内部给定的顺序依次播放3 首乐曲;
随机播放:随机产生一个顺序播放3 首乐曲;
3. 用数码管显示当前播放乐曲的顺序号;
4. 设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;
5. 设置Next 和Previous 键,按Next 键可以听下一首,按Previous 键回到本首开始;
6. 选做:用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;
7. 选做:自拟其它功能。
二 设计思路和总体框图
设计思路:
组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素。
乐曲的12平均律
:每2个八度音之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每两个半音的频率比为2开12次方。另外,音符A(简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音符的频率,如下
所示。
产生各音符所需的频率可用分频器实现。本次实验使用的是MAXⅡ实验板,时钟频率为50MHz,计算出各个音符对应的分频系数,进行50%占空比的分频,即可得到各音符对应的频率。
对于节拍,如果将一拍的长度定为1秒,则1/4拍的时间为1/4秒,为其提供一个4Hz的时钟频率即可产生出1/4拍的效果了。若需要半拍,只需将该音符记录两次就可以了。产生节拍时钟也用分频器实现,本次实验中时钟频率为5Hz。
总体框图:
音
乐
播
放
音调
分频器
50MHz
时钟
顺序播放
节拍
分频器
随机播放
暂停/播放
状态判断
本首重放
下一首
单曲循环
上一首
图1:简易乐曲播放器总体结构框图
seq pau =10
MDS图:
随机播放
顺序播放
00
00
01
01
10
暂停
图2:状态转移图1
在顺序播放和随机播放模式下,有四种功能,如下图:
ne pre pr rep=0001
上一首
单曲循环
0100
0100
0001
1000
0010
0100
0001
1000
0010
1000
回到本首开始
下一首
0010
图3:状态转移图2
图:
开始
顺序播放
数码管显示曲目序号
N
是否随机播放?
Y
随机播放
判断按键
previous
present
next
repeat
pause
上一首
单曲循环
下
一
首
回到
本首
开始
暂停
or
播放
图4:简易音乐播放器流程图
三 分块电路设计
二分频
高1
四分频
中1
tune1
八分频
低1
二分频
高2
四分频
中2
tune2
八分频
低2
二分频
高3
四分频
中3
tune3
八分频
低3
二分频
高4
分频
四分频
50MHz
中4
tune4
八分频
低4
二分频
高5
四分频
中5
tune5
八分频
低5
二分频
高6
四分频
中6
tune6
八分频
低6
二分频
高7
四分频
中7
tune7
八分频
低7
图3—音调分频器
四 仿真波形
分频部分:
上图为分频部分程序的波形图,从图中可看出高中低音的频率分别呈2倍关系,例如高1的频率为中1频率的2倍,中1频率的2倍为低1的二倍。
整个程序:
present
previous
pause
repeat
pause
next
previous
next
repeat
顺序播放
随机播放
present
如上图:
1 顺序播放时,light1点亮,light2熄灭,三首曲子1-2-3顺序播放;随机播放时,light2点亮,light1,熄灭,由波形图看出,此次随机播放,乐曲3后接着的是乐曲1;
2 在顺序播放和随机播放两种情况下,当ne为1时,表示要播放下一曲,但蜂鸣器继续播放,当ne又回到0时,开始播放下一曲,数码管显示下一曲的序号;
3 在顺序播放和随机播放两种情况下,当pau为1时,表示暂停,蜂鸣器停止发声,数码管的显示保持不变,当pau回到0时,蜂鸣器继续发声,继续播放曲目;
4 在顺序播放和随机播放两种情况下,当pre为1时,表示要播放下一曲,但蜂鸣器继续播放,当ne又回到0时,开始播放下一曲,数码管显示下一曲序号;
5 在顺序播放和随机播放两种情况下,当rep保持为1时,进行单曲循环播放,数码管显示保持不变,当rep回到0时,取消单曲循环播放,本首乐曲播放完即播放下一曲;
6 在顺序播放和随机播放两种情况下,当pr为1时,表示回到本曲的开始,从头播放正在播放的曲子,数码管的显示保持不变。
备注:上述仿真图有些小,最后我附了一张仿真波形大图。
五 源程序
整个程序只有一个文件,分多个进程完成不同的功能。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity music_player is
port (clk: in std_logic; --主频50MHz
seq,ne,pre,pr,pau,rep:in std_logic;
--按键:随机,下一首,上一首,本首,开始,暂停,单曲循环
index0: out std_logic; --音频输出
seg: out std_logic_vector (6 downto 0);
--数码管显示序号
cat0: out std_logic_vector (5 downto 0);
--数码管位选
light1,light2: out std_logic);
--LED灯
end music_player;
architecture a of music_player is
signal clk0: std_logic; --节拍时钟
signal count0:integer range 0 to 198; --计数器
signal temp1, temp2, temp3, temp4, temp5, temp6, temp7 :integer range 0 to 23871; --分频系数
signal temp01,temp02,temp03,temp04,temp05,temp06,temp07:std_logic_vector(3 downto 0);
--占空比50%分频
signal tune1, tune2, tune3, tune4, tune5, tune6, tune7 :std_logic;
--初始频率(占空比不是50%)
signal tmp,qout:std_logic_vector(2 downto 0); --随机序列
begin
fre:process(clk) --初始分频:高音部分,占空比非50%
begin
if (clk'event and clk='1') then
if temp1=23871 then
temp1<=0;