基于FPGA的音樂蜂鳴器設(shè)計(jì)
設(shè)計(jì)背景
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。在一般設(shè)計(jì)中,可利用蜂鳴器檢測(cè)有些按鍵是否按下,或者有些功能是否正常等,當(dāng)然如果足夠浪漫,也可以讓蜂鳴器演奏音樂。
設(shè)計(jì)原理
本設(shè)計(jì)使用的是無源蜂鳴器,也可稱為聲響器,原理電路圖如下所示。它沒有內(nèi)部驅(qū)動(dòng)電路,無源蜂鳴器工作的理想信號(hào)為方波,如果給直流,蜂鳴器是不響應(yīng)的,因?yàn)榇怕泛愣?,鉬片不能震動(dòng)發(fā)音。根據(jù)電路圖可知,由于 FPGA 的驅(qū)動(dòng)能力不夠,這里增加了一個(gè)三極管來驅(qū)動(dòng)這個(gè)無源蜂鳴器。在驅(qū)動(dòng)時(shí),只需要向蜂鳴器發(fā)送一定頻率的方波,就可以使蜂鳴器發(fā)聲。那么應(yīng)該發(fā)送怎樣的頻率呢?具體則可參考下表(音節(jié)頻率表)
樂曲能連續(xù)演奏所需要的兩個(gè)基本數(shù)據(jù)是:組成樂曲的每個(gè)音符的頻率值(音調(diào))和每個(gè)音符持續(xù)的時(shí)間(音長)。因此只要控制 FPGA輸出到蜂鳴器的激勵(lì)信號(hào)頻率的高低和持續(xù)時(shí)間,就可以使蜂鳴器發(fā)出連續(xù)的樂曲聲。在本設(shè)計(jì)中,由于至芯開發(fā)板的晶振為 50MHz,所以我們需要一個(gè)一個(gè)分頻模塊(PLL)產(chǎn)生一個(gè)較低的基準(zhǔn)頻率(1MHz)。還需要一個(gè)空間儲(chǔ)存樂譜,由于樂譜是固定的不需要更改,所以我們選擇 ROMIP 核進(jìn)行存儲(chǔ)?;鶞?zhǔn)頻率 1MHz 可分頻得到所有不同頻率的信號(hào)。最大的分頻比為1_000_000/262/2。既然是音樂,那么就需要節(jié)拍,一般采用 4 拍,即音長為 0.25s,所以還需設(shè)計(jì)一個(gè)模塊,控制每 0.25s,ROM 地址加 1,。如果需要發(fā)送一個(gè)低音 1 并維持 1 秒,則只需要在 ROM 的連續(xù)四個(gè)地址中寫入低音 1 的對(duì)應(yīng)信息即可。在設(shè)計(jì)中為了方便在 ROM 中儲(chǔ)存數(shù)據(jù),這里數(shù)據(jù)格式為 8’hAB,其中 A 暫時(shí)為三個(gè)值 1、2、4,分別表示低音、中音、高音。B 暫時(shí)為七個(gè)值 1、2、3、4、5、6、7。比如要產(chǎn)生一個(gè)低音 1,只需在 ROM中存儲(chǔ) 8’h11,如要產(chǎn)生一個(gè)高音 7,只需在 ROM中存儲(chǔ) 8’h47,以此類推即可。這時(shí),就需要一個(gè)解碼模塊,將 ROM 中的數(shù)據(jù)還原成音樂發(fā)生器所需要的數(shù)據(jù)。
設(shè)計(jì)架構(gòu)圖
根據(jù)上述的分析,得到如下的架構(gòu)圖
本設(shè)計(jì)包括 6 個(gè)模塊,PLL 模塊把 50MHz 的時(shí)鐘信號(hào)降到 1MHz,rom 模塊存儲(chǔ)音樂數(shù)據(jù),time_counter 是一個(gè)計(jì)數(shù)模塊,產(chǎn)生節(jié)拍,每到 0.25s,輸出的 time_finsh 變?yōu)橐粋€(gè)周期的高電平。并發(fā)送給addr_gen 模塊,產(chǎn)生 addr,讓 rom 輸出下一個(gè)地址的數(shù)據(jù)。rom 輸出的數(shù)據(jù) rom_data 輸入到 decode 解碼模塊,將解碼后的數(shù)據(jù)music_data 輸入到 music_gen 模塊,通過計(jì)數(shù)器,如果計(jì)數(shù)器小于music_data 的值,則 beep 保持不變,否則,beep 取反,并且計(jì)數(shù)器
清 1,從而產(chǎn)生特定的方波頻率。
設(shè)計(jì)代碼
time_counter 模塊代碼如下:
addr_gen 模塊代碼如下:
decode 解碼模塊代碼如下:
music_gen 模塊代碼如下:
beep 頂層模塊代碼如下:
仿真圖
仿真結(jié)果如下:
由仿真圖可知:當(dāng) rom 輸出 rom_data 為 8’h16 時(shí),代表輸出低音6,解碼后結(jié)果 music_data 為 1136,輸出的 beep 頻率為 440Hz,與實(shí)際低音 6 的音節(jié)頻率表的值一致;當(dāng) rom 輸出 rom_data 為 8’h22時(shí),代表輸出中音 2,解碼后結(jié)果 music_data 為 851,輸出的 beep頻率為 563Hz,與實(shí)際中音 2 的音節(jié)頻率表的值相差 24Hz,存在一定的誤差,但是不影響樂曲的播放。如果想提高 beep 頻率的精度,減小誤差,則可以將 1MHz 的基準(zhǔn)頻率提高。
責(zé)任編輯:lq
-
FPGA
+關(guān)注
關(guān)注
1626文章
21678瀏覽量
602047 -
ROM
+關(guān)注
關(guān)注
4文章
562瀏覽量
85681 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
890瀏覽量
45874
原文標(biāo)題:FPGA入門課程 音樂蜂鳴器設(shè)計(jì)
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論