0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的蜂鳴器設(shè)計

CHANBAEK ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-06-27 18:24 ? 次閱讀

設(shè)計規(guī)劃

驅(qū)動無源蜂鳴器進行七個基本音調(diào)“哆來咪發(fā)梭拉西”的循環(huán)鳴叫,每個音階持續(xù)鳴叫0.5s后鳴叫下一個音階。

對于無源蜂鳴器,輸入不同的PWM方波就能發(fā)出不同的聲音。方波的頻率影響音調(diào),占空比影響音量。音調(diào)頻率對應表格如下,占空比保持為50%。因此這個實驗我們只要循環(huán)產(chǎn)生占空比為50%的七個音調(diào)頻率即可。

Do Re Mi Fa So La Si
262 294 330 349 392 440 494

現(xiàn)在我們考慮,除了時鐘和復位,需要幾個計數(shù)器:

1、蜂鳴維持0.5s,(50MHz對應20ns)計數(shù)從0-24999999,計數(shù)器名稱cnt。

2、需要蜂鳴7個調(diào),狀態(tài)計數(shù)從0-6,cnt計滿一次就+1,計數(shù)器名稱cnt_500ms。

3、不同的調(diào)對應不同頻率,需要一個頻率計數(shù)器freq_cnt。

以Do為例,頻率為262,周期為1/262=3.816794ms。時鐘頻率50MHz,對應周期是20ns,即計數(shù)個數(shù)為190840個,對應do的freq_cnt計數(shù)從0-190839。占空比為50%,即高電平和低電平的時長一樣,高電平持續(xù)時鐘脈沖個數(shù)為95420。

頻率 262 294 330 349 392 440 494
頻率數(shù)值 190840 170068 151515 143266 127551 113636 101214
占空比數(shù)值 95420 85034 75757 71633 63775 56818 50607

以Re為例的波形圖:

圖片

改變頻率數(shù)值freq_data和占空比計數(shù)duty_data,就可以得到不同頻率的波形。

編寫代碼

module beep
#(
parameter TIME_500MS = 25'd24999, //0.5s計數(shù)值
parameter DO = 18'd190 , //Do頻率262
parameter RE = 18'd170 , //Re頻率294
parameter MI = 18'd151 , //Mi頻率330
parameter FA = 18'd143 , //Fa頻率349
parameter SO = 18'd127 , //So頻率392
parameter LA = 18'd113 , //La頻率440
parameter XI = 18'd101 //Si頻率494
 )
 (
 input wire sys_clk , 
 input wire sys_rst_n , 
 output reg beep 
 );


 //reg define
 reg [24:0] cnt ; //0.5s計數(shù)器
 reg [17:0] freq_cnt ; //音調(diào)計數(shù)器
 reg [2:0] cnt_500ms ; //0.5s個數(shù)計數(shù)
 reg [17:0] freq_data ; //音調(diào)分頻計數(shù)值,取不同的DO,RE...可以得到不同頻率的波形


 //wire define
 wire [16:0] duty_data ; //占空比計數(shù)值,即DO,RE...的一半


 assign duty_data = freq_data > > 1'b1;   //二進制右移一位就是原值的1/2


 //cnt:0.5s循環(huán)計數(shù)器
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 25'd0;
 else if(cnt == TIME_500MS )
 cnt <= 25'd0;
 else
 cnt <= cnt + 1'b1;


 //cnt_500ms:對500ms個數(shù)進行計數(shù),每個音階鳴叫時間0.5s,7個音節(jié)一循環(huán)
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_500ms <= 3'd0;
 else if(cnt == TIME_500MS && cnt_500ms == 6)
 cnt_500ms <= 3'd0;
 else if(cnt == TIME_500MS)
 cnt_500ms <= cnt_500ms + 1'b1;


 //不同時間鳴叫不同的音階
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 freq_data <= DO;
 else case(cnt_500ms)
 0: freq_data <= DO;
 1: freq_data <= RE;
 2: freq_data <= MI;
 3: freq_data <= FA;
 4: freq_data <= SO;
 5: freq_data <= LA;
 6: freq_data <= XI;
 default: freq_data <= DO;
 endcase


 //freq_cnt:當計數(shù)到音階計數(shù)值或跳轉(zhuǎn)到下一音階時,開始重新計數(shù)
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 freq_cnt <= 18'd0;
 else if(freq_cnt == freq_data || cnt == TIME_500MS)
 freq_cnt <= 18'd0;
 else
 freq_cnt <= freq_cnt + 1'b1;


 //beep:輸出蜂鳴器波形
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 beep <= 1'b0;
 else if(freq_cnt >= duty_data)
 beep <= 1'b1;
 else
 beep <= 1'b0;


 endmodule

