音乐盒设计报告

  • 格式:doc
  • 大小:74.50 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

音乐盒设计报告

一、引言

随着EDA技术的进展,基于可编程的数字电子系统设计的完整方案越来越受到人们的重视。与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。如何使用EDA工具设计电子系统是人们普遍关心的问题。本课程设计主要是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,FPGA器件选择Altera的EPM570,在MAXⅡ的EDA软件平台上,实现了乐曲演奏电路的设计。

关键词:Verilog HDL;模块文件;蜂鸣器

二、设计目的

1.加深对EDA技术的理解,掌握乐曲演奏电路的工作原理;

2.了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏;

3.培养自主学习、正确分析和解决问题的能力。

三、设计内容

1.能自动演奏一段乐曲,曲目不限。

2.利用verilog HDL编程语言编写合适的能实现1中要求的基本具体功能的语言程序。

四、功能介绍

1.循环播放程序内预存的第1首乐曲;

2.设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;。

3.设置停止键,乐曲播放过程中按该键则停止播放,再按开始键则从头开始播放;

五、基本原理

1.乐曲演奏原理

组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使蜂鸣器发出连续的乐曲声。

2.音调的控制

频率的高低决定了音调的高低。音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个8度音之间,又可分为12个半音,每两个半音的频率比为12√2。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E 到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如下表所示:

简谱中的音名与频率的关系

音名频率/Hz 音名频率/Hz 音名频率/Hz

低音1 261.6 中音1 523.3 高音1 1046.5

低音2 293.7 中音2 587.3 高音2 1174.7

低音3 329.6 中音3 659.3 高音3 1318.5

低音4 349.2 中音4 698.5 高音4 1396.9

低音5 392 中音5 784 高音5 1568

低音6 440 中音6 880 高音6 1760

低音7 493.9 中音7 987.8 高音7 1975.5

所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。本设计中选取12MHz为基准频率。实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会“走调”。

在下表中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些。

各音阶频率对应的分频比及预置数

音名分频比预置数音名分频比预置数低音3 9102 7281 中音2 5111 11272 低音5 7653 8730 中音3 4552 11831 低音6 6818 9565 中音5 3827 12556 低音7 6073 10310 中音6 3409 12974 中音1 5736 10647 高音1 2867 13516 此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为2141=16383即可,此时蜂鸣器将不会发声。

3.音长的控制

音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。

音调显示电路用来显示乐曲演奏时对应的音调的高低。可以用8个led灯,根据音调的高低不同,被点亮的数目也不相同。为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。

六、设计实现

1.查阅资料熟悉verilog HDL语言并了解实验目的编写如下程序:

module music(clk,pause,beep); //定义时钟及几个功能变量

input clk,pause; //输入变量

output beep;

reg a; //输出变量,即蜂鸣器发声

reg beep_r; //定义几个中间变量

reg[7:0]state;

reg[7:0]state1;

reg[15:0]count,count_end;

reg[23:0]count1;

parameter L_5=16'd61224,

L_6=16'd54545,

M_1=16'd45863,

M_2=16'd40864,

M_3=16'd36402,

M_5=16'd30612,

M_6=16'd27273,

H_1=16'd22956;

parameter TIME=12000000; //时钟频率assign beep=beep_r;

always@(posedge pause)

begin

a=!a; //暂停

end

always@(posedge clk)

begin

if(a)

beep_r=1'b0;

else

count<=count+1'b1;

if(count==count_end)