目录

  • 原理
  • 实现

原理

蜂鸣器分为有源蜂鸣器和无源蜂鸣器,即以有无震荡源分类,
有震荡源直接通直流电就可发生,无震荡源则需要通震荡波才能发声。
这里介绍无源蜂鸣器播放音乐的方法。
思路:
利用计数器产生pwm波形
根据乐谱设置震荡周期
给蜂鸣器赋值

注:一个音符响一个周期不在人耳的感知范围内,一般一个音符需要重复200以上个周期可以清楚的听到

注:音符周期计算:时钟频率 / 音符频率 = 音符周期数
或者 音符周期 / 时钟周期

实现

这里实现的《两只老虎》

三个计数器
cnt0 计数音符周期
cnt1 计数一个音符响的次数
cnt2 计数总的音符个数

两个参数
一个音符周期预设值
一个音符周期占空比

代码

module pwm_beep2(input clk,input rst_n,output reg beep
);parameter M1 = 17'd95600;
parameter M2 = 17'd85150;
parameter M3 = 17'd75850;
parameter M4 = 17'd71600;
parameter M5 = 17'd63750;
parameter M6 = 17'd56800;
parameter M7 = 17'd50600;reg [16:0] cnt0;//音符周期计数器
wire add_cnt0;
wire end_cnt0;reg [8:0] cnt1;//音符重复次数计数器
wire add_cnt1;
wire end_cnt1;reg [4:0] cnt2;//音符总次数
wire add_cnt2;
wire end_cnt2;reg   [16:0] preset_note;//预设音符周期数
wire    [16:0] preset_duty;//占空比
//音符周期计数
always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 17'b0;endelse if(add_cnt0)beginif(end_cnt0)begincnt0 <= 17'b0;endelse begincnt0 <= cnt0 +1'b1;endend
end
assign add_cnt0 = 1'b1;
assign end_cnt0 = add_cnt0 && (cnt0 == preset_note - 1);//音符重复次数
always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <= 9'b0;endelse if(add_cnt1)beginif(end_cnt1)begincnt1 <= 9'b0;endelse begincnt1 <= cnt1 +1'b1;endend
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && (cnt1 == 299);//音符总次数
always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt2 <= 5'b0;endelse if(add_cnt2)beginif(end_cnt2)begincnt2 <= 5'b0;endelse begincnt2 <= cnt2 +1'b1;endend
end
assign add_cnt2 = end_cnt1;
assign end_cnt2 = add_cnt2 && (cnt2 == 31);//给音符周期赋值 对照乐谱的音符位置赋值
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginpreset_note <= 17'b0;endelse begincase(cnt2)6'd0    :   preset_note <= M1;6'd1    :   preset_note <= M2;6'd2    :   preset_note <= M3;6'd3    :   preset_note <= M1;6'd4    :   preset_note <= M1;6'd5    :   preset_note <= M2;6'd6    :   preset_note <= M3;6'd7    :   preset_note <= M1;6'd8    :   preset_note <= M3;6'd9    :   preset_note <= M4;6'd10   :   preset_note <= M5;6'd11   :   preset_note <= M3;6'd12   :   preset_note <= M4;6'd13   :   preset_note <= M5;6'd14   :   preset_note <= M5;6'd15   :   preset_note <= M6;6'd16   :   preset_note <= M5;6'd17   :   preset_note <= M4;6'd18   :   preset_note <= M3;6'd19   :   preset_note <= M1;6'd20   :   preset_note <= M5;6'd21   :   preset_note <= M6;6'd22   :   preset_note <= M5;6'd23   :   preset_note <= M4;6'd24   :   preset_note <= M3;6'd25   :   preset_note <= M1;6'd26   :   preset_note <= M2;6'd27   :   preset_note <= M5;6'd28   :   preset_note <= M1;6'd29   :   preset_note <= M2;6'd30   :   preset_note <= M5;6'd31   :   preset_note <= M1;default :   preset_note <= M1;endcaseend
end//给蜂鸣器赋值,并设定占空比
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginbeep <= 1'b1;endelse if(cnt0 <= preset_duty)beginbeep <= 1'b0;//蜂鸣器低电平有效endelse beginbeep <= 1'b1;end
end
assign preset_duty = preset_note >> 1;//50%占空比
endmodule

总结:不会之前感觉好难,学会之后感觉挺简单,就三个计数器,在合适的时候将周期值赋给参数就行。

