FPGA蜂鸣器实现歌曲《两只老虎》
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蜂鸣器实现歌曲《两只老虎》相关推荐
- 蜂鸣器播放《两只老虎》
文章目录 前言 一.回顾蜂鸣器 二.乐谱知识 2.1 音符音频 2.2 两只老虎乐谱 三.系统框图 四.模块调用 五.模块原理图 六.工程源码 6.1 音符选择模块代码 6.2 pwm产生模块代码 6 ...
- FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例
** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...
- C51蜂鸣器演奏两只老虎
/*两只老虎**/ #include<reg52.h> sbit Buzz = P1^6; //声明绑定蜂鸣器 unsigned int code NoteFrequ[]={ 523, ...
- 用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》
本文介绍如何在HiSpark Wi-Fi IoT套件上,使用Harmony OS IoT硬件子系统的PWM接口 驱动蜂鸣器 播放音乐. 用PWM输出方波的API 鸿蒙系统IoT硬件子系统提供了PWM相 ...
- 51单片机两只老虎c语言程序,51单片机两只老虎仿真加代码
/*************************************************************************** 程序名称:program4-1.c 程序功能: ...
- 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)
/********************************************************************************* 项目:音频音乐盒 设计时间:201 ...
- 计算机打音乐两只老虎,两只老虎(音乐、汇编程序)
/* 程序效果:蜂鸣器发出两只老虎的音律 */ ORG 0000H AJMP START ORG 000BH AJMP TIM0 ORG 0030H START: MOV TMOD,#01H ...
- 2只老虎c语言课程设计,《两只老虎》教学设计(第一课时)
第六课:<兽王> <两只老虎> 教学内容:学唱<两只老虎>,欣赏<狮王进行曲> 教学目标: 1.指导同学用富有弹性和有活力的声音唱<两只老虎> ...
- 计算机弹奏两只老虎爱跳舞,原神风物之诗琴乐谱大全
原神风物之诗琴乐谱大全带给大家,这是很多小伙伴都非常期待的内容,最近原神风物之诗琴玩法引起了大家的注意,但是大家不知道弹什么,手心游戏小编就带给大家最全的乐谱介绍. 原神风物之诗琴乐谱大全 弹奏键位 ...
最新文章
- 微软与联合国环境规划署联手解决环境问题
- XML 需要用的空间
- php mysql 大量读取_PHP使用PDO从mysql读取大量数据处理详解
- IBASE category 设置为01的情况下 IBASE自动创建情况
- 多行并一行显示的两种方式(DB2)
- android高仿天天动听,Android仿天天动听歌曲自动滚动view
- 如何关闭小娜进程_Python多进程之进程间通信 - Pipe amp; Queue
- FISCO BCOS (六)———ubantu安装mysql5.7
- (转)机器学习算法比较
- linux下blast设计引物,下面是我设计的引物的BLAST结果,请大虾帮我解释一下。谢谢...
- 什么录播软件好用?超级好用的录屏软件在这里
- 夜神模拟器怎么打开开发者选项
- layui table 渲染动态列及列数据
- 文本输入框input实现字母大小写转换
- Echarts官网展示
- 记录yarn安装全局包,无法使用的问题:‘yo‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
- hdmi接口线_太厉害了!HDMI线还能这么用,以前不知道真是浪费了
- 怎么将wav转换成mp3
- thinkPHP6.0项目搭建
- 任天堂计划在2021年升级交换机控制台和主要游戏