FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例
**
FPGA实现蜂鸣器播放音乐
**
实现功能:
开发板上电后,通过蜂鸣器播放《两只老虎》。
设计思路
原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期,再结合开发板具体的系统时钟周期,便可计算出每个音符对应多少个系统时钟周期个数,通过对这些个数计数,便可控制蜂鸣器播放不同的音符,也就能播放歌曲。
例:音符1(dou)的频率是523HZ,它的周期是:1/523s,换算成ns是1912045ns,开发板时钟系统频率如果是50MHZ,则每个系统时钟周期是20ns,所以上述是1912045/20个系统周期个数。
具体每个音符的频率可参照下图对照表:
音符与频率对照表
《两只老虎》简谱
代码(全):
module beep_music (
//输入与输出信号定义
input clk ,
input rst_n,
output beep
);
//中间信号定义
reg [16:0] cnt0 ; //产生PWM的计数器
wire add_cnt0;
wire end_cnt0;
reg [7:0] cnt1 ; //每个音符持续时间的计数器
wire add_cnt1;
wire end_cnt1;
reg [5:0] cnt2 ; //《两只老虎》共32个音节
wire add_cnt2;
wire end_cnt2;
reg [16:0] pre_set ; //存放每个音节的频率在系统中的时钟个数
//每个音符对应的系统周期计数,中音
localparam M1=95602, //音符1do
M2=85178, //音符rui
M3=75872, //音符mi
M4=71633, //音符fa
M5=63775, //音符so
M6=56818, //音符la
M7=50607; //音符xi
//每个音符对应的系统周期计数,低音音符so,频率392
//周期是1/392s,换算成ns是2551020ns,每个
//系统时钟周期是20ns,所以上述是2551020/20个系统周期个数127,551
localparam D5=127551; //音符so,低音
//每个音节的频率在系统时钟周期下对应的系统周期个数
//--------------------------------------------
//比如:音符1的频率是523HZ,它的周期是1/523s,换算成ns是1912045ns,每个
//系统时钟周期是20ns,所以上述是1912045/20个系统周期个数,即cnt0的计数
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt0<=0;
end
else if(add_cnt0)begin
if(end_cnt0)
cnt0<=0;
else
cnt0<=cnt0 1;
end
end
assign add_cnt0=1'b1;
assign end_cnt0=add_cnt0 && cnt0==pre_set-1;
assign beep=(cnt0>=(pre_set/2))?1:0; //每个音符的占空比为50%
//每个音符持续一段时间
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt1<=0;
end
else if(add_cnt1)begin
if(end_cnt1)
cnt1<=0;
else
cnt1<=cnt1 1;
end
end
assign add_cnt1=end_cnt0;
assign end_cnt1=add_cnt1 && cnt1==150-1;
//计32个音符(两只老虎共32音节)
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt2<=0;
end
else if(add_cnt2)begin
if(end_cnt2)
cnt2<=0;
else
cnt2<=cnt2 1;
end
end
assign add_cnt2=end_cnt1;
assign end_cnt2=add_cnt2 && cnt2==32-1;
//存放歌曲的简谱
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
pre_set<=0;
end
else begin
case(cnt2)
0:pre_set<=M1;
1:pre_set<=M2;
2:pre_set<=M3;
3:pre_set<=M1;
4:pre_set<=M1;
5:pre_set<=M2;
6:pre_set<=M3;
7:pre_set<=M1;
8:pre_set<=M3;
9:pre_set<=M4;
10:pre_set<=M5;
11:pre_set<=M3;
12:pre_set<=M4;
13:pre_set<=M5;
14:pre_set<=M5;
15:pre_set<=M6;
16:pre_set<=M5;
17:pre_set<=M4;
18:pre_set<=M3;
19:pre_set<=M1;
20:pre_set<=M5;
21:pre_set<=M6;
22:pre_set<=M5;
23:pre_set<=M4;
24:pre_set<=M3;
25:pre_set<=M1;
26:pre_set<=M2;
27:pre_set<=D5;
28:pre_set<=M1;
29:pre_set<=M2;
30:pre_set<=D5;
31:pre_set<=M1;
default:pre_set<=0;
endcase
end
end
endmodule
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfahja
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01