?? buzzer.v
字號:
/*
向蜂鳴器發送一定頻率的方波可以使蜂鳴器發出相應的音調,該實驗通過設計一個狀態機和分頻
器使蜂鳴器發出"多來咪發梭拉西多"的音調。
*/
module buzzer(clk,rst,out);
input clk,rst;
output out;
reg out;
reg[3:0] clk_div1; //基頻分頻計數器,基頻為4M
reg[12:0] clk_div2;//音階分頻計數器,由基頻分頻產生各個音階
reg[21:0] cnt;//各音階發聲時間長短計數器
reg[2:0] state;
parameter duo=3822, //各個音調的分頻系數
lai=3405,
mi=3034,
fa=2865,
suo=2551,
la=2273,
xi=2024,
duo1=1911;
always@(posedge clk)
begin
if(!rst) begin
clk_div1<=0;
end
else begin
if(clk_div1!=12)
clk_div1<=clk_div1+1'b1;
else
clk_div1<=0;
end
end
always@(posedge clk)
begin
if(!rst) begin
clk_div2<=0;
state<=0;
cnt<=0;
out<=0;
end
else if(clk_div1==9) begin
case(state)
3'b000: begin //發“多”
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b001;
if(clk_div2!=duo)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b001: begin //發“來”
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b010;
if(clk_div2!=lai)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b010:begin //發"米“
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b011;
if(clk_div2!=mi)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b011: begin //發"法“
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b100;
if(clk_div2!=fa)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b100: begin //發"梭“
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b101;
if(clk_div2!=suo)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b101: begin //發"拉“
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b110;
if(clk_div2!=la)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b110: begin //發"西“
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b111;
if(clk_div2!=xi)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
3'b111: begin //發"多“(高音)
cnt<=cnt+1;
if(cnt==22'h3fffff)
state<=3'b000;
if(clk_div2!=duo1)
clk_div2<=clk_div2+1;
else begin
clk_div2<=0;
out<=~out;
end
end
endcase
end
end
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -