|
Xilinx FPGA入門連載0: 特權(quán)同學(xué),版權(quán)所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1jGjAhEm
蜂鳴器是一種最簡(jiǎn)單的發(fā)聲元器件,它的應(yīng)用也非常廣泛,大都是作為報(bào)警或發(fā)聲提醒裝置。比如我們家里的電腦在剛開啟時(shí),通常主板上會(huì)發(fā)出一聲較短的尖銳的“滴……”的鳴叫聲,提示用戶主板自檢通過(guò),可以正常進(jìn)行后面的啟動(dòng);而如果是1長(zhǎng)1短或1長(zhǎng)2短的鳴叫聲,則表示可能發(fā)生了電腦內(nèi)存或顯卡故障;當(dāng)然還可以有其他不同的鳴叫聲提示其他的故障,總而言之,可別小看了這顆區(qū)區(qū)幾毛錢的小家伙,關(guān)鍵時(shí)刻還挺有用的。可以毫不夸張的說(shuō),蜂鳴器也算是一種人機(jī)交互的手段。 PWM(Pulse Width Modulation),即脈沖寬度調(diào)制,如下圖所示,PWM的輸出只有高電平1和低電平0。PWM不停的重復(fù)輸出周期為T,其中高電平1時(shí)間為t的脈沖,t/T是它的占空比,1/T是它的頻率。
如下圖所示,基于蜂鳴器在FPGA的IO輸出1就發(fā)聲、0則不發(fā)聲的原理,我們給IO口一個(gè)占空比為50%的PWM的信號(hào),讓蜂鳴器間歇性的發(fā)聲鳴叫。如果它的頻率高則發(fā)聲就顯得相對(duì)尖銳急促一些,如果它的發(fā)聲頻率低則發(fā)聲就顯得低沉平緩一些。
在我們給出的實(shí)例代碼中,我們期望產(chǎn)生一個(gè)輸出頻率為25Hz(40ms)、占空比為50%的PWM信號(hào)去驅(qū)動(dòng)蜂鳴器的發(fā)聲。因此,我們使用系統(tǒng)時(shí)鐘25MHz(40ns)進(jìn)行計(jì)數(shù),每計(jì)數(shù)1,000,000次,這個(gè)計(jì)數(shù)器就清零重新計(jì)算。因?yàn)檫@個(gè)計(jì)數(shù)器是2進(jìn)制的,要能夠表達(dá)0-999999的任意一個(gè)計(jì)數(shù)值,那么這個(gè)2進(jìn)制計(jì)數(shù)器至少必須是20位的。此外,為了得到輸出的PWM占空比為50%,那么我們只要判斷計(jì)數(shù)值小于最大計(jì)數(shù)值的一半即500000時(shí),輸出高電平1,反之輸出低電平0。 //產(chǎn)生頻率為25Hz,占空比為50%的蜂鳴器發(fā)聲信號(hào) module sp6( input ext_clk_25m, //外部輸入25MHz時(shí)鐘信號(hào) input ext_rst_n, //外部輸入復(fù)位信號(hào),低電平有效 output reg beep //蜂鳴器控制信號(hào),1--響,0--不響 ); //------------------------------------- reg[19:0] cnt; //20位計(jì)數(shù)器 //cnt計(jì)數(shù)器進(jìn)行0-999999的循環(huán)計(jì)數(shù),即ext_clk_25m時(shí)鐘的1000000分頻,對(duì)應(yīng)cnt一個(gè)周期為25Hz always @ (posedge ext_clk_25m or negedge ext_rst_n) if(!ext_rst_n) cnt <= 20'd0; else if(cnt < 20'd999_999) cnt<= cnt+1'b1; else cnt <= 20'd0; //------------------------------------- //產(chǎn)生頻率為25Hz,占空比為50%的蜂鳴器發(fā)聲信號(hào) always @ (posedge ext_clk_25m or negedge ext_rst_n) if(!ext_rst_n) beep <= 1'b0; else if(cnt < 20'd500_000) beep<= 1'b1; //蜂鳴器響 else beep <= 1'b0; //蜂鳴器不響 endmodule |