基于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 中的数据还原成音乐发生器所需要的数据。
设计架构图
根据上述的分析,得到如下的架构图
本设计包括 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
-
FPGA
+关注
关注
1629文章
21736浏览量
603385 -
ROM
+关注
关注
4文章
572浏览量
85769 -
蜂鸣器
+关注
关注
12文章
891浏览量
45948
原文标题:FPGA入门课程 音乐蜂鸣器设计
文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计william hill官网 】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论