1、简谱中的符号含义

2、两只老虎简谱

3、音符与频率的对照表

4、首先在这里解释一个名词→音乐频率——众所周知,声音是由物体的振动产生的,本质是传播媒介的振动,另外声音有两大特性——音量和音色,我们又知道振动幅度决定音量,波形和传播媒介决定音色;而在这里我们需要考虑的便是音量,即低音、中音和高音;因此,我们只需要考虑音源的振动频率即可。在这里我们又知道我们的音源只有一个,那便是我们开发板上的蜂鸣器(开发板上蜂鸣器的也可以是外接蜂鸣器)。振动频率以“Hz”(赫兹)为单位,赫兹(Hz)是指每秒周期运动次数。

由音符与频率的对照表可以知道低音DO 的频率是262Hz,但是我们的系统时钟是50MHz(这里以50MHz为例,也有可能是其它频率),所以50MHz ÷ 262Hz便是低音DO在0.5s时间内的重复次数。

低音DO的重复次数:50MHz ÷ 262Hz = 190839·········后面的计算和低音DO 的计算方法相同,完全一样,在这里就不做赘述了。

5、模块框图

6、工程源码

.v文件

/* ============================================================================= *\
*    Author                     : 星·回
*    Filename                   : beep_two_tigers.v
*    Create Date                : 2022/12/21
*    Module Name                :
*    Project Name               :
*    Description                : 蜂鸣器实现“两只老虎”
*    Called by                  :
*    Target Device              : EP4CE10F17C8
*    Tool versions              : Quartus Prime 18.1
*    Create Date                : 2022/12/21
*    Revision【修订】            : 1.0
*    Email                      :
*    Company                    :
*    Copyright(c) 2022 【版权】
*    Additional Comments【备注】 :
\* ============================================================================= */module beep_two_tigers (
/**************************************端口说明************************************/input       clk      ,input       rst_n    ,output   reg   beep
);/***********************************  参数定义  ***********************************/parameter   TIME_500MS =   24_999_999   ;   //0.5s计数值parameter   L1         =   190839       ;   //低音"哆"音调分频计数值(频率262)parameter   L2         =   170067       ;   //低音"来"音调分频计数值(频率294)parameter   L3         =   151514       ;   //低音"咪"音调分频计数值(频率330)parameter   L4         =   143265       ;   //低音"发"音调分频计数值(频率349)parameter   L5         =   127550       ;   //低音"梭"音调分频计数值(频率392)parameter   L6         =   113635       ;   //低音"拉"音调分频计数值(频率440)parameter   L7         =   101214       ;   //低音"西"音调分频计数值(频率494)parameter   M1         =   95602        ;   //中音"哆"音调分频计数值(频率523)parameter   M2         =   85178        ;   //中音"来"音调分频计数值(频率587)parameter   M3         =   75872        ;   //中音"咪"音调分频计数值(频率659)parameter   M4         =   71633        ;   //中音"发"音调分频计数值(频率698)parameter   M5         =   63775        ;   //中音"梭"音调分频计数值(频率784)parameter   M6         =   56818        ;   //中音"拉"音调分频计数值(频率880)parameter   M7         =   50607        ;   //中音"西"音调分频计数值(频率988)parameter   H1         =   47801        ;   //高音"哆"音调分频计数值(频率1046)parameter   H2         =   42553        ;   //高音"来"音调分频计数值(频率1175)parameter   H3         =   37936        ;   //高音"咪"音调分频计数值(频率1318)parameter   H4         =   35790        ;   //高音"发"音调分频计数值(频率1397)parameter   H5         =   31887        ;   //高音"梭"音调分频计数值(频率1568)parameter   H6         =   28409        ;   //高音"拉"音调分频计数值(频率1760)parameter   H7         =   25303        ;   //高音"西"音调分频计数值(频率1976)/********************************** 内部信号声明 **********************************/
reg      [27:0]       cnt_500ms            ;//500ms计数器
wire                  add_cnt_500ms        ;//开始计数
wire                  end_cnt_500ms        ;//结束计数reg      [4:0]        freq_cnt             ;//音符计数器
wire                  add_freq_cnt         ;//开始计数
wire                  end_freq_cnt         ;//结束计数reg      [17:0]       freq_data            ;//32个音符的寄存器,寄存32个音符
wire     [17:0]       duty_data            ;//占空比数据reg      [19:0]       freq_value           ;//计数每个音符对应的频率
wire                  add_freq_value       ;//开始计数
wire                  end_freq_value       ;//结束计数/*************************************功能定义*************************************/
//0.5s计数器→500ms计数器
always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt_500ms <= 0 ;else if(add_cnt_500ms)beginif(end_cnt_500ms)cnt_500ms <= 0 ;elsecnt_500ms <= cnt_500ms + 1'b1;endelsecnt_500ms <= cnt_500ms  ;
end //end alwaysassign  add_cnt_500ms = 1'b1    ;
assign  end_cnt_500ms = add_cnt_500ms && cnt_500ms == TIME_500MS ;//freq_cnt  音符计数器
always@(posedge clk or negedge rst_n)beginif(!rst_n)freq_cnt <= 0 ;else if(add_freq_cnt)beginif(end_freq_cnt)freq_cnt <= 0 ;elsefreq_cnt <= freq_cnt + 1'b1;endelsefreq_cnt <= freq_cnt  ;
end //end alwaysassign  add_freq_cnt = end_cnt_500ms    ;
assign  end_freq_cnt = add_freq_cnt && freq_cnt == 31;//两只老虎乐谱(32个音符)
always @(*) begincase (freq_cnt)0  :    freq_data   =    M1     ;1  :    freq_data   =    M2     ;2  :    freq_data   =    M3     ;3  :    freq_data   =    M1     ;4  :    freq_data   =    M1     ;5  :    freq_data   =    M2     ;6  :    freq_data   =    M3     ;7  :    freq_data   =    M1     ;8  :    freq_data   =    M3     ;9  :    freq_data   =    M4     ;10 :    freq_data   =    M5     ;11 :    freq_data   =    M3     ;12 :    freq_data   =    M4     ;13 :    freq_data   =    M5     ;14 :    freq_data   =    M5     ;15 :    freq_data   =    M6     ;16 :    freq_data   =    M5     ;17 :    freq_data   =    M4     ;18 :    freq_data   =    M3     ;19 :    freq_data   =    M1     ;20 :    freq_data   =    M5     ;21 :    freq_data   =    M6     ;22 :    freq_data   =    M5     ;23 :    freq_data   =    M4     ;24 :    freq_data   =    M3     ;25 :    freq_data   =    M1     ;26 :    freq_data   =    M2     ;27 :    freq_data   =    L5     ;28 :    freq_data   =    M1     ;29 :    freq_data   =    M2     ;30 :    freq_data   =    L5     ;31 :    freq_data   =    M1     ;default:    freq_data   =    M1     ;endcase
end //end always//freq_value 计数每个音符对应的频率
always@(posedge clk or negedge rst_n)beginif(!rst_n)freq_value <= 0 ;else if(add_freq_value)beginif(end_freq_value)freq_value <= 0 ;elsefreq_value <= freq_value + 1'b1;endelsefreq_value <= freq_value  ;
end //end alwaysassign  add_freq_value = 1'b1    ;
assign  end_freq_value = add_freq_value && freq_value == freq_data - 1'b1;//设置50%占空比:音阶分频计数值的一半即为占空比的高电平数
assign duty_data = freq_data >> 1;//输出beep
always@(posedge clk or negedge rst_n)beginif(!rst_n)beep <= 1;else if(freq_value>duty_data)beep <= 0;elsebeep <= 1;
end //end alwaysendmodule

