FPGA按键消抖后实现流水灯控制

本文介绍了一个基于Verilog的按键消抖模块设计过程,包括原理图展示、代码实现及测试文件编写,并通过modulesim进行仿真验证。设计中利用计数器实现10ms的消抖延迟,确保了按键的有效识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步,依旧上原理图

 

 

 

 

 

 

 

 

 

 

第二部,编译代码,以及测试文件

module key_out(
		input wire sclk,
		input wire rst_n,
		input wire key_in,
		
		output reg key_out
);

reg [18:0]cnt;
parameter CNT_MAX=500000-1;  //这里边的数据是对的时钟周期,而1个时钟周期为20ns延时10ms足够

always@(posedge sclk or negedge rst_n)
		if(rst_n==0)
			cnt<=19'b0;
			else if (key_in==1)
				cnt<=19'b0;
				else if(cnt==CNT_MAX)
				cnt<=cnt;
				else
				cnt<=cnt+1'b1;
				
always@(posedge sclk or negedge rst_n)
		if(!rst_n)
		key_out<=1'b0;
		else if	(cnt==CNT_MAX-1)
			key_out<=1'b1;
			else
			key_out<=1'b0;
endmodule
module run_led(
	input wire sclk,
	input wire rst_n,
	input wire key_o,
	
	output reg [3:0] led
);
always@(posedge sclk or negedge rst_n)
	if(!rst_n)
		led<=4'b0001;
		else if(key_o==1)
			led<={led[2:0],led[3]};
endmodule
`timescale 1ns/1ns
module tb_o();
	reg sclk;  
	reg rst_n;  
	reg key_in; 
	wire key_out; 
	
initial
	begin
		sclk=0;
		rst_n<=0;
		key_in<=0;
		#20
		rst_n<=1;
		key_in<=1;
		#200
		key_in<=0;
		#2000
		key_in<=1;
		#500
		key_in<=0;
		#200
		key_in<=1;
		#200
		key_in<=0;
		#10000000
		key_in<=1;	
	end
	
always # 10 sclk=~sclk;

key_out	key_out_inst(
		.sclk		(sclk	),
		.rst_n		(rst_n	),
		.key_in		(key_in	),
		
		.key_out    (key_out)
);
 
endmodule

第三步,modulesim仿真

   补充说明,测试文件的#200延时是对于上一状态。仿真的信号分别是时钟、复位、输入按键、计数器、开关有效时钟周期。很多知识点还不是很理解。计数器要在输入按键处于高电平的时候清零,记到10ms的时候保持。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值