FPGA蜂鸣器演奏音乐

FPGA蜂鸣器演奏音乐

今天来讲一下利用FPGA蜂鸣器演奏音乐的程序。
(1)蜂鸣器介绍
一般蜂鸣器分为有源蜂鸣器和无源蜂鸣器。
①有源蜂鸣器内部有振荡驱动电路,只要加上电源就可以发声,可以用作报警器的发声器件,但是缺点就是它的频率是固定的,因此只有一个单一的音调。
②我们FPGA板子上的蜂鸣器和单片机开发板上的蜂鸣器大部分都是无源蜂鸣器,可以由我们编程实现它的频率变化,由此发出不同音调的声音。
(2)编程思路
这次老师说要做闹钟,并且要求用蜂鸣器发出闹钟音乐,我上网搜了一下,有利用RAM存储乐谱来写音乐的,也有直接利用程序来写乐谱音乐的。今天我们就说一下直接利用程序,不利用RAM的方式来实现蜂鸣器乐曲。
①首先我们要知道不同的do、ri、mi、fa、so、la、xi对应的分频系数,由此产生不同的音调。在程序中我们设置一个分频计数器,用来记录当前要发出音调的分频系数。
这里有一张图有对应的讲解,我在网上搜索到的。
FPGA蜂鸣器演奏音乐_第1张图片
②除了音调,要使蜂鸣器奏乐,还需要节拍。在程序中设置一个计时器,作为节拍计数。
③利用case语句将所需要的节拍和要发出的音调写入case语句中,由此可以发出乐曲声音。
我的程序就是发出中音的do、ri、mi、fa、so、la、xi,每个节拍都是节拍计数为1000,大家可以去网上搜一些简单的乐谱,来修改音调和对应的节拍计数,来发出自己想要的音乐。
程序如下:

module Bpmusic(
input key,
input clk,
output reg beep
);
/*parameter do = 47774;
parameter ri = 42568;
parameter mi = 37919;
parameter fa = 35791;
parameter so = 31888;
parameter la = 28410;
parameter xi = 25309;*/
reg [15:0] cnt;
reg [15:0] prediv;
reg [12:0] delay;

initial begin
cnt = 16'd0;
prediv = 16'hBA9E;
delay = 13'd0;
end

always @(posedge clk) begin
if (key == 1'b1) begin
	beep <= 1'b0;
	delay <= 13'd0;
	cnt <= 16'd0;
	prediv <= 16'hBA9E;
end
else begin
	cnt <= cnt + 1'b1;
	if (cnt == prediv) begin
		beep <= ~beep;
		cnt <= 0;
		delay <= delay +1'b1;
		case(delay)
			13'd1000:prediv <= 16'hA648;
			13'd2000:prediv <= 16'h941F;
			13'd3000:prediv <= 16'h8BCF;
			13'd4000:prediv <= 16'h7C90;
			13'd5000:prediv <= 16'h6EFA;
			13'd6000:prediv <= 16'h62DD;
			13'd7000:begin
				prediv <= 16'hBA9E;
				delay <= 13'd0;
				end
			default : prediv <= prediv;
			endcase
	end
end 
end
endmodule

这个程序很简单,也不需要什么复杂的方法,但是蜂鸣器的音乐声音不太好听,大家可以增加一个音频D/A转换器使乐曲更加美妙~~!!!!

你可能感兴趣的:(FPGA学习)