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

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

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

學(xué)會這些,用FPGA開發(fā)板制作音樂盒就是這么簡單!

電子工程技術(shù) ? 來源:YXQ ? 2019-08-12 17:11 ? 次閱讀

相信大家已經(jīng)在網(wǎng)上見識過很多“民間大神”們的天才(奇葩)手工DIY了,一些簡簡單單的材料在他們的搗鼓下,瞬間華麗轉(zhuǎn)身,變廢為寶。今天,我們?yōu)榇蠹艺砹艘晃皇止ご笊竦?a target="_blank">DIY心得——如何利用FPGA開發(fā)板DIY一個音樂盒,也就是如何使我們的FPGA播放聲音和音樂!

首先需生成單個音調(diào),然后慢慢地做更有趣的事情,如制作警報聲和播放曲調(diào)。

需要準(zhǔn)備的硬件

該項目使用的是一個Pluto的FPGA開發(fā)板,還有一個揚聲器和一個1kΩ的電阻。

更加直觀的展示是下面這樣的:

本次DIY的音樂盒分為4個部分:

1.簡單的嗶嗶聲

2.警報聲

3.音調(diào)

4.曲子

1.簡單的嗶嗶聲

FPGA可以輕松實現(xiàn)二進制計數(shù)器。例如,在回滾之前,16位計數(shù)器將從0到65535(65536個不同的值)計數(shù)。Pluto板具有一個25MHz的時鐘振蕩器,因此我們可以輕松構(gòu)建一個25MHz時鐘16位自動計數(shù)器。其最高位切換頻率為25000000/65536 = 381Hz。

VerilogHDL的代碼如下:

modulemusic(clk,speaker);

inputclk;

outputspeaker;

// 首先創(chuàng)建一個16位二級制計數(shù)器

reg[15:0]counter;

always@(posedgeclk)counter<=counter+1;

// 使用計數(shù)器的最高有效位來驅(qū)動揚聲器

assignspeaker=counter[15];

endmodule

詳細講解的話就是,“clk”在25MHz下運行,“counter [0]”看起來像是一個12.5MHz信號(它以25MHz的頻率進行更新變化,變化的值為0 1 0 1 ......因此看起來像12.5MHz信號),“counter [1]“是6.125MHz信號,依此類推。

由于我們使用計數(shù)器的最高有效位(第15位)來驅(qū)動輸出,因此“揚聲器”輸出會產(chǎn)生一個完美的381Hz方波信號。

2.警報聲

我們可以在兩個音調(diào)之間循環(huán)。我們首先用一個24位計數(shù)器的“音調(diào)”來產(chǎn)生一個較慢的方波。其MSB(最高有效位)“tone[23]”是一1.5Hz的頻率進行變換的。

然后我們就可以用這個最高有效位切換到另一個計數(shù)器,從而在兩個頻率之間切換。

代碼如下:

modulemusic(clk,speaker);

inputclk;

outputspeaker;

parameterclkdivider=25000000/440/2;

reg[23:0]tone;

always@(posedgeclk)tone<=tone+1;

reg[14:0]counter;

always@(posedgeclk)if(counter==0)counter<=(tone[23]?clkdivider-1:clkdivider/2-1);elsecounter<=counter-1;

regspeaker;

always@(posedgeclk)if(counter==0)speaker<=~speaker;

endmodule

3.演奏音符

現(xiàn)在我們想要演奏一首曲子,所以需要來獲取不同的音符,就像電子琴一樣。

如果我們用6位來實現(xiàn)音符,那么我可以獲得64個音符。每個八度一共有12個音符,所以64個音符可以實現(xiàn)5個八度,完全足夠彈奏一首曲目了。

步驟1

要想實現(xiàn)一組音調(diào)不斷升高的聲音,我們用一個28位計數(shù)器來距離,提取其中6個MSB,從而給到6位的音調(diào)。

代碼如下:

reg[27:0]tone;

always@(posedgeclk)tone<=tone+1;

wire[5:0]fullnote=tone[27:22];

在25MHz的時鐘下,每個音符持續(xù)167ms,64個音符一共需要10.6s才能演奏完成。

步驟2

我們將“fullnote”分成12份。這樣就可以給到我們一個八度(一共有5個8度,所以我們只需要3位,從0到4)和音符(從0到11,需要4位)。

代碼如下:

wire[2:0]octave;

wire[3:0]note;

divide_by12 divby12(.numer(fullnote[5:0]),.quotient(octave),.remain(note));

此處用了一個叫divide_by12的子模塊來實現(xiàn)分頻。細節(jié)稍后講解。

步驟3

