生活随笔
收集整理的這篇文章主要介紹了
FPGA学习第2天--蜂鸣器实现歌曲《两只老虎》
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
蜂鳴器簡介
蜂鳴器分類:
按照工作原理可分為:壓電式蜂鳴器和電磁式蜂鳴器;
按照音源可分為:有源蜂鳴器和無源蜂鳴器。
有源蜂鳴器:內(nèi)部有振蕩源,直接通以直流電即可發(fā)出聲音;
無源蜂鳴器:內(nèi)部無振蕩源,需要通以方波、PWM信號才能發(fā)出聲音。
無源蜂鳴器需要輸入一定頻率的方波或者PWM信號,蜂鳴器就可以發(fā)出聲音。輸入不同頻率的信號,蜂鳴器可以發(fā)出不同音色的聲音。
PWM:Pulse Width Modulation,脈沖寬度調(diào)制。
module
beep_tiger(input wire clk
,input wire rst_n
,output reg beep
);
parameter DO
= 16'd47755
,RE
= 16'd42553
,MI
= 16'd37907
,FA
= 16'd35790
,SO
= 16'd31887
,LA
= 16'd28409
,SI
= 16'd25419
;
parameter TIME_MAX
= 26'd25_000_000
- 1;
reg
[25:0] note_cnt
;
reg
[5:0] music_data
;
reg
[15:0] freq_cnt
;
reg
[15:0] freq_data
;
always@
(posedge clk or negedge rst_n
)begin
if(!rst_n
)note_cnt
<= 0;else if(note_cnt
== TIME_MAX
)note_cnt
<= 0;elsenote_cnt
<= note_cnt
+ 1;
end
always@
(posedge clk or negedge rst_n
)begin
if(!rst_n
)music_data
<= 0;else if((music_data
== 6'd33
) && (note_cnt
== TIME_MAX
))music_data
<= 0;else if(note_cnt
== TIME_MAX
)music_data
<= music_data
+ 1;elsemusic_data
<= music_data
;
end
always@
(posedge clk or negedge rst_n
)begin
if(!rst_n
)freq_cnt
<= 0;else if(freq_cnt
== freq_data
)freq_cnt
<= 0;elsefreq_cnt
<= freq_cnt
+ 1;
end
always@
(posedge clk or negedge rst_n
)begin
if(!rst_n
)freq_data
<= DO
;elsecase(music_data
)6'd0
: freq_data
<= DO
;6'd1
: freq_data
<= RE
;6'd2
: freq_data
<= MI
;6'd3
: freq_data
<= DO
;6'd4
: freq_data
<= DO
;6'd5
: freq_data
<= RE
;6'd6
: freq_data
<= MI
;6'd7
: freq_data
<= DO
;6'd8
: freq_data
<= MI
;6'd9
: freq_data
<= FA
;6'd10
: freq_data
<= SO
;6'd11
: freq_data
<= MI
;6'd12
: freq_data
<= FA
;6'd13
: freq_data
<= SO
;6'd14
: freq_data
<= SO
;6'd15
: freq_data
<= LA
;6'd16
: freq_data
<= SO
;6'd17
: freq_data
<= FA
;6'd18
: freq_data
<= MI
;6'd19
: freq_data
<= DO
;6'd20
: freq_data
<= SO
;6'd21
: freq_data
<= LA
;6'd22
: freq_data
<= SO
;6'd23
: freq_data
<= FA
;6'd24
: freq_data
<= MI
;6'd25
: freq_data
<= DO
;6'd26
: freq_data
<= RE
;6'd27
: freq_data
<= SO
;6'd28
: freq_data
<= DO
;6'd29
: freq_data
<= DO
;6'd30
: freq_data
<= RE
;6'd31
: freq_data
<= SO
;6'd32
: freq_data
<= DO
;6'd33
: freq_data
<= DO
;default : freq_data
<= DO
; endcase
end
wire
[14:0] duty_data
;
assign duty_data
= freq_data
>> 2;
always@
(posedge clk or negedge rst_n
)begin
if(!rst_n
)beep
<= 0;else if(freq_cnt
>= duty_data
)beep
<= 1;elsebeep
<= 0;
endendmodule
總結(jié)
以上是生活随笔為你收集整理的FPGA学习第2天--蜂鸣器实现歌曲《两只老虎》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。