(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
相关推荐
国科安芯3 小时前
抗辐照MCU芯片在激光雷达领域的适配性分析
网络·人工智能·单片机·嵌入式硬件·fpga开发
数字IC吗喽4 小时前
三、ILA逻辑分析仪抓取及查看波形
fpga开发
bnsarocket7 小时前
Verilog和FPGA的自学笔记8——按键消抖与模块化设计
笔记·fpga开发·verilog·自学·硬件编程
奋斗的牛马10 小时前
FPGA—ZYNQ学习GPIO-EMIO,MIO,AXIGPIO(五)
单片机·嵌入式硬件·学习·fpga开发·信息与通信
FPGA_ADDA12 小时前
基于VU13P的6U VPX 载板
fpga开发·信号处理·xcvu13p
KOAN凯擎小妹1 天前
晶振信号质量:上升下降时间与占空比
单片机·嵌入式硬件·fpga开发·信息与通信
cmc10281 天前
148.PCIE参考时钟无法绑定
fpga开发
我爱C编程1 天前
【硬件片内测试】基于FPGA的完整BPSK链路测试,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·定时·bpsk·帧同步·卷积编码·维特比译码·频偏估计
FPGA_小田老师1 天前
FPGA基础知识(十一):时序约束参数确定--从迷茫到精通
fpga开发·时序约束·建立时间·保持时间·约束参数计算
FPGA_小田老师1 天前
FPGA基础知识(十二):详解跨时钟域约束
fpga开发·时序约束·跨时钟域·约束完整性