原理
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,即以有无震荡源分类,
有震荡源直接通直流电就可发生,无震荡源则需要通震荡波才能发声。
这里介绍无源蜂鸣器播放音乐的方法。
思路:
利用计数器产生pwm波形
根据乐谱设置震荡周期
给蜂鸣器赋值
注:一个音符响一个周期不在人耳的感知范围内,一般一个音符需要重复200以上个周期可以清楚的听到
注:音符周期计算:时钟频率 / 音符频率 = 音符周期数
或者 音符周期 / 时钟周期
实现
这里实现的《两只老虎》
三个计数器
cnt0 计数音符周期
cnt1 计数一个音符响的次数
cnt2 计数总的音符个数
两个参数
一个音符周期预设值
一个音符周期占空比
代码
module pwm_beep2(
input clk,
input rst_n,
output reg beep
);
parameter M1 = 17'd95600;
parameter M2 = 17'd85150;
parameter M3 = 17'd75850;
parameter M4 = 17'd71600;
parameter M5 = 17'd63750;
parameter M6 = 17'd56800;
parameter M7 = 17'd50600;
reg [16:0] cnt0;//音符周期计数器
wire add_cnt0;
wire end_cnt0;
reg [8:0] cnt1;//音符重复次数计数器
wire add_cnt1;
wire end_cnt1;
reg [4:0] cnt2;//音符总次数
wire add_cnt2;
wire end_cnt2;
reg [16:0] preset_note;//预设音符周期数
wire [16:0] preset_duty;//占空比
//音符周期计数
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt0 <= 17'b0;
end
else if(add_cnt0)begin
if(end_cnt0)begin
cnt0 <=