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定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA(3)验证数字逻辑(与门、与非门
- 下一篇: FPGA(5)数码管静态显示与动态显示