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