0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

学会这些,用FPGA开发板制作音乐盒就是这么简单!

电子工程技术 来源:YXQ 2019-08-12 17:11 次阅读

相信大家已经在网上见识过很多“民间大神”们的天才(奇葩)手工DIY了,一些简简单单的材料在他们的捣鼓下,瞬间华丽转身,变废为宝。今天,我们为大家整理了一位手工大神的DIY心得——如何利用FPGA开发板DIY一个音乐盒,也就是如何使我们的FPGA播放声音和音乐!

首先需生成单个音调,然后慢慢地做更有趣的事情,如制作警报声和播放曲调。

需要准备的硬件

该项目使用的是一个Pluto的FPGA开发板,还有一个扬声器和一个1kΩ的电阻

更加直观的展示是下面这样的:

本次DIY的音乐盒分为4个部分:

1.简单的哔哔声

2.警报声

3.音调

4.曲子

1.简单的哔哔声

FPGA可以轻松实现二进制计数器。例如,在回滚之前,16位计数器将从0到65535(65536个不同的值)计数。Pluto板具有一个25MHz的时钟振荡器,因此我们可以轻松构建一个25MHz时钟16位自动计数器。其最高位切换频率为25000000/65536 = 381Hz。

VerilogHDL的代码如下:

modulemusic(clk,speaker);

inputclk;

outputspeaker;

// 首先创建一个16位二级制计数器

reg[15:0]counter;

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

// 使用计数器的最高有效位来驱动扬声器

assignspeaker=counter[15];

endmodule

详细讲解的话就是,“clk”在25MHz下运行,“counter [0]”看起来像是一个12.5MHz信号(它以25MHz的频率进行更新变化,变化的值为0 1 0 1 ......因此看起来像12.5MHz信号),“counter [1]“是6.125MHz信号,依此类推。

由于我们使用计数器的最高有效位(第15位)来驱动输出,因此“扬声器”输出会产生一个完美的381Hz方波信号。

2.警报声

我们可以在两个音调之间循环。我们首先用一个24位计数器的“音调”来产生一个较慢的方波。其MSB(最高有效位)“tone[23]”是一1.5Hz的频率进行变换的。

然后我们就可以用这个最高有效位切换到另一个计数器,从而在两个频率之间切换。

代码如下:

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.演奏音符

现在我们想要演奏一首曲子,所以需要来获取不同的音符,就像电子琴一样。

如果我们用6位来实现音符,那么我可以获得64个音符。每个八度一共有12个音符,所以64个音符可以实现5个八度,完全足够弹奏一首曲目了。

步骤1

要想实现一组音调不断升高的声音,我们用一个28位计数器来距离,提取其中6个MSB,从而给到6位的音调。

代码如下:

reg[27:0]tone;

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

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

在25MHz的时钟下,每个音符持续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的子模块来实现分频。细节稍后讲解。

步骤3

从一个八度到另一个八度,频率乘以了“2”。这个在硬件上很容易实现,我们在步骤4上进行实现。但是要从一个音符到另一个音符,频率就要乘以1.0594。这样的话就没那么容易在硬件上实现了,所以我们需要看下提前计算好的音符值。

我们将主时钟除以512得到音符A,除以483得到音符A#,除以456得到音符B…记住,除以一个更低的值得到的是更高的音符。

一个八度下的音符数值如下:

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;

每当counter_note等于0时,就进入到下一个八度。

步骤4

现在我们要处理好不同的八度,对于最低的八度,我们将“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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21736

    浏览量

    603214
  • 开发板
    +关注

    关注

    25

    文章

    5046

    浏览量

    97429

原文标题:大神教你DIY | 如何用一块FPGA开发板制作音乐盒?!

文章出处:【微信号:EngicoolArabic,微信公众号:电子工程技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA设计实例】如何用FPGA制作音乐盒并播放音乐【原创

    本帖最后由 eehome 于 2013-1-5 10:01 编辑 【FPGA设计实例】如何用FPGA制作音乐盒并播放音乐HDL设计设计
    发表于 03-08 14:14

    TurnipBit - DIY音乐盒

    音乐盒!  首先材料准备,我们所需材料很简单只需要:  1.TurnipBit开发板(我这个是朋友送的,可以从某宝上购买),给大家爆个照  2.随便找个匹配大小的纸盒就行  3.需要一个外放,耳机喇叭都行
    发表于 07-18 16:24

    请问wifi音乐盒的是dlna的dmp吗,有源代码吗?

    通过手机推送的音乐推送到wifi音乐盒去播放,wifi音乐盒的是dlna的dmp么,求源代码。
    发表于 10-31 07:10

    基于单片机的数字音乐盒设计

    基于单片机的数字音乐盒设计,文档包括电路图,程序,论文基于单片机的音乐盒设计【摘要】本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,
    发表于 07-19 06:31

    单片机音乐盒完整代码 精选资料分享

    单片机音乐盒完整代码该设计是使用C51单片机制作音乐盒制作的一个音乐盒,可以实现进行歌曲的切换,暂停/播放。此外还增加了随机点歌,获取大气
    发表于 07-22 08:17

    音乐盒电路图

    音乐盒电路图,此电路能发出优美的舞曲,可作为音乐盒使用。
    发表于 01-03 19:33 6963次阅读
    <b class='flag-5'>音乐盒</b>电路图

    简单音乐盒

    简单音乐盒,是我大学的第一个作品,在大一寒假期末考试的时候的作品,希望能给大家一些帮助。
    发表于 12-15 14:19 8次下载

    基于单片机的音乐盒设计

    本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒
    发表于 01-13 15:38 45次下载

    diy音乐盒制作

    DIY一个爱的音乐盒吧!尽情的炫耀你的专业知识吧,这件独一无二的音乐盒,保证能让她在闺蜜们面前打开礼物那一刻风光无限!
    的头像 发表于 08-18 10:40 2.1w次阅读

    使用51单片机实现音乐盒的设计论文

    本设计是一个基于STC89C51RC系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒
    发表于 06-16 17:40 120次下载
    使用51单片机实现<b class='flag-5'>音乐盒</b>的设计论文

    Magicbit核心开发板制作简单的雷达系统

    电子发烧友网站提供《Magicbit核心开发板制作简单的雷达系统.zip》资料免费下载
    发表于 11-15 14:52 0次下载
    <b class='flag-5'>用</b>Magicbit核心<b class='flag-5'>开发板</b><b class='flag-5'>制作</b><b class='flag-5'>简单</b>的雷达系统

    夜光音乐盒开源分享

    电子发烧友网站提供《夜光音乐盒开源分享.zip》资料免费下载
    发表于 11-23 09:36 1次下载
    夜光<b class='flag-5'>音乐盒</b>开源分享

    可编程音乐盒的构建

    电子发烧友网站提供《可编程音乐盒的构建.zip》资料免费下载
    发表于 06-28 09:31 7次下载
    可编程<b class='flag-5'>音乐盒</b>的构建

    一种单片机控制的音乐盒制作

    电子发烧友网站提供《一种单片机控制的音乐盒制作.pdf》资料免费下载
    发表于 10-10 11:05 0次下载
    一种单片机控制的<b class='flag-5'>音乐盒</b><b class='flag-5'>制作</b>

    单片机制作音乐盒

    电子发烧友网站提供《单片机制作音乐盒.pdf》资料免费下载
    发表于 10-10 09:17 8次下载
    单片机<b class='flag-5'>制作</b><b class='flag-5'>音乐盒</b>