要使扬声器发出美妙的音乐,就需要控制好每一个音符的频率以及每一个音符演奏时所持续的时间。因此,音符频率和节奏控制是演奏音乐的两个关键因素。在设计过程中做了一些简化处理,未考虑每个音符的延迟时间,另外只进行了中音的设计。如果需要设计具有高音(低音),只需要再添加一个高中低音的开关进行选择即可。
通过对电子琴原理的分析可以知道,电子琴的核心是一个分频器和一个频率选择器。通过分频器的分频产生可以不同的声音频率,通过频率选择器可以选择不同的频率并进行输出。
以下设计主要用FPGA来实现电子琴的频率产生和选择输出功能。振荡器产生的不同频率将通过Spartan-3E(时钟频率为50MHz)经过不同的分频得到,按键则通过设计一个8位的选择器来实现不同频率的选择输出。
在试验过程中,所用板子的型号为Spartan-3E,它的时钟频率为50MHz。因此,经过计算,各音符的分频数如下:
中音do:50000000/523.3=95547
中音do:50000000/587.3=87135
中音do:50000000/659.3=75838
中音do:50000000/698.5=71582
中音do:50000000/784=63775
中音do:50000000/880=56818
中音do:50000000/987.8=50617
中音do:50000000/1046.5=47778
频率选择器通过设计一个case语句来实现按下不同的键就得到不同频率的功能。在设计Verilog代码时,所涉及的英文字符含义如下:
clk:外部时钟信号。(www.xing528.com)
key:外部输入信号,用于选择每个音符。
song_out:音乐输出端口,即输出每个音符的频率。
led:输出端口,它的值等于key的值,用于告知当前输入的是哪个音符。
song_reg:寄存器名,用于存储每个音符的频率波形。
count:寄存器名,用于计数,实现分频。
delay:寄存器名,用于存储不同音符的延迟次数。
keyreg:寄存器名,用于存储输入的key值。
key_flag:寄存器名,用作标志。
key_flag1:寄存器名,用于存储key的值。
key_flag2:寄存器名,用于存储key_flag1的值。当key_flag2被赋值后,将key_flag2与key进行比较,以判断key是否改变,从而使key_flag置1或0。
设计的Verilog代码详见光盘附件5-1。
每次改变key值后,都需要两个时钟周期来建立稳定的频率波形。在输入key值后的第一个时钟周期,第二个always模块的key_flag被置1;第二个时钟周期到来时,第一个always模块的count被置0,此时count还没开始计数;直到第三个时钟周期到来时才开始执行第一个always模块的加一运算。也就是说,每次改变key值时,都必须要两个时钟周期的时间来建立所需要的频率波形。但是,当频率波形建立后,就不再需要两个时钟周期来建立波形了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。