FPGA是现场可编程门阵列的简称,它既有门阵列器件的高度集成和通用性,又有可编程逻辑器件用户可编程的灵活性。通过FPGA实现音乐流水灯的控制,实质上就是将不同音阶与特定频率的方波信号对应起来,以方波信号驱动蜂鸣器发出音乐,再根据不同音阶来控制流水灯的闪烁。与借助微处理器实现乐曲演奏相比,以纯硬件方式完成乐曲演奏电路更直观。EDA工具和硬件描述语言发挥了强大功能,提供了设计可能性。
1 总体设计方案
音乐流水灯主要是点缀公共场合的装饰品,音乐的播放和流水灯有节奏地闪烁,同时达到听觉和视觉的完美结合,成为构成其必不可少的条件。要了解如何产生不同音阶的音乐,首先要对乐音的特性有所了解。乐音实际上是有固定频率的信号。在乐曲的构成中,乐音的频率和持续的时间是其构成的要素。音阶的频率可以通过高频时钟进行分频得到。音频的高低可以通过外部的LED灯的闪烁来显示,这样在音乐和流水灯的配合下可以使人产生强烈的节奏感。再辅以LCD来显示音阶的高低长短,不懂乐理知识的人便可以直观的看到不同音调对应的音阶。
总体设计要求如下:
(1)分频主要是通过一个可控分频器实现的。采用时钟的频率越高,分频系数越大,分频后的音阶频率就越准确。但同时由于分频系数大使用的计数单元增加,从而耗费更多的硬件逻辑单元,因此可以采取一个较为适中的时钟频率12MHz。
(2)经过分频后的信号是一个脉宽极窄的时钟信号,必须对其进行脉冲宽度调整,增大占空比,才能有效地驱动蜂鸣器。在脉冲宽度调整时会对此信号再次二分频,所以在计算时,以乐音音阶的二倍频率去求取在特定时钟信号下的分频系数,以便在调整占空比后得到正确的音阶频率。
(3)乐曲的频率变化多端,对应的分频系数也不断变化,因此需要将播放的乐曲的分频系数事先存放在ROM中便于读取。如果将分频系数直接作为存储码存放在寄存器中,势必会占有更大的容量。因此在这里选取索引值来作为存储码以减小容量。
(4)开发平台上的LED灯数量有限,可以选用有规律的闪烁,例如从左到右依次点亮、渐亮、渐灭等;也可以用灯闪烁的多少来表示频率的大小。本设计选用第二种。
图1为音乐流水灯控制系统的总统原理框图。可以看到该系统包含乐曲播放控制模块,流水灯控制模块和LCD显示模块3个模块。其中乐曲播放控制模块分为乐谱播放控制模块,音阶分频模块和音阶频率产生模块。
2 模块设计
2.1 乐曲播放控制模块
乐曲播放控制模块的主要功能是在一定的时钟信号驱动下将事先存储在ROM里的乐谱所对应的索引值依次输出,控制分频,并产生相应的分频信号频率,以此来控制蜂鸣器的发声。
2.1.1 音阶分频器的设计
为了能够在播放乐曲的同时显示当前音阶,用LED的位数来指示当前音阶的高低音。程序中的音阶分频系数通过索引值来进行选取,即在音乐播放过程中由乐谱存储电路传递来的当前音阶的索引值。
2.1.2 音阶频率产生的设计
音阶频率产生电路在获取上面的音阶索引值对应的分频系数后,通过可控计数器进行分频。分频电路中的计数器进行减1计数,计数器的进位信号即为分频信号。因为此信号的脉冲宽度极小,所以需要调整占空比才使外部驱动电路提供足够的驱动蜂鸣器的功率,而具体是对分频信号再进行二分频实现的。
2.1.3 乐谱播放控制模块设计
音乐播放就是通过外部的8 Hz时钟驱动,内部以计数器进行计数、产生地址,送到ROM单元中作为存储器地址,将对应地址的数据——音阶索引值输出。
在本设计中,每个音的发出由另一个8 Hz的时钟信号来控制。乐谱中的4分音符由4个时钟信号来驱动。每个时钟下,其对应的音阶输出以索引值的形式存储在ROM中。文中ROM的地址线为10位,数据线宽度为4位。ROM里存储的数据即各音节的索引值,根据乐谱转换的需要,16个索引值即可满足乐曲曲谱编写的需求,所以设置了4位数据线。地址线的宽度主要取决于乐曲的长度。本设计中用到了约520个4 bit单元,为了留有一定裕度,将数据线宽度定义为10位,即1 024个4 bit单元。其中不同的音阶对应的索引值如表1所示。