日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FPGA学习第2天--蜂鸣器实现歌曲《两只老虎》

發布時間:2024/1/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FPGA学习第2天--蜂鸣器实现歌曲《两只老虎》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

蜂鳴器簡介

蜂鳴器分類:
按照工作原理可分為:壓電式蜂鳴器和電磁式蜂鳴器;
按照音源可分為:有源蜂鳴器和無源蜂鳴器。
有源蜂鳴器:內部有振蕩源,直接通以直流電即可發出聲音;
無源蜂鳴器:內部無振蕩源,需要通以方波、PWM信號才能發出聲音。
無源蜂鳴器需要輸入一定頻率的方波或者PWM信號,蜂鳴器就可以發出聲音。輸入不同頻率的信號,蜂鳴器可以發出不同音色的聲音。
PWM:Pulse Width Modulation,脈沖寬度調制。


module beep_tiger(input wire clk,input wire rst_n,output reg beep ); //每個音符震動一次所占用的時鐘周期 //1秒 / 頻率 = 震動1次所用的時間 //震動1次所用的時間 / 20ns = 震動1次所用的周期 parameter DO = 16'd47755,//(50_000_000 / 1047)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;//單個音符持續最大時間的寄存器,以1秒鐘舉例,50_000_000次的時鐘周期 reg [25:0] note_cnt; //34個音符的寄存器 reg [5:0] music_data; //音符的頻率計數器(DO.RE.MI的頻率計數器)frequency counter reg [15:0] freq_cnt; //至少要16個位寬 //所有音符頻率的數據,存放整個樂譜 reg [15:0] freq_data;//單個音符持續最大時間的計數器 always@(posedge clk or negedge rst_n)beginif(!rst_n)note_cnt <= 0;else if(note_cnt == TIME_MAX )note_cnt <= 0;elsenote_cnt <= note_cnt + 1; end//34個音符切換的計數器 always@(posedge clk or negedge rst_n)beginif(!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)beginif(!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)beginif(!rst_n)freq_data <= DO;elsecase(music_data)6'd0 : freq_data <= DO;//16'd1 : freq_data <= RE;//26'd2 : freq_data <= MI;//36'd3 : freq_data <= DO;//16'd4 : freq_data <= DO;//16'd5 : freq_data <= RE;//26'd6 : freq_data <= MI;//36'd7 : freq_data <= DO;//16'd8 : freq_data <= MI;//36'd9 : freq_data <= FA;//46'd10 : freq_data <= SO;//56'd11 : freq_data <= MI;//36'd12 : freq_data <= FA;//46'd13 : freq_data <= SO;//56'd14 : freq_data <= SO;//56'd15 : freq_data <= LA;//66'd16 : freq_data <= SO;//56'd17 : freq_data <= FA;//46'd18 : freq_data <= MI;//36'd19 : freq_data <= DO;//16'd20 : freq_data <= SO;//56'd21 : freq_data <= LA;//66'd22 : freq_data <= SO;//56'd23 : freq_data <= FA;//46'd24 : freq_data <= MI;//36'd25 : freq_data <= DO;//16'd26 : freq_data <= RE;//26'd27 : freq_data <= SO;//56'd28 : freq_data <= DO;//16'd29 : freq_data <= DO;//0/16'd30 : freq_data <= RE;//26'd31 : freq_data <= SO;//56'd32 : freq_data <= DO;//16'd33 : freq_data <= DO;//0/1default : freq_data <= DO; endcase end//定義占空比 wire [14:0] duty_data;//assign duty_data = freq_data >> 1;//占空比50% assign duty_data = freq_data >> 2;//占空比25% //占空比小一點,蜂鳴器發出的聲音會清晰一點always@(posedge clk or negedge rst_n)beginif(!rst_n)beep <= 0;else if(freq_cnt >= duty_data)beep <= 1;elsebeep <= 0; endendmodule

總結

以上是生活随笔為你收集整理的FPGA学习第2天--蜂鸣器实现歌曲《两只老虎》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。