(15)CT137A- 按键消抖设计

(1)设计定义:设计一个按键消抖模块,实现消除按键机械抖动的影响, 并实现以下功能:

  • 按下S1,LED1、LED8点亮,否则熄灭
  • 按下S2,LED2、LED7点亮,否则熄灭
  • 按下S3,LED3、LED6点亮,否则熄灭
  • 按下S4,LED4、LED5点亮,否则熄灭

(2)代码设计:

1.首先是20ms的计数器,一般来说,机械抖动的时间不会超过20ms。

2.状态机的定义和设计

复制代码
//状态机定义
always@(posedge clk or negedge reset_n)		
	if(!reset_n)begin
		state <= IDLE;
		en_cnt <= 1'd0;
	end
	else begin
		case(state)
			IDLE:begin
				if(key_in == 1'd0)begin
					state <= PRESS;
					en_cnt <= 1'd1;
				end
				else begin
					state <= state;
					en_cnt <= 1'd0;
				end			
			end
			PRESS:begin
				if(cnt == MCNT - 20'd1 && key_in == 1'd0)begin
					state <= DOWN;
					en_cnt <= 1'd0;
				end
				else if(key_in == 1'd1)begin
					state <= IDLE;
					en_cnt <= 1'd0;
				end
				else begin
					state <= state;
					en_cnt <= en_cnt;
				end
			end
			DOWN:begin
				if(key_in == 1'd1)begin
					state <= REPRESS;
					en_cnt <= 1'd1;
				end
				else begin
					state <= state;
					en_cnt <= 1'd0;
				end
			end
			REPRESS:begin
				if(cnt == MCNT - 20'd1 && key_in == 1'd1)begin
					state <= IDLE;
					en_cnt <= 1'd0;
				end
				else if(key_in == 1'd0)begin
					state <= DOWN;
					en_cnt <= 1'd0;
				end
				else begin
					state <= state;
					en_cnt <= en_cnt;
				end
			end
			default:begin
				state <=	IDLE;
				en_cnt <= 1'd0;
			end
		endcase
	end

附上顶层文件:

复制代码
module key_filter_top
(
	input		wire				clk 		,
	input		wire				reset_n	,
	input		wire	[3:0]		key_in	,  //{S4,S3,S2,S1}
	
	output	wire	[7:0]		LED	
);

key_filter		key_filter_inst0
(
	.clk			(clk		),
	.reset_n		(reset_n	),
	.key_in		(key_in[0]),
	
	.key_out		(),
	.LED1			(LED[0]),
	.LED2			(LED[7])
);

key_filter		key_filter_inst1
(
	.clk			(clk		),
	.reset_n		(reset_n	),
	.key_in		(key_in[1]),
	
	.key_out		(),
	.LED1			(LED[1]),
	.LED2			(LED[6])
);

key_filter		key_filter_inst2
(
	.clk			(clk		),
	.reset_n		(reset_n	),
	.key_in		(key_in[2]),
	
	.key_out		(),
	.LED1			(LED[2]),
	.LED2			(LED[5])
);

key_filter		key_filter_inst3
(
	.clk			(clk		),
	.reset_n		(reset_n	),
	.key_in		(key_in[3]),
	
	.key_out		(),
	.LED1			(LED[3]),
	.LED2			(LED[4])
);

endmodule

(3)实验现象:

  • 按下S1
  • 按下S2
  • 按下S4
  • 同时按下S2,S3
  • 同时按下S1、S4
相关推荐
Saniffer_SH1 小时前
【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
运维·服务器·网络·人工智能·驱动开发·fpga开发·硬件工程
会编程是什么感觉...1 小时前
硬件 - 常见通信协议整合
单片机·嵌入式硬件·fpga开发
Saniffer_SH1 小时前
【每日一题】讲讲PCIe链路训练和枚举的前后关系
运维·服务器·网络·数据库·驱动开发·fpga开发·硬件工程
s09071367 小时前
ZYNQ 中 AXI BRAM 的使用详细的说明。
fpga开发·zynq
哎呦喂研究院11 小时前
FPGA:重构硬件逻辑的柔性算力核心,国产替代的破局关键
fpga开发
国科安芯19 小时前
国产RISC-V架构MCU在工控系统中的节能性分析
网络·单片机·嵌入式硬件·fpga开发·性能优化·架构·risc-v
博览鸿蒙21 小时前
集成电路基础知识经典问答(面向 FPGA 工程师版)
fpga开发
s09071361 天前
Xilinx FPGA 中ADC 数据下变频+ CIC 滤波
算法·fpga开发·fpga·zynq
9527华安1 天前
FPGA纯verilog实现JESD204B协议,基于AD9208数据接收,提供工程源码和技术支持
fpga开发·xilinx·jesd204b·ad9208·uv9p·vcu118
范纹杉想快点毕业1 天前
FPGA面试百问:从基础到实战全解析
fpga开发