一、实验任务
利用FPGA进行代码开发,使蜂鸣器演奏出乐曲《生日快乐》,将音调显示在数码管。原理为蜂鸣器为交流源蜂鸣器,在引脚上加一定频率的方波就可以发声,而且发声的频率由所加方波决定。这样我们就可以根据无源蜂鸣器的原理进行发声练习了。
二、代码实现
由于需要蜂鸣器发声且数码管显示音调,所以我们将代码分为两部分。
第一部分用于产生音调的方波。第二部分为数码管显示。
(一)产生音调
(1)PreDiv 预置分频数模块
将48M晶振分频12M,再计算得出各个音调的频率,公式为12M÷音调频率÷2,所得即为预置分频数。程序中只编写了低音和中音的14个音。
module prediv( input [3:0]Index, input clk, input Reset_n, output reg[15:0] PreDiv ); always @ (negedge Reset_n or posedge clk) if(!Reset_n) begin PreDiv<=16'h5997; end else begin case(Index) 4'd1:PreDiv<=16'h5997; 4'd2:PreDiv<=16'h4FCD; 4'd3:PreDiv<=16'h471B; 4'd4:PreDiv<=16'h431E; 4'd5:PreDiv<=16'h3BCA; 4'd6:PreDiv<=16'h3544; 4'd7:PreDiv<=16'h2F74; 4'd8:PreDiv<=16'h2CCA; 4'd9:PreDiv<=16'h27E8; 4'd10:PreDiv<=16'h238D; 4'd11:PreDiv<=16'h218E; 4'd12:PreDiv<=16'h1DE5; 4'd13:PreDiv<=16'h1AA2; 4'd14:PreDiv<=16'h17BA; endcase end endmodule
(2)Index 索引数模块
为了便于代码书写,需要引用索引数(其实加一个ROM更为方便),即使用“5“为低音”so",如简谱一样,可以更为方便的编写乐曲。毕竟乐曲有很多音符,如果每次都用预置数编写程序,程序书写和查错会非常不方便。当然这也是verilog语言的魅力之处。
module index( input clk, input reset_n, output reg[3:0]index ); reg[5:0]cnt; wire clk2m; wire