FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制)

目录

一、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)到来一次

[email protected](posedge clk)

基于这个原理,就可以愉快地做定时的操作了。

首先要知道:2^26 = 67_108_864 > 50_000_000,所以可以设置二进制长度2^26。(即宽26)

reg [25:0] cnt

        这里涉及到的蜂鸣器,和单片机的又不太一样,我自己尝试了一下直接给电平,它是响不了的,想让它响好像只能给控制频率,让它响。

注:人耳能听到的频率是90hz到15khz,所以你的驱动源频率须在此范围之内才能听到。

二、定时器(led闪烁、蜂鸣器频率控制)

1、时钟上升沿、复位下降沿触发

//led灯定时(1s)
[email protected] (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、蜂鸣器响(每毫秒)

//蜂鸣器定频率
alway[email protected] (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)
[email protected] (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

//蜂鸣器按频率响
[email protected] (posedge clk)
begin
	//计数满
	if(!(cnt % 26'd49_999))			//定时到1khz(即1ms)
			beep <= ~beep;				
end

endmodule

猜你喜欢

转载自blog.csdn.net/great_yzl/article/details/121373917

相关文章