module bell_controller(
input ClkIn, // 输入时钟
input Resetb, // 复位按钮
input [2:0] tone_number, // 输入的音符序号
output reg Bell // 蜂鸣器输出
);
wire ClkBell;
reg [15:0] PreDiv;
reg [12:0] Delay;
// 实例化频率分频器
gen_divd Gen_ClkBell(.reset(Resetb), .clkin(ClkIn), .clkout(ClkBell));
always @ (negedge Resetb or posedge ClkBell)
if(!Resetb)
begin
Bell <= 1'b0;
Delay <= 13'd0;
PreDiv <= 16'h0000;
end
else
begin
Delay <= Delay + 1'd1;
if(Delay >= PreDiv)
begin
Bell <= ~Bell;
Delay <= 13'd0;
case(tone_number)
3'b001:PreDiv <= 16'h5997; // 1
3'b010: PreDiv <= 16'h4FCD; // 音符2的频率
3'b011: PreDiv <= 16'h471B; // 音符3的频率
3'b100: PreDiv <= 16'h431E; // 音符4的频率
3'b101: PreDiv <= 16'h3BCA; // 音符5的频率
3'b110: PreDiv <= 16'h3544; // 音符6的频率
3'b111: PreDiv <= 16'h2F74; // 音符7的频率
default: PreDiv <= 16'h0000;
endcase
end
end
endmodule
input ClkIn, // 输入时钟
input Resetb, // 复位按钮
input [2:0] tone_number, // 输入的音符序号
output reg Bell // 蜂鸣器输出
);
wire ClkBell;
reg [15:0] PreDiv;
reg [12:0] Delay;
// 实例化频率分频器
gen_divd Gen_ClkBell(.reset(Resetb), .clkin(ClkIn), .clkout(ClkBell));
always @ (negedge Resetb or posedge ClkBell)
if(!Resetb)
begin
Bell <= 1'b0;
Delay <= 13'd0;
PreDiv <= 16'h0000;
end
else
begin
Delay <= Delay + 1'd1;
if(Delay >= PreDiv)
begin
Bell <= ~Bell;
Delay <= 13'd0;
case(tone_number)
3'b001:PreDiv <= 16'h5997; // 1
3'b010: PreDiv <= 16'h4FCD; // 音符2的频率
3'b011: PreDiv <= 16'h471B; // 音符3的频率
3'b100: PreDiv <= 16'h431E; // 音符4的频率
3'b101: PreDiv <= 16'h3BCA; // 音符5的频率
3'b110: PreDiv <= 16'h3544; // 音符6的频率
3'b111: PreDiv <= 16'h2F74; // 音符7的频率
default: PreDiv <= 16'h0000;
endcase
end
end
endmodule