本帖最后由 eehome 于 2013-1-5 09:50 编辑
Verilog HDL 之 乐曲演奏 我们都知道,乐曲由音调和音长组成,只要将音调和音长控制好就能演奏出动听的乐曲。下面将用Verilog HDL 硬件描述语言完成乐曲演奏的设计。 1、音调的控制 频率的高低决定了音调的高低。图1.1是音调和音律之间的关系。
图1.1 音调和音律之间的关系 所有不同频率的信号都是从同一个基准频率分频得来的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取证后的误差较大。若基准频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下去合适的基准频率。 本例中需要演奏的是梁祝,该乐曲各音阶频率及相应的分频比如图1.2所示。
图1.2 乐曲各音阶频率及相应的分频比 在表中除了给出分频比外,还给出了对应与各个音阶频率时计数器不同的预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来更容易。 2、音长的控制
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。
本实验中演奏梁祝片断,最短的音符为四分音符。
图1.3 乐曲演奏电路的原理框图 其中,乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数停留时间来实现,每个音符的演奏时间是0.25S的整数倍,对于节拍较长的音符,如二分音符。在记谱时将分别连续记录两次即可。 实验实现: (1)在设计文件中输入Verilog代码。
(2)由设计文件生成的.bsf文件,乐曲演奏的外接接口如图1.4所示。
图1.4 乐曲演奏的外接接口 (3)分配引脚: 将sys_CLK信号接时钟,button接按键,audio接蜂鸣器,这里就不贴出具体的引脚图了,大家可以根据自己的开发板对应起来。 (4)实验结果: 当打开按键时,就能听到完整的梁祝乐曲了。大家可以从网上下载自己喜欢的音乐,转化为可执行的乐谱。 PS:本实验应用没有涉及到Nios II软核,可以跟我先前的一篇乐曲播放博文进行比较
|