基于FPGA的音乐蜂鸣器设计

电子说

1.3w人已加入

描述

基于 FPGA的音乐蜂鸣器设计

设计背景

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。在一般设计中,可利用蜂鸣器检测有些按键是否按下,或者有些功能是否正常等,当然如果足够浪漫,也可以让蜂鸣器演奏音乐。


 

设计原理

FPGA

本设计使用的是无源蜂鸣器,也可称为声响器,原理电路图如下所示。它没有内部驱动电路,无源蜂鸣器工作的理想信号为方波,如果给直流,蜂鸣器是不响应的,因为磁路恒定,钼片不能震动发音。根据电路图可知,由于 FPGA 的驱动能力不够,这里增加了一个三极管来驱动这个无源蜂鸣器。在驱动时,只需要向蜂鸣器发送一定频率的方波,就可以使蜂鸣器发声。那么应该发送怎样的频率呢?具体则可参考下表(音节频率表)

FPGA

乐曲能连续演奏所需要的两个基本数据是:组成乐曲的每个音符的频率值(音调)和每个音符持续的时间(音长)。因此只要控制 FPGA输出到蜂鸣器的激励信号频率的高低和持续时间,就可以使蜂鸣器发出连续的乐曲声。在本设计中,由于至芯开发板的晶振为 50MHz,所以我们需要一个一个分频模块(PLL)产生一个较低的基准频率(1MHz)。还需要一个空间储存乐谱,由于乐谱是固定的不需要更改,所以我们选择 ROMIP 核进行存储。基准频率 1MHz 可分频得到所有不同频率的信号。最大的分频比为1_000_000/262/2。既然是音乐,那么就需要节拍,一般采用 4 拍,即音长为 0.25s,所以还需设计一个模块,控制每 0.25s,ROM 地址加 1,。如果需要发送一个低音 1 并维持 1 秒,则只需要在 ROM 的连续四个地址中写入低音 1 的对应信息即可。在设计中为了方便在 ROM 中储存数据,这里数据格式为 8’hAB,其中 A 暂时为三个值 1、2、4,分别表示低音、中音、高音。B 暂时为七个值 1、2、3、4、5、6、7。比如要产生一个低音 1,只需在 ROM中存储 8’h11,如要产生一个高音 7,只需在 ROM中存储 8’h47,以此类推即可。这时,就需要一个解码模块,将 ROM 中的数据还原成音乐发生器所需要的数据。


 

设计架构图

根据上述的分析,得到如下的架构图

FPGA

本设计包括 6 个模块,PLL 模块把 50MHz 的时钟信号降到 1MHz,rom 模块存储音乐数据,time_counter 是一个计数模块,产生节拍,每到 0.25s,输出的 time_finsh 变为一个周期的高电平。并发送给addr_gen 模块,产生 addr,让 rom 输出下一个地址的数据。rom 输出的数据 rom_data 输入到 decode 解码模块,将解码后的数据music_data 输入到 music_gen 模块,通过计数器,如果计数器小于music_data 的值,则 beep 保持不变,否则,beep 取反,并且计数器

清 1,从而产生特定的方波频率。


 

设计代码

time_counter 模块代码如下:

addr_gen 模块代码如下:

decode 解码模块代码如下:

music_gen 模块代码如下:

beep 顶层模块代码如下:

仿真图

仿真结果如下:

由仿真图可知:当 rom 输出 rom_data 为 8’h16 时,代表输出低音6,解码后结果 music_data 为 1136,输出的 beep 频率为 440Hz,与实际低音 6 的音节频率表的值一致;当 rom 输出 rom_data 为 8’h22时,代表输出中音 2,解码后结果 music_data 为 851,输出的 beep频率为 563Hz,与实际中音 2 的音节频率表的值相差 24Hz,存在一定的误差,但是不影响乐曲的播放。如果想提高 beep 频率的精度,减小误差,则可以将 1MHz 的基准频率提高。

责任编辑:lq


 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分