從一個八度到另一個八度,頻率乘以了“2”。這個在硬件上很容易實現(xiàn),我們在步驟4上進行實現(xiàn)。但是要從一個音符到另一個音符,頻率就要乘以1.0594。這樣的話就沒那么容易在硬件上實現(xiàn)了,所以我們需要看下提前計算好的音符值。

我們將主時鐘除以512得到音符A,除以483得到音符A#,除以456得到音符B…記住,除以一個更低的值得到的是更高的音符。

一個八度下的音符數(shù)值如下:

always@(note)

case(note)

0:clkdivider=512-1;// A

1:clkdivider=483-1;// A#/Bb

2:clkdivider=456-1;// B

3:clkdivider=431-1;// C

4:clkdivider=406-1;// C#/Db

5:clkdivider=384-1;// D

6:clkdivider=362-1;// D#/Eb

7:clkdivider=342-1;// E

8:clkdivider=323-1;// F

9:clkdivider=304-1;// F#/Gb

10:clkdivider=287-1;// G

11:clkdivider=271-1;// G#/Ab

12:clkdivider=0;// should never happen

13:clkdivider=0;// should never happen

14:clkdivider=0;// should never happen

15:clkdivider=0;// should never happen

endcase

always@(posedgeclk)if(counter_note==0)counter_note<=clkdivider;elsecounter_note<=counter_note-1;

每當(dāng)counter_note等于0時,就進入到下一個八度。

步驟4

現(xiàn)在我們要處理好不同的八度,對于最低的八度,我們將“counter_note”除以256,對于第二個八度,除以128,以此類推。

reg[7:0]counter_octave;

always@(posedgeclk)

if(counter_note==0)

begin

if(counter_octave==0)

counter_octave<=(octave==0?255:octave==1?127:octave==2?63:octave==3?31:octave==4?15:7);

else

counter_octave<=counter_octave-1;

end

regspeaker;

always@(posedgeclk)if(counter_note==0&&counter_octave==0)speaker<=~speaker;

完整代碼如下:

modulemusic(clk,speaker);

inputclk;

outputspeaker;

reg[27:0]tone;

always@(posedgeclk)tone<=tone+1;

wire[5:0]fullnote=tone[27:22];

wire[2:0]octave;

wire[3:0]note;

divide_by12 divby12(.numer(fullnote[5:0]),.quotient(octave),.remain(note));

reg[8:0]clkdivider;

always@(note)

case(note)

0:clkdivider=512-1;// A

1:clkdivider=483-1;// A#/Bb

2:clkdivider=456-1;// B

3:clkdivider=431-1;// C

4:clkdivider=406-1;// C#/Db

5:clkdivider=384-1;// D

6:clkdivider=362-1;// D#/Eb

7:clkdivider=342-1;// E

8:clkdivider=323-1;// F

9:clkdivider=304-1;// F#/Gb

10:clkdivider=287-1;// G

11:clkdivider=271-1;// G#/Ab

12:clkdivider=0;// should never happen

13:clkdivider=0;// should never happen

14:clkdivider=0;// should never happen

15:clkdivider=0;// should never happen

endcase

reg[8:0]counter_note;

always@(posedgeclk)if(counter_note==0)counter_note<=clkdivider;elsecounter_note<=counter_note-1;

reg[7:0]counter_octave;

always@(posedgeclk)

if(counter_note==0)

begin

if(counter_octave==0)

counter_octave<=(octave==0?255:octave==1?127:octave==2?63:octave==3?31:octave==4?15:7);

else

counter_octave<=counter_octave-1;

end

regspeaker;

always@(posedgeclk)if(counter_note==0&&counter_octave==0)speaker<=~speaker;

endmodule

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

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598915
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4771

    瀏覽量

    96170

原文標(biāo)題:大神教你DIY | 如何用一塊FPGA開發(fā)板制作音樂盒?!