tb文件

/* ============================================================= *\
*    Author                     : 星·回
*    Filename                   : beep_two_tiger_tb.v
*    Create Date                : 2022/12/21
*    Module Name                :
*    Project Name               : beep_two_tiger
*    Description                : 蜂鸣器实现“两只老虎”
*    Create Date                : 2022/12/21
*    Revision【修订】            : 1.0
*    Email                      :
*    Company                    :
*    Copyright(c) 2022 【版权】
*    Additional Comments【备注】:
\* ============================================================= */
`timescale 1ns/1ns     //  时间单位/时间精度
module beep_two_tiger_tb ();//激励信号
reg          clk        ;
reg          rst_n      ;
//输出信号
wire         beep      ;parameter   L1    =  100    ,//低音L2    =  150    , L3    =  250    , L4    =  300    , L5    =  350    , L6    =  400    , L7    =  450    ,M1    =  100     ,//中音M2    =  150     ,M3    =  200     ,M4    =  250     ,M5    =  300     ,M6    =  350     ,M7    =  400     ;beep_two_tigers  u_beep_two_tigers(.clk    ( clk   )  ,.rst_n  ( rst_n )  ,.beep   ( beep  )
);initial beginclk = 1'b1 ;rst_n = 1'b1 ;#20rst_n = 1'b0 ;#30rst_n = 1'b1 ;#20rst_n = 1'b0 ;#10rst_n = 1'b1 ;end
always #10 clk=~clk ;endmodule

7、总结

本次使用蜂鸣器实现播放两只老虎音乐实验的上板现象音乐较为难以入耳,但是仔细听还是能听出来有那种感觉的,在后续的实践中可能会寻求改进。

FPGA蜂鸣器实现歌曲《两只老虎》相关推荐

  1. 蜂鸣器播放《两只老虎》

    文章目录 前言 一.回顾蜂鸣器 二.乐谱知识 2.1 音符音频 2.2 两只老虎乐谱 三.系统框图 四.模块调用 五.模块原理图 六.工程源码 6.1 音符选择模块代码 6.2 pwm产生模块代码 6 ...

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

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

  3. C51蜂鸣器演奏两只老虎

    /*两只老虎**/ #include<reg52.h> sbit Buzz = P1^6; //声明绑定蜂鸣器 unsigned int code NoteFrequ[]={   523, ...

  4. 用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》

    本文介绍如何在HiSpark Wi-Fi IoT套件上,使用Harmony OS IoT硬件子系统的PWM接口 驱动蜂鸣器 播放音乐. 用PWM输出方波的API 鸿蒙系统IoT硬件子系统提供了PWM相 ...

  5. 51单片机两只老虎c语言程序,51单片机两只老虎仿真加代码

    /*************************************************************************** 程序名称:program4-1.c 程序功能: ...

  6. 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)

    /********************************************************************************* 项目:音频音乐盒 设计时间:201 ...

  7. 计算机打音乐两只老虎,两只老虎(音乐、汇编程序)

    /* 程序效果:蜂鸣器发出两只老虎的音律 */ ORG 0000H AJMP START ORG 000BH AJMP TIM0 ORG 0030H START:     MOV TMOD,#01H ...

  8. 2只老虎c语言课程设计,《两只老虎》教学设计(第一课时)

    第六课:<兽王> <两只老虎> 教学内容:学唱<两只老虎>,欣赏<狮王进行曲> 教学目标: 1.指导同学用富有弹性和有活力的声音唱<两只老虎> ...

  9. 计算机弹奏两只老虎爱跳舞,原神风物之诗琴乐谱大全

    原神风物之诗琴乐谱大全带给大家,这是很多小伙伴都非常期待的内容,最近原神风物之诗琴玩法引起了大家的注意,但是大家不知道弹什么,手心游戏小编就带给大家最全的乐谱介绍. 原神风物之诗琴乐谱大全 弹奏键位 ...

最新文章

  1. 微软与联合国环境规划署联手解决环境问题
  2. XML 需要用的空间
  3. php mysql 大量读取_PHP使用PDO从mysql读取大量数据处理详解
  4. IBASE category 设置为01的情况下 IBASE自动创建情况
  5. 多行并一行显示的两种方式(DB2)
  6. android高仿天天动听,Android仿天天动听歌曲自动滚动view
  7. 如何关闭小娜进程_Python多进程之进程间通信 - Pipe amp; Queue
  8. FISCO BCOS (六)———ubantu安装mysql5.7
  9. (转)机器学习算法比较
  10. linux下blast设计引物,下面是我设计的引物的BLAST结果,请大虾帮我解释一下。谢谢...
  11. 什么录播软件好用?超级好用的录屏软件在这里
  12. 夜神模拟器怎么打开开发者选项
  13. layui table 渲染动态列及列数据
  14. 文本输入框input实现字母大小写转换
  15. Echarts官网展示
  16. 记录yarn安装全局包,无法使用的问题:‘yo‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  17. hdmi接口线_太厉害了!HDMI线还能这么用,以前不知道真是浪费了
  18. 怎么将wav转换成mp3
  19. thinkPHP6.0项目搭建
  20. 任天堂计划在2021年升级交换机控制台和主要游戏

热门文章

  1. ipad Linux双系统,传13英寸iPad将使用双系统
  2. Android控件——ViewFlipper的使用,垂直滚动广告条
  3. Eclipse(JavaEE)创建JavaWeb项目简单流程
  4. 基于Android Fragment功能的例子
  5. 经典电影台词系列【6】——东邪西毒
  6. NetCms修改之三:相关新闻的Bug及其修正
  7. 创建user应用与User表
  8. 近红外二区荧光AgAuSe合金化量子点,第二近红外窗口(NIR-II,900-1700 nm)荧光量子点
  9. 记录PHP实现第三方支付接口实现方法(发起支付、支付结果回调)
  10. 如何巧用大数据分析工具快速实现模型灰度发布