《基于FPGA verilog的蜂鳴器奏樂(lè)》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于FPGA verilog的蜂鳴器奏樂(lè)(4頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、蜂鳴器奏樂(lè)
我們?cè)陂_(kāi)發(fā)板上裝有一個(gè)交流源蜂鳴器,可用做發(fā)聲練習(xí)。其電路圖和實(shí)物圖如下所示:
首先,我們?yōu)槭裁催x擇交流蜂鳴器?所謂有源蜂鳴器是指在器件內(nèi)部具有振蕩器,所以只要在引腳上加上固定的直流電源,就能發(fā)出一定頻率的聲音,但缺點(diǎn)是頻率固定唯一(在該蜂鳴器生產(chǎn)出來(lái)后就決定了)。交流蜂鳴器需要在引腳上加上一定頻率的方波信號(hào)才能出聲,而且聲音的音調(diào)可有驅(qū)動(dòng)方波的頻率決定,所以音調(diào)是可調(diào)的,發(fā)出的聲音更加逼真、悅耳。對(duì)CPLD/FPGA來(lái)說(shuō),產(chǎn)生頻率可調(diào)方波并不是件難事。所以選擇無(wú)源是很合適的。
電路中,主要由一個(gè)三極管,一個(gè)續(xù)流二極管和一個(gè)交流蜂鳴器組成。三極管Q1起開(kāi)關(guān)作用,其基
2、極的高電平使三極管飽和導(dǎo)通,使蜂鳴器發(fā)聲;而基極低電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。因?yàn)榉澍Q器本質(zhì)上是一個(gè)感性元件,其電流不能瞬變,因此必須有一個(gè)續(xù)流二極管提供續(xù)流。否則,在蜂鳴器兩端會(huì)產(chǎn)生幾十伏的尖峰電壓,可能損壞電路系統(tǒng)的其它部分。交流蜂鳴器也有正負(fù)極,在器件的上方和板子上面都標(biāo)注了,焊接時(shí)注意方向。
有了蜂鳴器的硬件組成,下面我們講解下如何發(fā)出音譜上的音調(diào)。
每個(gè)音調(diào),其實(shí)都是一個(gè)固定頻率的振動(dòng),頻率的高低決定了音調(diào)的高低。簡(jiǎn)譜中的音名與頻率的對(duì)應(yīng)關(guān)系如表1所示:
表1 簡(jiǎn)譜中的音名與頻率的對(duì)應(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
當(dāng)采用12M作為基準(zhǔn)時(shí)鐘時(shí),那么各個(gè)音調(diào)的分頻系數(shù)可按這個(gè)公式計(jì)算:12 000 000 ÷音調(diào)頻率
4、÷2(除以2表示半個(gè)周期),所以得出如下不同音調(diào)的分頻系數(shù)表格(十六進(jìn)制表示,已進(jìn)行四舍五入)
表格2 不同音調(diào)對(duì)應(yīng)的分頻系數(shù)(只列舉了低音部分)
音名
分頻系數(shù)
低音1
5997
低音2
4FCD
低音3
471B
低音4
431E
低音5
3BCA
低音6
3544
低音7
2F74
所以綜上所述,我們?cè)诔绦蛑兄灰幢砀窭锏姆诸l系數(shù)產(chǎn)生一定頻率的方波就能產(chǎn)生對(duì)應(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;//每個(gè)音調(diào)需要分頻的系數(shù)
reg [12:0] Delay;//每個(gè)音調(diào)持續(xù)的時(shí)間
defparam Gen_ClkBell.divdWIDTH=2,Gen_ClkBell.divdFACTOR=2;//4分頻,得到12M時(shí)鐘
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) //進(jìn)行音調(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,從頭開(kāi)始演奏
PreDiv<=16'h5997;//音調(diào)1
end
endcase
end
end
endmodule