《基于FPGA verilog的蜂鳴器奏樂》由會員分享,可在線閱讀,更多相關(guān)《基于FPGA verilog的蜂鳴器奏樂(4頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、蜂鳴器奏樂
我們在開發(fā)板上裝有一個交流源蜂鳴器,可用做發(fā)聲練習。其電路圖和實物圖如下所示:
首先,我們?yōu)槭裁催x擇交流蜂鳴器?所謂有源蜂鳴器是指在器件內(nèi)部具有振蕩器,所以只要在引腳上加上固定的直流電源,就能發(fā)出一定頻率的聲音,但缺點是頻率固定唯一(在該蜂鳴器生產(chǎn)出來后就決定了)。交流蜂鳴器需要在引腳上加上一定頻率的方波信號才能出聲,而且聲音的音調(diào)可有驅(qū)動方波的頻率決定,所以音調(diào)是可調(diào)的,發(fā)出的聲音更加逼真、悅耳。對CPLD/FPGA來說,產(chǎn)生頻率可調(diào)方波并不是件難事。所以選擇無源是很合適的。
電路中,主要由一個三極管,一個續(xù)流二極管和一個交流蜂鳴器組成。三極管Q1起開關(guān)作用,其基
2、極的高電平使三極管飽和導(dǎo)通,使蜂鳴器發(fā)聲;而基極低電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。因為蜂鳴器本質(zhì)上是一個感性元件,其電流不能瞬變,因此必須有一個續(xù)流二極管提供續(xù)流。否則,在蜂鳴器兩端會產(chǎn)生幾十伏的尖峰電壓,可能損壞電路系統(tǒng)的其它部分。交流蜂鳴器也有正負極,在器件的上方和板子上面都標注了,焊接時注意方向。
有了蜂鳴器的硬件組成,下面我們講解下如何發(fā)出音譜上的音調(diào)。
每個音調(diào),其實都是一個固定頻率的振動,頻率的高低決定了音調(diào)的高低。簡譜中的音名與頻率的對應(yīng)關(guān)系如表1所示:
表1 簡譜中的音名與頻率的對應(yīng)關(guān)系
音名
頻率/Hz
音名
頻率/Hz
音名
頻率/H
3、z
低音1
261.6
中音1
523.3
高音1
1046.5
低音2
293.7
中音2
587.3
高音2
1174.7
低音3
329.6
中音3
659.3
高音3
1318.5
低音4
349.2
中音4
698.5
高音4
1396.9
低音5
392
中音5
784
高音5
1568
低音6
440
中音6
880
高音6
1760
低音7
493.9
中音7
987.8
高音7
1975.5
當采用12M作為基準時鐘時,那么各個音調(diào)的分頻系數(shù)可按這個公式計算:12 000 000 ÷音調(diào)頻率
4、÷2(除以2表示半個周期),所以得出如下不同音調(diào)的分頻系數(shù)表格(十六進制表示,已進行四舍五入)
表格2 不同音調(diào)對應(yīng)的分頻系數(shù)(只列舉了低音部分)
音名
分頻系數(shù)
低音1
5997
低音2
4FCD
低音3
471B
低音4
431E
低音5
3BCA
低音6
3544
低音7
2F74
所以綜上所述,我們在程序中只要按表格里的分頻系數(shù)產(chǎn)生一定頻率的方波就能產(chǎn)生對應(yīng)的音調(diào)了。
module bell
(
ClkIn,
Resetb,
Bell
);
input ClkIn,Resetb;
out
5、put Bell;
reg Bell;
wire ClkBell;
reg [15:0] Cnt;
reg [15:0] PreDiv;//每個音調(diào)需要分頻的系數(shù)
reg [12:0] Delay;//每個音調(diào)持續(xù)的時間
defparam Gen_ClkBell.divdWIDTH=2,Gen_ClkBell.divdFACTOR=2;//4分頻,得到12M時鐘
gen_divd Gen_ClkBell(.reset(Resetb),.clkin(ClkIn),.clkout(ClkBell));
always @ (negedge Reset
6、b or posedge ClkBell)
if(!Resetb)
begin
Bell<=1'b0;
Cnt<=13'd0;
Delay<=13'd0;
PreDiv<=16'h5997;//音調(diào)1
end
else
begin
Cnt<=Cnt+1'b1;
if(Cnt>=PreDiv)
begin
Bell<=~Bell;
Cnt<=16'd0;
Delay<=Delay+1'd1;
case(Delay) //進行音調(diào)的切換
13'd10
7、00:PreDiv<=16'h4FCD;//2
13'd2000:PreDiv<=16'h471B;//3
13'd3000:PreDiv<=16'h431E;//4
13'd4000:PreDiv<=16'h3BCA;//5
13'd5000:PreDiv<=16'h3544;//6
13'd6000:PreDiv<=16'h2F74;//7
13'd7000:
begin
Delay<=13'd0;;//置為0,從頭開始演奏
PreDiv<=16'h5997;//音調(diào)1
end
endcase
end
end
endmodule