定義參數(shù):0.5s的計數(shù)值(用于cnt計數(shù)器的溢出值),七個頻率的計數(shù)值(用于不同時間段的頻率計數(shù)器freq_cnt的溢出值)

定義輸入輸出和中間變量

定義0.5s計數(shù)器:復位有效時拉低電平;溢出(計數(shù)到TIME_500MS即0.5s)時拉低電平,其他情況+1

定義0.5s個數(shù)計數(shù)器:由于音調(diào)要順序循環(huán)出現(xiàn),需要有個數(shù)計數(shù)器控制音調(diào)出現(xiàn)的時間。復位有效時拉低電平;溢出(0.5s計數(shù)器溢出且自身計數(shù)到溢出值6)時拉低電平,0.5s計數(shù)器溢出時+1

定義頻率變量:我們使用一個頻率變量,賦予不同的頻率值。音調(diào)的順序和頻率的對應就是0.5s個數(shù)計數(shù)器和頻率變量實現(xiàn)的當0.5s個數(shù)計數(shù)值為0時,對應Do音調(diào),那么頻率變量freq_data=DO。這里采用了case語句,注意需要有default語句

定義頻率計數(shù)器:前面只定義了可音調(diào)順序和頻率的對應,現(xiàn)在需要把音調(diào)時間和音調(diào)頻率對應。我們使用頻率計數(shù)器,讓音調(diào)數(shù)計滿后到下一個音調(diào)。復位有效時拉低電平;溢出(頻率計數(shù)器計數(shù)到freq_data或者0.5s計數(shù)器溢出)時拉低電平;其他情況+1

定義輸出波形:復位有效時拉低電平;頻率計數(shù)器為占空比數(shù)值(50%的占空比意味著高電平的持續(xù)時間是音調(diào)的周期的一半,數(shù)值也就是頻率變量的一半),拉高電平,其他時候拉低電平。

圖片

編寫testbench

