EDA音乐播放器分析.docx
《EDA音乐播放器分析.docx》由会员分享,可在线阅读,更多相关《EDA音乐播放器分析.docx(15页珍藏版)》请在冰点文库上搜索。
EDA音乐播放器分析
EDA技术及应用课程设计说明书
2013届电子信息工程专业1班级
题目音乐播放器
学号
姓名
指导教师
二О一五年6月25日
一、
音乐播放器基本原理
1硬件电子琴设计原理
乐曲演奏的原理是:
由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系在后面将给出。
所有不同频率的信号都是从一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数有不能为小数,故必须将计算得到的分频数进行向下取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。
如在48MHz时钟下,中音1(对应的频率值是523.3Hz)的分频系数应该为:
48000000/(2*523.3)=45863,这样只需对系统时钟进行45863次分频即可得到所要的中音M1(分频系数计算公式为D=F/2K,由于F/2K之后,会使分频系数D变小,所以功能模块中语句:
beep_r<=!
beep_r,使得输出取反,K=F/2count_end,消除了前面除以2K的影响)。
2乐曲自动演奏设计原理
硬件电路和自动演奏的原理同硬件电子琴实验原理类似。
至于其他音符,同样可由一式求出对应的分频系数。
在程序中设置一个状态机,每250ms改变一个状态(即一个节拍),组成乐曲的每个音符的频率值(音调)相对应于状态机的每一个状态。
只要让状态机的状态按顺序转换,就可以自动演奏播放音乐了。
《欢乐颂》乐曲的简谱如图所示:
3消抖原理
作为机械开关的键盘,在按键操作时,由于机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
由于这里是低电平表示按键按下,所以按键去抖动的关键在于提取稳定的低电平状态,虑除前沿、后沿抖动毛刺。
对于一个按键信号,可以用一个脉冲对他进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平按键信号。
继续取样的过程中如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。
二、音乐播放器的硬件设计
1顶层模块输入输出:
管脚说明:
输入:
时钟信号——clk,按键——[6:
0]key,功能切换键——key7
输出:
LED灯——[6:
0]led,蜂鸣器——beep;
Key0:
DOkey1:
REkey2:
MEkey3:
FAkey4:
SOL
key5:
LAkey6:
SIkey7:
功能切换键
2按键消抖模块
输入:
时钟信号——clk,功能切换键——key7
输出:
稳定脉冲信号
3电子琴模块
输入:
时钟信号——clk,按键——[6:
0]key,
输出:
LED灯——[6:
0]led,蜂鸣器——beep;
Key0:
DOkey1:
REkey2:
MEkey3:
FAkey4:
SOL
key5:
LAkey6:
SI
按下相应的键有对应LED灯指示。
4乐曲自动演奏模块
输入:
时钟信号——clk;
输出:
蜂鸣器——beep
三元器件列表:
序号
耗材名称
型号/规格
技术要求与参数
数量
单位
1
PCB制版
10cm*8cm
2层板
1
块
2
CPLD
EPM7064AELC44-10N
44引脚,PLCC封装
1
个
3
数码管
SR420401K1107
4位,共阴极,40mm*15mm
2
个
4
PLCC-44底座
通用
44引脚
1
个
5
钟振
方形
12MHz,4引脚
1
个
6
电阻
通用
200欧姆
8
只
7
电阻
通用
1K欧姆
14
只
8
电阻
通用
10K欧姆
10
只
9
电阻
通用
50欧姆
1
只
10
电容
104独石电容
0.1uF
6
只
11
电容
电解电容
50V,10uF
1
只
12
按键
通用
4引脚
4
只
13
发光二极管
通用
红色
3
只
14
发光二极管
通用
绿色
3
只
15
三极管
通用
NPN
9
只
16
双排插头
通用
10针
1
个
17
电源接插线
通用
含20cm电源线
1
对
三、音乐播放器的Verilog实现
1电子琴程序
modulebeep1(clk,key,beep,led);//模块名称beep
inputclk;//系统时钟48MHz
input[6:
0]key;//按键输入
outputbeep;//蜂鸣器输出端
output[6:
0]led;//LED输出
regbeep_r;//寄存器
reg[15:
0]count,count_end;
reg[6:
0]key_r;
reg[13:
0]a;//消抖寄存器
always@(posedgeclk)
begin
count<=count+1'b1;//计数器加1
if((count==count_end)&(!
(count_end==16'hffff)))
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//取反输出信号
end
end
always@(key)
begin
a=2000;//消抖等待时间
key_r=key;//取键值
case(key_r)
7'b1111110:
begin
while(a>0)
begin
a=a-1;
end
count_end=16'hb327;
while(a>0)
begin
a=a-1;
end
end
7'b1111101:
beginwhile(a>0)begina=a-1;endcount_end=16'h9fa0;while(a>0)begina=a-1;endend//中音2的分频系数值
7'b1111011:
beginwhile(a>0)begina=a-1;endcount_end=16'h8e32;while(a>0)begina=a-1;endend//中音3的分频系数值
7'b1110111:
beginwhile(a>0)begina=a-1;endcount_end=16'h8637;while(a>0)begina=a-1;endend//中音4的分频系数值
7'b1101111:
beginwhile(a>0)begina=a-1;endcount_end=16'h7794;while(a>0)begina=a-1;endend//中音5的分频系数值
7'b1011111:
beginwhile(a>0)begina=a-1;endcount_end=16'h6a88;while(a>0)begina=a-1;endend//中音6的分频系数值
7'b0111111:
beginwhile(a>0)begina=a-1;endcount_end=16'h5ee8;while(a>0)begina=a-1;endend//中音7的分频系数值
default:
beginwhile(a>0)begina=a-1;endcount_end=16'hffff;while(a>0)begina=a-1;endend
endcase
end
assignbeep=beep_r;//输出音乐
assignled=key_r;//输出按键状态
Endmodule
2乐曲自动演奏程序
modulesong(clk,beep,led);//模块名称
inputclk;//系统时钟48Mhz
outputbeep;//蜂鸣器输出端
output[7:
0]led;
regbeep_r;//寄存器
reg[7:
0]state;//乐谱状态机
reg[15:
0]count,count_end;
reg[23:
0]count1;
//乐谱参数:
D=F/2K(D:
参数,F:
时钟频率,K:
音高频率)
//以下是12MHZ晶振状态下的各音高对应的参数
/*parameterL_5=16'h3bca,//低音5
M_1=16'h2cc9,//中音1
M_2=16'h27f8,//中音2
M_3=16'h238c,//中音3
M_4=16'h218d,//中音4
M_5=16'h1de5,//中音5
M_6=16'h1aa2;//中音6
parameterTIME=3000000;//控制每一个音的长短(250ms)*/
//乐谱参数:
D=F/2K(D:
参数,F:
时钟频率,K:
音高频率)
parameterL_5=16'd61224,//低音5
M_1=16'd45863,//中音1
M_2=16'd40864,//中音2
M_3=16'd36402,//中音3
M_4=16'd34359,//中音4
M_5=16'd30612;//中音5
parameterTIME=12000000;//控制每一个音的长短(250ms)
assignbeep=beep_r;//输出音乐,蜂鸣器
always@(posedgeclk)
begin
count<=count+1'b1;//计数器加1
if(count==count_end)
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//输出取反
end
end
always@(posedgeclk)
begin
if(count1