目录
一、FPGA的晶振与定时器
二、定时器(led闪烁、蜂鸣器频率控制)
1、时钟上升沿、复位下降沿触发
2、复位,计数器清零
3、计数满1s时,计数器清零
4-1、led闪烁(每秒)
4-2、蜂鸣器响(每毫秒)
代码
一、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时,计数器清零
//计数满1s
else if(cnt != 26'd49_999_999) //定时到1hz(即1s)
cnt <= cnt + 1'b1;
4-1、led闪烁(每秒)
//led闪烁:1s计数满
else
begin
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;
//计数满1s
else if(cnt != 26'd49_999_999) //定时到1hz(即1s)
cnt <= cnt + 1'b1;
//led闪烁:1s计数满
else
begin
led <= ~led;
cnt <= 1'b0;
end
end
//蜂鸣器按频率响
always@ (posedge clk)
begin
//计数满
if(!(cnt % 26'd49_999)) //定时到1khz(即1ms)
beep <= ~beep;
end
endmodule