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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、FPGA的晶振與定時器

二、定時器(led閃爍、蜂鳴器頻率控制)

1、時鐘上升沿、復位下降沿觸發

2、復位,計數器清零

3、計數滿1s時,計數器清零

4-1、led閃爍(每秒)

4-2、蜂鳴器響(每毫秒)

代碼

三、蜂鳴器報警(多響)

1、初始化?

2、計數

3、蜂鳴器控制

代碼


?

一、FPGA的晶振與定時器

FPGA的晶振是50MHz,50MHz = 50_000_000Hz = 1/50_000_000s = 20ns

每次時鐘(clk)上升沿(posedge)每50Mhz(20ns)到來一次

always@(posedge clk)

基于這個原理,就可以愉快地做定時的操作了。

首先要知道:2^26 = 67_108_864 > 50_000_000,所以可以設置二進制長度2^26。(即寬26)

reg [25:0] cnt

????????這里涉及到的蜂鳴器,和單片機的又不太一樣,我自己嘗試了一下直接給電平,它是響不了的,想讓它響好像只能給控制頻率,讓它響。

注:人耳能聽到的頻率是90hz到15khz,所以你的驅動源頻率須在此范圍之內才能聽到。

二、定時器(led閃爍、蜂鳴器頻率控制)

1、時鐘上升沿、復位下降沿觸發

//led燈定時(1s)
always@ (posedge clk, negedge rst_n)

2、復位,計數器清零

//按下復位鍵if (!rst_n)cnt <= 1'b0;

3、計數滿1s時,計數器清零

//計數滿1selse if(cnt != 26'd49_999_999)	//定時到1hz(即1s)cnt <= cnt + 1'b1;

4-1、led閃爍(每秒)

//led閃爍:1s計數滿elsebegin led <= ~led;cnt <= 1'b0;end

4-2、蜂鳴器響(每毫秒)

//蜂鳴器定頻率
always@ (posedge clk)
begin//計數滿if(!(cnt % 26'd49_999))			//定時到1khz(即1ms)beep <= ~beep;				
end

代碼

//定時(led燈閃爍、蜂鳴器頻率控制)
//FPGA晶振是50MHz(即20ns)
module my_and(clk, rst_n, beep, led);input clk, rst_n;
output reg beep;
output reg led;reg [25:0] cnt;//led燈定時(1s)
always@ (posedge clk, negedge rst_n)
begin//按下復位鍵if (!rst_n)cnt <= 1'b0;//計數滿1selse if(cnt != 26'd49_999_999)	//定時到1hz(即1s)cnt <= cnt + 1'b1;//led閃爍:1s計數滿elsebegin led <= ~led;cnt <= 1'b0;end
end//蜂鳴器按頻率響
always@ (posedge clk)
begin//計數滿if(!(cnt % 26'd49_999))			//定時到1khz(即1ms)beep <= ~beep;				
endendmodule

三、蜂鳴器報警(多響)

這里實驗效果是:響4聲、停一會。

實驗原理:蜂鳴器響是通過根據頻率控制的,如果想讓它斷斷續續地鳴叫,可以給它限值頻帶頻帶范圍內控制它響,不在頻帶范圍內就不讓它響

這里由于需要響四聲,停一下,我設置通頻帶范圍:

1、27'd0~27'd6_250_000;

2、d12_500_000~27'd18_750_000;

3、27'd25_000_000~27'd31_250_000;

4、27'd37_500_000~27'd43_750_000;

周期:100MHz(2s)

1、初始化?

//蜂鳴器報警(頻帶控制)
module my_and(clk, rst_n, beep);input clk, rst_n;
output reg beep;
reg [28:0] cnt;initial
begincnt <= 1'b0;beep <= 1'b0;
end

2、計數

周期2s(28'd99_999_999從0開始算的,即100MHz)?

//計數
always@(posedge clk, negedge rst_n)
beginif(!rst_n)begin cnt <= 1'b0;endelse if(cnt != 28'd99_999_999)	//2scnt <= cnt + 1'b1;else cnt <= 1'b0;		//清空
end

3、蜂鳴器控制

設置了四個頻帶,在頻帶范圍就響,不在就不響。

//蜂鳴器控制
always@(posedge clk)
begin //第一個頻帶(第一聲)if(cnt < 27'd6_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第二個頻帶(第二聲)else if(cnt > 27'd12_500_000 && cnt < 27'd18_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第三個頻帶(第三聲)else if(cnt > 27'd25_000_000 && cnt < 27'd31_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第四個頻帶(第四聲)else if(cnt > 27'd37_500_000 && cnt < 27'd43_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;endend 

代碼

//蜂鳴器報警(頻帶控制)
module my_and(clk, rst_n, beep);input clk, rst_n;
output reg beep;
reg [28:0] cnt;initial
begincnt <= 1'b0;beep <= 1'b0;
end//計數
always@(posedge clk, negedge rst_n)
beginif(!rst_n)begin cnt <= 1'b0;endelse if(cnt != 28'd99_999_999)	//2scnt <= cnt + 1'b1;else cnt <= 1'b0;		//清空
end//蜂鳴器控制
always@(posedge clk)
begin //第一個頻帶(第一聲)if(cnt < 27'd6_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第二個頻帶(第二聲)else if(cnt > 27'd12_500_000 && cnt < 27'd18_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第三個頻帶(第三聲)else if(cnt > 27'd25_000_000 && cnt < 27'd31_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第四個頻帶(第四聲)else if(cnt > 27'd37_500_000 && cnt < 27'd43_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;endend endmodule

總結

以上是生活随笔為你收集整理的FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))的全部內容,希望文章能夠幫你解決所遇到的問題。

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