`timescale 1ns/1ns
module tb_beep();


//reg define
reg sys_clk ; 
reg sys_rst_n ; 


 //對時鐘,復位信號賦初值
 initial
 begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #100
 sys_rst_n <= 1'b1;
 end


 //產(chǎn)生時鐘信號
 always #10 sys_clk = ~sys_clk;


//Instantiation 


 beep
 #(
 .TIME_500MS(25'd2499), //0.5s計數(shù)值
 .DO (18'd19 ), //"哆"音調(diào)分頻計數(shù)值(頻率262)
 .RE (18'd17 ), //"來"音調(diào)分頻計數(shù)值(頻率294)
 .MI (18'd15 ), //"咪"音調(diào)分頻計數(shù)值(頻率330)
 .FA (18'd14 ), //"發(fā)"音調(diào)分頻計數(shù)值(頻率349)
 .SO (18'd12 ), //"梭"音調(diào)分頻計數(shù)值(頻率392)
 .LA (18'd11 ), //"拉"音調(diào)分頻計數(shù)值(頻率440)
 .XI (18'd10 ) //"西"音調(diào)分頻計數(shù)值(頻率494)
 )
 beep_inst
 (
 .sys_clk (sys_clk ), //系統(tǒng)時鐘,頻率50MHz
 .sys_rst_n (sys_rst_n ), //系統(tǒng)復位,低有效


 .beep (beep ) //輸出蜂鳴器控制信號
 );


 endmodule

初始化、產(chǎn)生時鐘信號、實例化:為了節(jié)省時間參數(shù)值縮小了

對比波形

圖片

由于節(jié)省時間將參數(shù)縮小了,DO音調(diào)的計數(shù)值是19,時鐘是10ns的變化(周期20ns),因此BEEP在DO音調(diào)的周期是19201000ps=380000ps,且BEEP在RE周期是17201000ps=340000ps。圖中的數(shù)值差異是標尺的誤差。

分配管腳

圖片

圖片

全編譯后上板驗證

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21744

    瀏覽量

    603653
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5190

    瀏覽量

    214047
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2256

    瀏覽量

    94612
  • 時鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1734

    瀏覽量

    131516
  • 蜂鳴器
    +關(guān)注

    關(guān)注

    12

    文章

    891

    瀏覽量

    45971
收藏 人收藏

    評論

    相關(guān)推薦

    #硬聲創(chuàng)作季 數(shù)字設(shè)計FPGA應用:蜂鳴器基礎(chǔ)

    蜂鳴器數(shù)字設(shè)計
    Mr_haohao
    發(fā)布于 :2022年10月24日 03:23:31

    #硬聲創(chuàng)作季 數(shù)字設(shè)計FPGA應用:蜂鳴器實踐演示和代碼設(shè)計

    蜂鳴器數(shù)字設(shè)計代碼
    Mr_haohao
    發(fā)布于 :2022年10月24日 03:24:07

    FPGA驅(qū)動蜂鳴器"唱歌"

    本帖最后由 圈圈7029 于 2014-11-18 11:49 編輯 FPGA驅(qū)動蜂鳴器"唱歌"一、蜂鳴器及其原理1 蜂鳴器的介紹(1)蜂鳴器
    發(fā)表于 11-17 17:04

    求一個FPGA蜂鳴器的代碼,超重報警

    求一個FPGA蜂鳴器的代碼,超重報警,,急急急謝謝
    發(fā)表于 05-28 16:54

    Xilinx FPGA入門連載18:蜂鳴器開關(guān)實例

    `Xilinx FPGA入門連載18:蜂鳴器開關(guān)實例特權(quán)同學,版權(quán)所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1jGjAhEm 1 功能簡介我們已經(jīng)在sp6_ex2
    發(fā)表于 10-28 11:32

    勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載21:蜂鳴器、數(shù)碼管、流水燈、撥碼開關(guān)電路

    `勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載21:蜂鳴器、數(shù)碼管、流水燈、撥碼開關(guān)電路特權(quán)同學,版權(quán)所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUD
    發(fā)表于 11-17 19:12

    請問用FPGA怎么實現(xiàn)蜂鳴器發(fā)出救護車的笛聲?

    請問,用FPGA實現(xiàn)蜂鳴器發(fā)出救護車鳴笛聲?什么頻率?
    發(fā)表于 04-16 23:00

    【工程源碼】基于FPGA蜂鳴器播放《天空之城》程序

    工程說明:基于FPGA開發(fā)板,使用蜂鳴器播放音樂《天空之城》吐槽下,網(wǎng)友寫的時候,PWM都寫成了PWN,,我也就不改他的大作了。
    發(fā)表于 02-06 14:56

    FPGA開發(fā)板上實現(xiàn)通過蜂鳴器播放音樂的設(shè)計

    1、在FPGA開發(fā)板上實現(xiàn)通過蜂鳴器播放音樂的設(shè)計本實驗是實驗七SoC系統(tǒng)準備的外設(shè),為純FPGA邏輯實驗。本實驗目標是通過蜂鳴器播放音樂,音樂選取由撥動開關(guān)選擇,播放啟動由按鍵控制。
    發(fā)表于 08-17 16:14

    基于FPGA的音樂蜂鳴器設(shè)計(附代碼)

    叁芯智能科技-郝旭帥團隊打造“FPGA 設(shè)計與研發(fā)”學習系列, 可以讓設(shè)計者從“小白”到“入門”再到“精通”。本系列從基礎(chǔ)的數(shù)字電路為起點,避免學習者“騰空造樓”;中間講解各類基礎(chǔ)外設(shè)驅(qū)動,保證
    發(fā)表于 02-27 16:43

    把手教你學習FPGA蜂鳴器

    把手教你學習FPGA蜂鳴器篇,詳細的教程。
    發(fā)表于 09-01 16:40 ?0次下載

    FPGA DIY開發(fā)板控制蜂鳴器

    haohaolinux 的蜂鳴器視頻。
    的頭像 發(fā)表于 06-20 13:15 ?3301次閱讀

    采用FPGA DIY開發(fā)板控制蜂鳴器產(chǎn)生作用

    蜂鳴器——FPGA
    的頭像 發(fā)表于 06-22 03:29 ?4454次閱讀
    采用<b class='flag-5'>FPGA</b> DIY開發(fā)板控制<b class='flag-5'>蜂鳴器</b>產(chǎn)生作用

    基于FPGA的音樂蜂鳴器設(shè)計

    本設(shè)計使用的是無源蜂鳴器,也可稱為聲響器,原理電路圖如下所示。它沒有內(nèi)部驅(qū)動電路,無源蜂鳴器工作的理想信號為方波,如果給直流,蜂鳴器是不響應的,因為磁路恒定,鉬片不能震動發(fā)音。
    的頭像 發(fā)表于 11-11 09:48 ?6387次閱讀
    基于<b class='flag-5'>FPGA</b>的音樂<b class='flag-5'>蜂鳴器</b>設(shè)計

    基于FPGA蜂鳴器模擬簡譜樂曲

     蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設(shè)備、電話機、定時器等電子產(chǎn)品中作發(fā)聲器件。
    的頭像 發(fā)表于 04-18 14:53 ?1627次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>蜂鳴器</b>模擬簡譜樂曲