音乐播放器课程设计报告
![音乐播放器课程设计报告](https://img.360docs.net/img66/0329lcp871gp220sb18r-61.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
长沙学院课程设计说明书
题目音乐播放器的设计
系(部) 电子与通信工程
专业(班级)
姓名
学号
指导教师
起止日期 2012-12-17至2012-12-28
EDA技术课程设计任务书
系(部):电子与通信工程系专业:电气工程及其自动化指导教师:
长沙学院课程设计鉴定表
目录
一、设计任务要求 ................................................................................................ - 5 -
1、课程设计题目 ............................................................................................. - 5 -
2、工程设计总述 ............................................................................................. - 7 -
二、选择器件 .......................................................................................................... - 7 -
三、功能模块 .......................................................................................................... - 7 -
1.分频器(div) ............................................................................................... - 7 -
2、计数器(notetabs)................................................................................... - 9 -
3、选择模块(choice)................................................................................. - 10 -
4、数据翻译模块(tontaba): .................................................................... - 12 -
5、译码器模块(deled) .............................................................................. - 13 -
6、数控分频器模块(speakera)................................................................ - 17 -
7、乐谱数据ROM(四个模块)................................................................. - 18 -
四、总体设计电路图 ............................................................................................ - 24 -
1、顶层设计的电路原理图 ........................................................................... - 24 -
2、顶层设计的仿真结果: ........................................................................... - 25 -
3、电路的顶层文件管脚分配图 ................................................................... - 25 -
五、心得体会 ........................................................................................................ - 25 -
音乐播放器课程设计
一、设计任务要求
1、课程设计题目
设计一个乐曲演奏电路,能够自动播放2首音乐。要求将音乐通过实验箱上的蜂鸣器播放出来,且可以倒计时,把时间在数码管上显示出来。
设计分析
(1)音乐播放器电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA 芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。
根据分频系数,可计算数控分频器得到的初始值。(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)
初始值的计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:
f为音阶对应的频率。
其中
m
(3)乐曲节奏的控制
一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。
(4)乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
2、工程设计总述
当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数所需的初始值,将初始值送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的8Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了。同时led
数码管会随着音乐显示相应的乐谱,3位led灯会随着高中低的频率,相应的闪烁。当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,这时用拨码开关选择播放的乐曲,拨码开关给选择器一个选择信号,即可选择相应的歌曲莫开中的数据进入数据翻译模块,播放出相应的歌曲,本工程选取了四首乐曲,以格雷码的形式编码,每次只变一位拨码开关,比较方便选择。分别为:
0001菊花台
0011世上只有妈妈好
0010一剪梅
0110隐形的翅膀
二、选择器件
1.EP1C20F324C8芯片
2.实验箱底板电路
(包括蜂鸣器
7段数码管
Led灯7个)
3.计算机
三、功能模块
1.分频器(div)
将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。
(1)模块图形:
(2)程序如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY div IS
PORT(
clk :IN STD_LOGIC;
CLK12MHz,CLK8Hz: OUT std_logic);
END div;
ARCHITECTURE one of div is
begin
nana:process(clk)
variable cnt:integer range 0 to 2;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=1 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK12MHz<=tmp;
end process nana;
nbnb:process(clk)
variable cnt:integer range 0 to 3125000;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=3124999 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK8Hz<=tmp;
end process nbnb;
end one;
(3)仿真波形:
(4)仿真波形分析
由波形可看出ckl为输入50MHz的时钟信号,ckl12输出为平12MHz的时钟信号,clk8为8Hz的时钟信号。
经分析该模块功能完全正确。
2、计数器(notetabs)
计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。用于选择rom模块中的地址。
(1)模块图像:
(2)程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY NOTETABS IS
PORT(CLK: IN STD_LOGIC;
COUNTER1 :inout STD_LOGIC_vector(7 downto 0));
END NOTETABS;
ARCHITECTURE a OF NOTeTABs IS
BEGIN
P1:PROCESS (CLK,COUNTER1)
BEGIN
IF COUNTER1=183 THEN
COUNTER1 <= "00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
COUNTER1 <= COUNTER1+1;
END IF;
END PROCESS;
END a;
(3)仿真波形:
(4)仿真波形分析
由波形可看出,CLK为输入时钟信号,八位输出二进制信号在每个时钟上升沿加一(这一点由counter[7]~counter[0]可以看出,而counter1由于某原因未能显示出,并不影响对该模块功能的判断)
经分析,该模块功能完全正确。
3、选择模块(choice)
选择器完成选择歌曲的功能。当a的信号为0001时将Q1的信号输出
为0011时将Q2的信号输出
为0010时将Q3的信号输出
为0110时将Q4的信号输出
(1)模块图像:
(2)程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY choice IS
PORT(a: IN STD_LOGIC_vector(3 downto 0);
b:out STD_LOGIC_vector(3 downto 0);
INDEX :OUT STD_LOGIC_vector(4 downto 0);
Q1:IN STD_LOGIC_vector(4 downto 0);
Q2:IN STD_LOGIC_vector(4 downto 0);
Q3:IN STD_LOGIC_vector(4 downto 0);
Q4:IN STD_LOGIC_vector(4 downto 0));
END choice;
ARCHITECTURE a OF choice IS
BEGIN
PROCESS (a,Q1,Q2,Q3,Q4)
BEGIN
CASE a IS
WHEN "0001" =>
b<="0001";
INDEX<=Q1;
WHEN "0011" =>
b<="0010";
INDEX<=Q2;
WHEN "0010" =>
b<="0011";
INDEX<=Q3;
WHEN "0110" =>
b<="0100";
INDEX<=Q4;
WHEN OTHERS =>
null;
END CASE;
END PROCESS;
END a;
(3)仿真波形:
(4)仿真波形分析
由波形可看出,当输入信号a为0010时输出信号b与q3信号相同(即播放q3的音乐),输出信号index与a相同(即音乐选取显示与音乐选取按键相同)
第二个波形图,当输入信号为0001时,同样可以看出这一点,因此该模块功能完全正确。
4、数据翻译模块(tontaba):
将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。
(1)模块图像:
(2)程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity tonetaba is
port(index:in std_logic_vector (4 downto 0);
code:out std_logic_vector(3 downto 0);
high0:out std_logic_vector(2 downto 0);
tone:out std_logic_vector(11 downto 0));
end;
architecture one of tonetaba is
begin
search:process(index)
begin
case index is
when"00000"=>tone<="111111111111";code<="0000";high0<="000";--0/4095 when"00001"=>tone<="011100011111";code<="0001";high0<="001";--L1/1823 when"00010"=>tone<="100000001111";code<="0010";high0<="001";--L2/2063 when"00011"=>tone<="100011110010";code<="0011";high0<="001";--L3/2291
when"00100"=>tone<="100101010101";code<="0100";high0<="001";--L4/2390 when"00101"=>tone<="101000010000";code<="0101";high0<="001";--L5/2576 when"00110"=>tone<="101010111000";code<="0110";high0<="001";--L6/2745 when"00111"=>tone<="101101001011";code<="0111";high0<="001";--L7/2891 when"01000"=>tone<="101110001111";code<="0001";high0<="010";--M1/2960 when"01001"=>tone<="110000001001";code<="0010";high0<="010";--M2/3082 when"01010"=>tone<="110001111001";code<="0011";high0<="010";--M3/3193 when"01011"=>tone<="110010101100";code<="0100";high0<="010";--M4/3244 when"01100"=>tone<="110100001001";code<="0101";high0<="010";--M5/3337 when"01101"=>tone<="110101011100";code<="0110";high0<="010";--M6/3420 when"01110"=>tone<="110110100101";code<="0111";high0<="010";--M7/3494 when"01111"=>tone<="110111000111";code<="0001";high0<="100";--H1/3528 when"10000"=>tone<="111000000101";code<="0010";high0<="100";--H2/3589 when"10001"=>tone<="111000111100";code<="0011";high0<="100";--H3/3645 when"10010"=>tone<="111001010110";code<="0100";high0<="100";--H4/3670 when"10011"=>tone<="111010000100";code<="0101";high0<="100";--H5/3717 when"10100"=>tone<="111010101101";code<="0110";high0<="100";--H6/3758 when"10101"=>tone<="111011010010";code<="0111";high0<="100";--H7/3795
when others=>null;
end case;
end process;
end;
(3)仿真波形:
(4)仿真波形分析
由波形可看出,当输入信号index为00110时high0显示1,code显示6(即中音6),预置初值为101010111000,查询上文所列的表,可发现功能完全正确。
第二个波形图,输入信号00010,输出为中音2,再查预置初值,同样可发现完全正确。
因此该模块功能完全正确。
5、译码器模块(deled)
通过2次分频,将播放音乐的时间显示在数码管上。
(1)模块图像
(2)程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity deled is
port(rst,clk:in std_logic; --50Mhz
ledsel:out std_logic_vector(3 downto 0);--weixuan
led:out std_logic_vector(6 downto 0));
end deled;
architecture fun of deled is
signal fen,miao:std_logic_vector(7 downto 0);
signal scan_cnt:std_logic_vector(1 downto 0);
signal disp_data:std_logic_vector(3 downto 0);
signal clk_1hz,clk_200hz:std_logic;
begin
--fenpin get the 1hz signal
process(clk)
variable cnt:integer range 0 to 25000000;
begin
if clk'event and clk='1' then
if cnt<25000000 then
cnt:=cnt+1;
else
cnt:=0;
clk_1hz<=not clk_1hz;
end if;
end if;
end process;
--fenpin get the display scan freq
process(clk)
variable cnt:integer range 0 to 250000;
begin
if clk'event and clk='1' then
if cnt<125000 then
cnt:=cnt+1;
else
cnt:=0;
clk_200hz<=not clk_200hz;
end if;
end if;
end process;
--daojishi
process(clk_1hz)
begin
if rst='1' then
fen<="00000001";--default 1fen
miao<="01011001";--default 59s
elsif clk_1hz'event and clk_1hz='1' then
if miao(3 downto 0)>0 then
miao(3 downto 0)<=miao(3 downto 0)-1;
else
miao(3 downto 0)<="1001";--9
if miao(7 downto 4)>0 then
miao(7 downto 4)<=miao(7 downto 4)-1;
else
miao(7 downto 4)<="0101";
if fen(3 downto 0)>0 then
fen(3 downto 0)<=fen(3 downto 0)-1;
else
fen(3 downto 0)<="1001";--9
if fen(7 downto 4)>0 then
fen(7 downto 4)<=fen(7 downto 4)-1;
else
fen(7 downto 4)<="0101";
end if;
end if;
end if;
end if;
end if;
end process;
--display cnt
process(clk_200hz)
begin
if clk_200hz'event and clk_200hz='1' then
scan_cnt<=scan_cnt+1; ----scan
end if;
end process;
--disp for weixuan and data select
process(scan_cnt)
begin
case scan_cnt is
when "00"=>ledsel<="0001";disp_data<=miao(3 downto 0);
when "01"=>ledsel<="0010";disp_data<=miao(7 downto 4);
when "10"=>ledsel<="0100";disp_data<=fen(3 downto 0);
when "11"=>ledsel<="1000";disp_data<=fen(7 downto 4);
when others=>null;
end case;
end process;
--disp yima
process(disp_data)
begin
case disp_data is
when "0000"=>led<="1000000";--0
when "0001"=>led<="1111001";--1
when "0010"=>led<="0100100";--2
when "0011"=>led<="0110000";--3
when "0100"=>led<="0011001";--4
when "0101"=>led<="0010010";--5
when "0110"=>led<="0000010";--6
when "0111"=>led<="1111000";--7
when "1000"=>led<="0000000";--8
when "1001"=>led<="0010000";--9
when others=>null;
end case;
end process;
end fun;
(3)仿真波形
如波形可以看出,此功能实现了倒计时功能。
6、数控分频器模块(speakera)
(1)模块图像:
(2)程序如下:
LIBRARY IEEE;--音乐符数控分频电路模块
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Speakera IS
PORT ( clk : IN STD_LOGIC;--音调频率信号12MHZ
Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);--音乐符对应分频11位
SpkS : OUT STD_LOGIC );--声音输出
END;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC;
BEGIN
DivideCLK : PROCESS(clk)
VARIABLE Count8 : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
BEGIN
-- 将CLK进行16分频,PreCLK为CLK的16分频
IF clk'EVENT AND clk = '1' then
if Count8>7 THEN PreCLK <= not PreCLK; Count8 := "0000";
else Count8:=Count8+1;
end if;
end if;
END PROCESS;
GenSpkS : PROCESS(PreCLK, Tone)-- 11位可预置计数器
VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0);
BEGIN
IF PreCLK'EVENT AND PreCLK = '1' THEN
IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1';
ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF;
END IF;
END PROCESS;
DelaySpkS : PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音
VARIABLE Count2 : STD_LOGIC;
BEGIN
IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT Count2;
IF Count2 = '1' THEN SpkS <= '1';
ELSE SpkS <= '0'; END IF;
END IF;
END PROCESS;
END;
(3)仿真波形:
将波形放大来看:
(4)仿真波形分析
此波形仿真分析比较复杂,如果由于输入信号为12MHz,得到如上的仿真波形图,发现数控分频功能完全正确。
7、乐谱数据ROM(四个模块)
四首音乐的rom数据以及rom的定制过程。
(1)rom数据程序:
①菊花台:
WIDTH=5;
DEPTH=256; ADDRESS_RADIX=UNS; DATA_RADIX=UNS; CONTENT BEGIN
[0..2] : 10;
3 : 9;
[4..5] : 10; [6..7] : 0;
8 : 10;
9 : 12;
10 : 10;
11 : 9;
[12..15] : 10;
[16..18] : 8; 19 : 9;
20 : 10;
21 : 12;
[22..23] : 10;
[24..26] : 9;
27 : 8;
[28..31] : 9;
[32..34] : 10;
35 : 12;
36 : 13;
[37..39] : 12;
40 : 13;
[41..42] : 12;
43 : 10;
[44..46] : 12;
47 : 5;
[48..49] : 10;
[50..51] : 9;
[52..53] : 12;
54 : 10; [155..58] : 9;
59 : 8;
[60..63] : 9;
[64..66] : 10;
67 : 9;
[68..72] : 10;
73 : 12;
74 : 10;
75 : 9;
[76..79] : 10;
[80..82] : 8;
83 : 9;
84 : 10;
85 : 12;
[86..87] : 10;
[88..90] : 9; 91 : 8;
[92..95] : 9; [96..98] : 10;
99 : 12;
100 : 13; [101..103] : 12; 104 : 13; [105..106] : 12; 107 : 10; [108..111] : 12; 112 : 0;
113 : 10;
114 : 9;
115 : 10; [116..117] : 12; 118 : 10; [119..120] : 9; [121..125] : 8; [126..127] : 0; end;
②世上只有妈妈好:
WIDTH=5;
DEPTH=256; ADDRESS_RADIX=DEC; DATA_RADIX=DEC; CONTENT BEGIN
00:13;
01:13;
02:13;
03:13;
04:13;
05:13;
06:13;
07:12;
08:12;
09:10;
10:10;
11:10;
12:10;
13:12;
14:12; 15:12;
16:12;
17:15;
18:15;
19:15;
20:15;
21:13;
22:13;
23:12;
24:12;
25:13;
26:13;
27:13;
28:13;
29:13;
30:13;
31:13;
32:13;
33:10;
34:10;
35:10;
36:10;
37:12;
38:12;
39:13;
40:13;
41:12;
42:12;
43:12;
44:12;
45:10;
46:10;
47:10;
48:10;
49: 8;
50: 8;
51: 6;
52: 6;
53:12;
54:12;
55:10;
56:10;
58: 9; 59: 9; 60: 9; 61: 9; 62: 9; 63: 9; 64: 9; 65: 9; 66: 9; 67: 9; 68: 9; 69: 9; 70: 9; 71:10; 72:10; 73:12; 74:12; 75:12; 76:12; 77:12; 78:12; 79:13; 80:13; 82:10;
83:10;
84:10;
85: 9;
86: 9;
87: 9;
88: 9;
89: 8;
90: 8;
91: 8;
92: 8;
93: 8;
94: 8;
95: 8;
96: 8;
97:12;
98:12;
99:12;
100:12;
101:12;
102:12;
103:10;
104:10;
106: 9;
107: 8;
108: 8;
109: 6;
110: 6;
111: 8;
112: 8;
113: 5;
114: 5;
115: 5;
116: 5;
117: 5;
118: 5;
119: 5;
120: 5;
121: 5;
122: 5;
123: 5;
124: 5;
125: 0;
126: 0;
127: 0;
END;
③一剪梅
WIDTH=5;
DEPTH=256; ADDRESS_RADIX=DEC; DATA_RADIX=DEC; CONTENT BEGIN
00: 6;
01: 6;
02: 6;
03: 6;
04:10;
05:10;
06:10;
07:10;
08:10;
09:10; 10: 9;
11: 8;
12: 7;
13: 7;
14: 8;
15: 8;
16: 7;
17: 7;
18: 5;
19: 5;
20: 6;
21: 6;
22: 6;
23: 6;
24: 6;
25: 6;
26: 6;
27: 6;
28: 6;
29: 6;
30: 6;
31: 6;
32: 6;
33: 9;
34: 6;
35: 6;
36: 6;
37: 7;
38: 7;
39: 7;
40: 7;
41: 7;