FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))
目錄
一、FPGA的晶振與定時(shí)器
二、定時(shí)器(led閃爍、蜂鳴器頻率控制)
1、時(shí)鐘上升沿、復(fù)位下降沿觸發(fā)
2、復(fù)位,計(jì)數(shù)器清零
3、計(jì)數(shù)滿(mǎn)1s時(shí),計(jì)數(shù)器清零
4-1、led閃爍(每秒)
4-2、蜂鳴器響(每毫秒)
代碼
三、蜂鳴器報(bào)警(多響)
1、初始化?
2、計(jì)數(shù)
3、蜂鳴器控制
代碼
?
一、FPGA的晶振與定時(shí)器
FPGA的晶振是50MHz,50MHz = 50_000_000Hz = 1/50_000_000s = 20ns
即每次時(shí)鐘(clk)上升沿(posedge)每50Mhz(20ns)到來(lái)一次。
always@(posedge clk)
基于這個(gè)原理,就可以愉快地做定時(shí)的操作了。
首先要知道:2^26 = 67_108_864 > 50_000_000,所以可以設(shè)置二進(jìn)制長(zhǎng)度2^26。(即寬26)
reg [25:0] cnt
????????這里涉及到的蜂鳴器,和單片機(jī)的又不太一樣,我自己嘗試了一下直接給電平,它是響不了的,想讓它響好像只能給控制頻率,讓它響。
注:人耳能聽(tīng)到的頻率是90hz到15khz,所以你的驅(qū)動(dòng)源頻率須在此范圍之內(nèi)才能聽(tīng)到。
二、定時(shí)器(led閃爍、蜂鳴器頻率控制)
1、時(shí)鐘上升沿、復(fù)位下降沿觸發(fā)
//led燈定時(shí)(1s)
always@ (posedge clk, negedge rst_n)
2、復(fù)位,計(jì)數(shù)器清零
//按下復(fù)位鍵if (!rst_n)cnt <= 1'b0;
3、計(jì)數(shù)滿(mǎn)1s時(shí),計(jì)數(shù)器清零
//計(jì)數(shù)滿(mǎn)1selse if(cnt != 26'd49_999_999) //定時(shí)到1hz(即1s)cnt <= cnt + 1'b1;
4-1、led閃爍(每秒)
//led閃爍:1s計(jì)數(shù)滿(mǎn)elsebegin led <= ~led;cnt <= 1'b0;end
4-2、蜂鳴器響(每毫秒)
//蜂鳴器定頻率
always@ (posedge clk)
begin//計(jì)數(shù)滿(mǎn)if(!(cnt % 26'd49_999)) //定時(shí)到1khz(即1ms)beep <= ~beep;
end
代碼
//定時(shí)(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燈定時(shí)(1s)
always@ (posedge clk, negedge rst_n)
begin//按下復(fù)位鍵if (!rst_n)cnt <= 1'b0;//計(jì)數(shù)滿(mǎn)1selse if(cnt != 26'd49_999_999) //定時(shí)到1hz(即1s)cnt <= cnt + 1'b1;//led閃爍:1s計(jì)數(shù)滿(mǎn)elsebegin led <= ~led;cnt <= 1'b0;end
end//蜂鳴器按頻率響
always@ (posedge clk)
begin//計(jì)數(shù)滿(mǎn)if(!(cnt % 26'd49_999)) //定時(shí)到1khz(即1ms)beep <= ~beep;
endendmodule
三、蜂鳴器報(bào)警(多響)
這里實(shí)驗(yàn)效果是:響4聲、停一會(huì)。
實(shí)驗(yàn)原理:蜂鳴器響是通過(guò)根據(jù)頻率控制的,如果想讓它斷斷續(xù)續(xù)地鳴叫,可以給它限值頻帶,頻帶范圍內(nèi)控制它響,不在頻帶范圍內(nèi)就不讓它響。
這里由于需要響四聲,停一下,我設(shè)置通頻帶范圍:
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、初始化?
//蜂鳴器報(bào)警(頻帶控制)
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、計(jì)數(shù)
周期2s(28'd99_999_999從0開(kāi)始算的,即100MHz)?
//計(jì)數(shù)
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、蜂鳴器控制
設(shè)置了四個(gè)頻帶,在頻帶范圍就響,不在就不響。
//蜂鳴器控制
always@(posedge clk)
begin //第一個(gè)頻帶(第一聲)if(cnt < 27'd6_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第二個(gè)頻帶(第二聲)else if(cnt > 27'd12_500_000 && cnt < 27'd18_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第三個(gè)頻帶(第三聲)else if(cnt > 27'd25_000_000 && cnt < 27'd31_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第四個(gè)頻帶(第四聲)else if(cnt > 27'd37_500_000 && cnt < 27'd43_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;endend
代碼
//蜂鳴器報(bào)警(頻帶控制)
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//計(jì)數(shù)
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 //第一個(gè)頻帶(第一聲)if(cnt < 27'd6_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第二個(gè)頻帶(第二聲)else if(cnt > 27'd12_500_000 && cnt < 27'd18_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第三個(gè)頻帶(第三聲)else if(cnt > 27'd25_000_000 && cnt < 27'd31_250_000)beginif(cnt%27'd49_999==0)beep <= ~beep;end//第四個(gè)頻帶(第四聲)else if(cnt > 27'd37_500_000 && cnt < 27'd43_750_000)beginif(cnt%27'd49_999==0)beep <= ~beep;endend endmodule
總結(jié)
以上是生活随笔為你收集整理的FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FPGA(3)验证数字逻辑(与门、与非门
- 下一篇: FPGA(5)数码管静态显示与动态显示