COLD音乐播放器综合项目实践报告分析.docx
《COLD音乐播放器综合项目实践报告分析.docx》由会员分享,可在线阅读,更多相关《COLD音乐播放器综合项目实践报告分析.docx(19页珍藏版)》请在冰点文库上搜索。
COLD音乐播放器综合项目实践报告分析
常州信息职业技术学院
可编程逻辑器件开发应用
综合项目设计报告
2015—2016学年第二学期
项目:
音乐播放器的设计与实现
班级:
计应142
学号:
1408143209
姓名:
顾杉
授课教师:
聂章龙
制定日期:
2015年06月24日
一、总体设计(项目总体分析)
1、基本功能
基于VerilogHDL的音乐播放器系统是以ALTERA公司的MAXⅡ系列芯片EPM1270T144C5为主控单元,根据音乐发生的原理,将复杂可编程逻辑器件作为发生音乐的核心器件,用高速集成电路硬件描述语言VerilogHDL编程控制音乐发生的乐谱,配合周边硬件电路,由蜂鸣器发声器件发出音乐声,实验表明,采用该方法设计的音乐发生器成本低、修改方便。
基于VerilogHDL的音乐播放器实现的功能主要有在4位动态数码管上显示音乐播放的时间,在8*8点阵屏上显示相应歌曲的名字(汉语拼音或英文字母),在1位静态数码管上显示高(H)、中(Z)、低(L)音调,并且利用8个小灯的亮灭来标识相应的音符(音符是几就亮第几盏小灯),通过开始/暂停按键控制音乐的开始、暂停,通过乐曲选择按键控制音乐的选择,选择时单个数码管上显示歌曲编号,如选择“兰花草”时,显示0。
交流蜂鸣器为了增加I/O口的驱动能力采用了NPN型晶体管,这样只要在基极BUZZ上输入一定频率的脉冲,蜂鸣器BUZZ就会发出悦耳的音乐。
乐曲演奏的原理是这样的:
组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的两个基本数据。
所以只要控制输出到扬声器信号的频率高低和该频率信号持续的时间就可以演奏出不同的音乐,频率的高低决定了音调的高低,而乐曲的简谱与各个音名有各自的对应关系,所有不同频率的信号都是从同一个基准频率分频得到的,由于音阶频率多为非整数,而分频系数又不能为小数,所以必须将计算得到的分频进行四舍五入取整,基准频率和分频系数应综合考虑加以选择从而保证音乐不会走调。
由于蜂鸣器具有控制简单及声响悦耳的特点,在工程项目中,常用作人机接口的重要输出设备,用以发出语音提示信息,使系统更加完善和使用。
蜂鸣器有交流和直流两种,直流蜂鸣器驱动简单,只要在二号引脚上加上直流电源它就会发出一定频率的声音,此时声音的音调和音量是固定的,而交流蜂鸣器在这方面则显得比较灵活,输入的声音信号的频率和音长可以由用户控制,因此输出的声响可以是多样的。
简谱中的音名与频率是一一对应的,因此要发出某一声乐,只需要输出该声乐所对应的频率信号就可以了,在实验板上已经为我们准备了键盘K1~K8和一个蜂鸣器BUZZ,所以完全可以用它们来实现一个简单的电子琴,为了产生一定的频率信号,我们还需要用到有源时钟clock,并且把它作为乐曲的基准频率,而所有不同的频率信号都是从这一基频分频而来的,比如在24MHz的时钟下,中音1(对应的频率值为523.3Hz)的分频系数应该是:
24*10的六次方/(523.3*2)=0x5993。
通过对有关蜂鸣器的设计案例的学习,基本上对分频和控制交流蜂鸣器发声有了一定的了解,所以在此基础上,设计音乐片段是对分频和蜂鸣器发声的综合应用,需要处理好各种简谱的播放顺序及音长。
程序设计时应该注意按键去抖动计数,注意分模块去设计每个模块并且注意模块与模块之间的关系。
在这个项目中我们还用到了汉字的显示,通过以前学习的点亮显示屏的例子,我们队LED点阵显示屏的内部结构、工作原理、驱动和编程方法有了一定的了解,同样,LED点阵显示屏可以显示汉字或字符,只是此时的汉字或字符应该以点阵的形式来表示,取点越多,汉字或字符也将越逼真,通常8*8的点阵显示屏可以用来显示一些简单的汉字。
首先把要显示的(8*8)汉字用二进制代码来表示,这一过程称之为取字模。
这样,在程序中才用逐行扫描的方法扫描整个点阵,当然在扫描对应行的同时在段码线输出对应的字模数据,于是该行的相应点被点亮。
虽然汉字是被逐行显示的,但是由于人眼的视觉差,且只要扫描速度足够快,所以看到的将还是一个完整的汉字。
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。
由于最大的分频系数为5102,故采用13位二进制计数器已能满足分频要求。
在表中可以看到不同音阶对应的不同初始值。
对于不同的分频系数,只要加载不同的初始值即可。
采用加载初始值而不将分频输出译码反馈,可以有效地减少设计占用可编程逻辑器件的资源。
“0”表示休止符,在很多音乐中,休止符也是一个重要的音符。
对于休止符,只要将分频系数设为0,扬声器就不会发声了。
总体来说,要设计好这个项目首先要可以做出输出警报声,要了解蜂鸣器引脚与ERM1270T144C5N芯片的引脚的连接关系,理解交流蜂鸣器的工作原理及外围驱动电路,其次要能做出熟悉电子琴的设计,数字电子琴的设计需要掌握时钟分频的方法,掌握键盘与不同音频的对应关系,左右要能做出音乐播放器的设计,需要掌握交流蜂鸣器的综合应用,而能把这些结合起来尤为重要,运用我们前面所学的知识把这几块结合起来,就能设计出音乐播放器综合项目。
2、功能框图
调用:
fenpin();//分频函数,对24MHz的信号进行分频
jianpu();//要播放的音乐的简谱
yanzou();//让蜂鸣器发出声音
shanshuo();//让简谱上的数字在led小灯上显示出来
xianshi();//显示音乐名称
counttime(sec,key,min);//计时函数
3*功能模块关系图
音名、频率和分频系数对照表
2、软件设计
1、顶层模块(modulemusic())
(1)定义时钟输入、键盘输入口;
(2)定义声响输出口,定义位码输出口、数据输出口和数码管输出口,;
(3)调用函数,分别为以下几个模块:
①分频模块(对24MHz的信号进行分频):
●fenpin(clk,k,shift,clk_4Hz,key,con,swt,sec,shiftout,shift_out);
//分频函数,对24MHz的信号进行分频
②简谱、演奏模块(要播放的音乐的简谱、让蜂鸣器发出声音):
●jianpu(clk_4Hz,key,count_end,high,med,low,shiftout,shift_out);//要播放的音乐的简谱
●yanzou(clk,buzzout,count_end,key);
//让蜂鸣器发出声音
③闪烁模块(让简谱上的数字在led小灯上显示出来):
●shanshuo(high,med,low,out,clk,cmd,sled_reg,sl_reg,min,shiftout,shift_out);
//让简谱上的数字在led小灯上显示出来
④显示模块(显示音乐名称):
●xianshi(con,swt,x,y,key,shiftout);//显示音乐名称
⑤计时模块(计时函数)
●counttime(sec,key,min);//计时函数
2、分频模块(fenpin();)
*分频函数,对24MHz的信号进行分频:
(1)定义时钟输入和键盘输出;
(2)分频4Hz,按键延时,行扫描计数,显示名称的间隔时间;
(3)从24MHZ分频出1HZ(即周期为1S)信号,到0.5S后清零,取反1S信号;
(4)按键去抖动,按键计数。
主要函数:
always@(posedgeclk)
begin
……;
if(count==25'd3000000)//分频4Hz
……;
if(count1==19'd240000)//按键延时
……;
if(count2==19'd24000)//行扫描计数
……;
if(count3==24'd12000000)//显示名称的间隔时间
……;
end
always@(posedgeclk)//从24MHZ分频出1HZ(即周期为1S)信号
……
always@(posedgeset)//按键去抖动
……;
always@(negedgekey)//按键计数
……;
endmodule
3、简谱、演奏模块(要播放的音乐的简谱、让蜂鸣器发出声音)
以1/16音符为最小计数单元,而这个音符所占用的时间理论值为0.25s,所以我们在外部接入4Hz的时钟信号给计数器,已满足正常的音乐播放要求。
*音乐播放器分频模块:
分频4Hz信号。
(1)由基准时钟分频获得4Hz信号;
(2)控制交流蜂鸣器发各种音谱声;
(3)key按键按下方可计数;
(4)简谱对应高中低音及其数值;
*音乐播放器控制模块:
控制音乐播放的音频与顺序。
(1)分频得到相应简谱的频率;
(2)乐曲演奏控制。
注意:
always@(posedgeclk)
begin
count=count+1;
if(count==count_end&&key==1)
//计数到指定的数值并且允许播放的时候才能发声
begin
count=0;
buzzout=~buzzout;//产生一个高低电平蜂鸣器发声
end
end
4、闪烁模块(音符显示模块)(shanshuo();)
*让简谱上的数字在led小灯上显示出来,音乐名称显示模块:
在8*8点阵屏上显示相应歌曲的名字(汉语拼音或英文字母)。
*音符显示模块:
在1位静态数码管上显示高(H)、中(Z)、低(L)音调,并且利用8个小灯的亮灭来标识相应的音符(音符是几就亮第几盏小灯)
主要函数:
always@(count[11:
10])
begin
case(count[11:
10])
2'h0:
ledbuf=min[3:
0];//取秒的个位数据
2'h1:
ledbuf=min[7:
4];//取秒的十位数据
2'h2:
ledbuf=min[11:
8];//取分的个位数据
2'h3:
ledbuf=min[15:
12];//取分的十位数据
endcase
case(count[11:
10])//送对应位的位码
……//扫描最高位
endcase
end
always@(ledbuf)//时间显示
begin
case(ledbuf)
……
endcase
//if((count[11:
10]==2'b10)&sec)
//sled_reg=sled_reg&8'h7f;//小数点闪烁
end
音符显示模块程序框图:
否
否
是
是
5、显示模块(显示音乐名称):
xianshi(con,swt,x,y,key,shiftout);//显示音乐名称
*音符显示模块:
在1位静态数码管上显示高(H)、中(Z)、低(L)音调,并且利用8个小灯的亮灭来标识相应的音符(音符是几就亮第几盏小灯)
(1)允许播放音乐时点阵屏开始扫描;
(2)不播放音乐时点阵不扫描;
(3)显示歌名YDYAN
(4)输出对应的点阵信息;
主要函数:
always@(con)
begin
if(key==1'b1)//允许播放音乐时点阵屏开始扫描
case(con)
……;
endcase
else
x=8'hff;//不播放音乐时点阵不扫描
6、计时模块(计时函数)
counttime(sec,key,min);//计时函数
(1)计时处理,是否计时开始;
(2)秒加1;
(3)秒的十位数据加1;
(4)分的个位数据位加1;
(5)分的十位数据位加1。
主要函数:
always@(posedgesec)//计时处理
begin
if(key)//计时开始吗
begin
min=min+1;//秒加1
if(min[3:
0]==4'ha)
begin
min[3:
0]=4'h0;
min[7:
4]=min[7:
4]+1;//秒的十位数据加1
if(min[7:
4]==4'h6)
begin
min[7:
4]=4'h0;
min[11:
8]=min[11:
8]+1;//分的个位数据位加1
if(min[11:
8]==4'ha)
begin
min[11:
8]=4'h0;
min[15:
12]=min[15:
12]+1;//分的十位数据位加1
if(min[15:
12]==4'ha)
min[15:
12]=4'h0;
……
end
计时模块程序框图
否
否
是
是
否
是
否
是
否
三、程序测试(调试过程中出现的错误及解决办法)
本次设计采用的是Aletra公司的MAX II系列,因此,必须用Quartus II软件系列才能对该芯片进行编译、仿真、下载等功能。
下载模式我们采用JTAG线的下载方式。
Alter的Quartus II是业内领先的FPGA/CPLD设计软件,具有最全面的开发环境,实现无与伦比的性能表现。
本次设计采用VHDL语言编程设计。
在Quartus软件中VHDL文本输入中,输入所有序,并建立相应的工程项目,直接在该软件中进行编译及仿真,编译的同时,可以显示出当前芯片容量是否够用,如果不够用,则需要对程序进行进一步优化,直到容量达到芯片标准为止。
所有准备就绪后,则通过软件中的下载功能,通过JTAG端口,将程序下载到芯片中。
在QuartusII软件中,通过对所设计的硬件描述语言代码进行波形仿真后,达到了预期效果,于是,我们在该软件上进行下载配置设置。
在Assignments菜单下选中Devices,在Family栏选择ACEX1K,选中EPM240T100C5器件。
再在Assignments菜单下选中Pins按照相应要求对管脚进行锁定。
调试过程为在线调试。
在通过调试中,我们发现了很多问题,现归纳如下:
(1)系统调试主要是对音乐节奏时钟、控制时钟的频率和音频进行调试。
其中音乐节奏时钟的调试:
音乐节奏时钟理论要求时4Hz,在实际的演奏过程中频率稍微高于4Hz效果较好,通过改变R1的电阻来改变音乐节奏时钟,从而改变音乐节奏。
表1是音乐节奏时钟调试过程中的记录。
(2)在软件上能实现仿真的程序不一定在硬件电路上就能运行,原因有很多,这里是由于电路中的时钟频率太快,需要增加一个分频电路。
(3)由于分频的运算很大,故增加分频电路后,在QuartusII软件中则不能进行正确的仿真,可以直接将程序下载到电路板上去调试。
(4)按键不灵:
记录按键判断标志位没设置好,按键消抖没处理好。
5、编程收获与体会
通过对整体的学习和编程设计,完成了音乐播放器的设计,音乐播放器的设计经过了整体分析、模块化分析,硬件实现了循环演奏以及数码管、液晶屏显示等功能,描述了其工作原理、设计思路及实现方法。
实践证明,采用CPLD设计实现音乐硬件演奏电路的可靠性和可行性,而且更改乐曲比较容易,可根据需要修改程序中的音符数据,从而使电路实现任一曲子的播放。
在此次设计中,所有设计要求全部实现,然而在音乐的播放质量上仍有一些瑕疵,可能是由于蜂鸣器的质量问题或者芯片内部产生信号不稳定等关系,这都有待更多的时间对整个系统进行更多的测试,从而使播放出来的音乐更加悦耳。
通过此次设计,对可编程逻辑器件CPLD/FPGA有了更深一步的了解,真正达到了将课本中学习到的知识应用于实践,更深化了对这个领域的认知度。
在设计的过程中,还掌握了许多有关电子领域必要软件的使用,对今后的工作都有一定得帮助,
通过对芯片内部的编程设计,加上必要的外围电路,构成了这个音乐播放器的系统,整体工作量适中。
在前人已有的音乐播放器的基础上,添加四首歌曲选择播放,彩灯闪烁,不同音乐的调试,设计更人性化,合理化,同时也多了几分创新。
在此次设计中,所有设计要求全部实现,然而在音乐的播放质量上仍有一些瑕疵,可能是由于扬声器的质量问题或者芯片内部产生信号不稳定等关系,这都有待更多的时间对整个系统进行更多的测试,从而使播放出来的音乐更加悦耳。
通过此次设计,对可编程逻辑器件CPLD/FPGA有了更深一步的了解,真正的达到了将课本中学习到的知识应用于实践,更深化了对这个领域的认知度。
在设计的过程中,还掌握了许多有关电子领域必要软件的使用,对今后的工作都有一定得帮助。
通过这次的项目设计,我学到了很多,自己的知识积累和成长方面都有了明显的提高。
然而虽然很用心努力的做项目设计,但是难免不出错,或是有好多地方不完善,其实这些问题多多少少是不可避免的,所以今后遇到什么问题仍然需要继续钻研,继续努力。
经过资料查找,同学讨论,加上以前所学的知识,设计出了音乐播放器,同时明白了数码管液晶屏的工作原理等等。
也认识到了自己的所学有许多不足之处,在今后的学习及工作生涯中需要更大的努力。