蜂鸣器播放音乐 fpga实现相关推荐

  1. 【FPGA】五、蜂鸣器播放音乐

    文章目录 前言 一.蜂鸣器简介 二.音频音符简介 三.任务要求 四.程序设计 1.设计思路 2.程序代码 总结 前言 蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号.它是一种一 ...

  2. FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例

    ** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...

  3. FPGA蜂鸣器播放音乐

      最近做EDA课设,看到自己的买的板子上有蜂鸣器,所以就打算做一个FPGA控制蜂鸣器播放音乐.   这里我使用的板子是睿智助学的FPGA开发板,板子上的芯片是EP4CE6E22C8,如果是你使用的是 ...

  4. 单片机并行口控制蜂鸣器播放音乐

    要用单片机并行口控制蜂鸣器播放音乐,需要完成以下步骤: 设计音乐:需要先确定音乐的节拍和音符,并将其转换为代码中的数值. 设置并行口:需要将单片机的并行口配置为输出模式,以便控制蜂鸣器. 编写代码:需 ...

  5. MCU-51:单片机蜂鸣器播放音乐和提示音

    目录 一.蜂鸣器介绍 二.驱动电路 2.1 三极管驱动 2.2 集成电路驱动 三.蜂鸣器播放音乐 3.1 键盘与音符对照 3.2 音符与频率对照 3.3 简谱 四.代码演示 4.1 按键蜂鸣器播放提示 ...

  6. 51单片机_11-2 蜂鸣器播放音乐

    文章目录 要求 资源 main函数 要求 控制蜂鸣器播放音乐 资源 工程文件压缩包 链接:https://pan.baidu.com/s/1hA-aa0JRP33IlOYFNzKf7A 提取码:0id ...

  7. Arduino 蜂鸣器播放音乐LED灯闪烁

    一.实验所需组件: led灯 三脚蜂鸣器 面包板 Arduino开发板 杜邦线 二.实验原理 蜂鸣器实现音乐播放: 控制好频率和节拍,就能演奏出好听的音乐.因此,在实验之前要先弄清楚各音调的频率.可参 ...

  8. STC-B学习板蜂鸣器播放音乐

    功能:单片机烧录好程序后,按key1按键播放<IF YOU>,再次按key1可暂停播放,按key2可切换歌曲到<国际歌>,再按key3可切换歌曲到<孤勇者> 芯片: ...

  9. 鸿蒙开发板HI3861 利用蜂鸣器播放音乐 open Harmony1.0.0(附cmsis_os2.h源码)

    本文利用鸿蒙开发板HI3861在鸿蒙1.0.0源码下利用蜂鸣器播放音乐. pwm_buz.c #include <stdio.h> #include "ohos_init.h&q ...

最新文章

  1. DongLiORM 第二次更新
  2. php多线程 mysql_php通过共享内存,控制mysql连接数,多进程插入数据(pcnt学习四)...
  3. python写游戏棋牌游戏_使用python实现简单五子棋游戏
  4. NSTimeInterval和CMTime
  5. 211计算机实力末尾的学校,实力最弱的十所985大学是哪几所?选择末尾985好还是选211好?...
  6. 将给定数据源生成静态HTML页面持久化到项目之外的硬盘
  7. Confluence 6 配置索引语言
  8. android开发,assets下面的资源文件不会变化/改动
  9. LeetCode 247. 中心对称数
  10. 第四章:经典量化策略集锦(第八篇:CAPM模型的应用 )
  11. maya表情blendshape_带BlendShape表情的动作文件播放异常
  12. Accessing non existent property lineno of module
  13. Thinkpad X230 升级 AX210 wifi6 无线网卡
  14. 老鹰主机怎么样_HawkHost老鹰主机香港机房速度怎么样?
  15. 最新!抖音运营吸粉攻略分享
  16. matlab电路元件二极管,(强烈推荐)基于Matlab的电子线路的设计与仿真_毕业论文
  17. SAP SD MM PP HR FI CO EWM 等PA认证考试报名/指南/题库
  18. PB级企业电商离线数仓项目实战
  19. 全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
  20. C++畅玩五子棋项目

热门文章

  1. Elasticsearch的dynamic 与 index.mapper.dynamic
  2. SpringCloud 网关 Gateway
  3. overlayfs源代码解析
  4. 直通车roi提升优化方法 如何判断直通车权重高低
  5. 【JDK配置】雀氏纸尿裤,天才第一步
  6. vivos9设置繁体语言方法分享
  7. 传说之下怎么设置按键_《传说之下手机版》按键设置教程
  8. 机器人 python 路径规划_基于Q-learning的机器人路径规划系统(matlab)
  9. 为什么不要把鸡蛋放在同一个篮子里?
  10. 使用Java对书籍照片进行字符分割