文章出處:【微信號:EngicoolArabic,微信公眾號:電子工程技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA設(shè)計實例】如何用FPGA制作音樂盒并播放音樂【原創(chuàng)

    本帖最后由 eehome 于 2013-1-5 10:01 編輯 【FPGA設(shè)計實例】如何用FPGA制作音樂盒并播放音樂HDL設(shè)計設(shè)計
    發(fā)表于 03-08 14:14

    TurnipBit - DIY音樂盒

    音樂盒!  首先材料準(zhǔn)備,我們所需材料很簡單只需要:  1.TurnipBit開發(fā)板(我這個是朋友送的,可以從某寶上購買),給大家爆個照  2.隨便找個匹配大小的紙盒就行  3.需要一個外放,耳機喇叭都行
    發(fā)表于 07-18 16:24

    請問wifi音樂盒的是dlna的dmp嗎,有源代碼嗎?

    通過手機推送的音樂推送到wifi音樂盒去播放,wifi音樂盒的是dlna的dmp么,求源代碼。
    發(fā)表于 10-31 07:10

    基于單片機的數(shù)字音樂盒設(shè)計

    基于單片機的數(shù)字音樂盒設(shè)計,文檔包括電路圖,程序,論文基于單片機的音樂盒設(shè)計【摘要】本設(shè)計是一個基于AT89C51系列單片機的音樂盒,依據(jù)單片機技術(shù)原理,通過硬件電路制作以及軟件編譯,
    發(fā)表于 07-19 06:31

    單片機音樂盒完整代碼 精選資料分享

    單片機音樂盒完整代碼該設(shè)計是使用C51單片機制作音樂盒制作的一個音樂盒,可以實現(xiàn)進行歌曲的切換,暫停/播放。此外還增加了隨機點歌,獲取大氣
    發(fā)表于 07-22 08:17

    音樂盒電路圖

    音樂盒電路圖,此電路能發(fā)出優(yōu)美的舞曲,可作為音樂盒使用。
    發(fā)表于 01-03 19:33 ?6804次閱讀
    <b class='flag-5'>音樂盒</b>電路圖

    單片機的音樂盒設(shè)計制作(C程序)

    本內(nèi)容提供了單片機的 音樂盒 設(shè)計制作(C程序)的詳細制作過程,當(dāng)您對單片機知識有一定的基礎(chǔ),看了這篇文章以后,也可以通過一片單片機外加幾個常用的電子元件,制作一個屬于自己
    發(fā)表于 08-17 11:28 ?1084次下載
    單片機的<b class='flag-5'>音樂盒</b>設(shè)計<b class='flag-5'>制作</b>(C程序)

    簡單音樂盒

    簡單音樂盒,是我大學(xué)的第一個作品,在大一寒假期末考試的時候的作品,希望能給大家一些幫助。
    發(fā)表于 12-15 14:19 ?8次下載

    基于單片機的音樂盒設(shè)計

    本設(shè)計是一個基于AT89C51系列單片機的音樂盒,依據(jù)單片機技術(shù)原理,通過硬件電路制作以及軟件編譯,設(shè)計制作出一個多功能多功能音樂盒。該音樂盒
    發(fā)表于 01-13 15:38 ?43次下載

    diy音樂盒制作

    DIY一個愛的音樂盒吧!盡情的炫耀你的專業(yè)知識吧,這件獨一無二的音樂盒,保證能讓她在閨蜜們面前打開禮物那一刻風(fēng)光無限!
    的頭像 發(fā)表于 08-18 10:40 ?2.1w次閱讀

    使用51單片機實現(xiàn)音樂盒的設(shè)計論文

    本設(shè)計是一個基于STC89C51RC系列單片機的音樂盒,依據(jù)單片機技術(shù)原理,通過硬件電路制作以及軟件編譯,設(shè)計制作出一個多功能多功能音樂盒。該音樂盒
    發(fā)表于 06-16 17:40 ?115次下載
    使用51單片機實現(xiàn)<b class='flag-5'>音樂盒</b>的設(shè)計論文

    Magicbit核心開發(fā)板制作簡單的雷達系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《Magicbit核心開發(fā)板制作簡單的雷達系統(tǒng).zip》資料免費下載
    發(fā)表于 11-15 14:52 ?0次下載
    <b class='flag-5'>用</b>Magicbit核心<b class='flag-5'>開發(fā)板</b><b class='flag-5'>制作</b><b class='flag-5'>簡單</b>的雷達系統(tǒng)

    夜光音樂盒開源分享

    電子發(fā)燒友網(wǎng)站提供《夜光音樂盒開源分享.zip》資料免費下載
    發(fā)表于 11-23 09:36 ?1次下載
    夜光<b class='flag-5'>音樂盒</b>開源分享

    一種單片機控制的音樂盒制作

    電子發(fā)燒友網(wǎng)站提供《一種單片機控制的音樂盒制作.pdf》資料免費下載
    發(fā)表于 10-10 11:05 ?0次下載
    一種單片機控制的<b class='flag-5'>音樂盒</b><b class='flag-5'>制作</b>

    單片機制作音樂盒

    電子發(fā)燒友網(wǎng)站提供《單片機制作音樂盒.pdf》資料免費下載
    發(fā)表于 10-10 09:17 ?8次下載
    單片機<b class='flag-5'>制作</b><b class='flag-5'>音樂盒</b>