zynq实战篇3-key_beep

在这里插入图片描述
按键防抖:检测到按键信号稳定后,再过20ms

按键防抖(先准备一个延迟时钟,)
module key_debounce(
	input 		clk			,//50mhz,t=20ns											
	input		rst_n		,
	
	input 		key			,

	output reg 	key_value	,
	output reg 	key_flag
    );
reg [19:0]	cnt;		//20ms-->20_000_000/20=1_000_000
reg			key_reg;	//存储按键上一周期的状态

//按键稳定且保持20ms
always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		cnt 	<= 0;
		key_reg	<= 1'b1;			//按键默认状态为高电平
	end else begin
		key_reg <= key;
		if(key_reg != key) 			//如果按键状态发生改变
			cnt <= 20'd100_0000;	//20ms准备好
		else begin					//如果按键状态不发生改变
				if(cnt > 20'b0)		//延迟20ms
					cnt <= cnt - 20'b1;
				else 
					cnt <= 20'b0;		
		end
	end
end  
 //看按键什么时候消抖完成 
 always @ (posedge clk or negedge rst_n) begin
 	if(!rst_n) begin
		key_value	<= 1'b1;
		key_flag	<= 1'b0;
 	end else begin
 		if (cnt == 20'd1) begin//如果20ms延迟过了,为什么不是=0
 			key_value	<= key;//因为如果=0时,cnt还是一直=0
 			key_flag 	<= 1'b1;//key_flag就一直=1,没有周期性了(1个周期内cnt=1的次数为一次)
 		end else begin
 			key_value	<= key_value;
 			key_flag 	<= 1'b0;
 		end
 	end
 end 
endmodule

 蜂鸣器控制
module beep_control(
	input 		clk			,//50mhz,t=20ns											
	input		rst_n		,
	
	input 		key			,

	output reg 	key_value	,
	output reg 	key_flag	,
	output reg 	beep			
    );
    
always @ (posedge clk or negedge rst_n) begin
	if(!rst_n)
		beep <= 1'b1;//默认值为高电平
	else if (key_flag && (key_value == 1'b0))//按键,按下(value=0)
		beep <= ~beep;
end

endmodule
例化文件
module top_key_beep(
	input 		clk			,//50mhz,t=20ns											
	input		rst_n		,
	
	input 		key			,
	output 		beep	
    );

//因为是内部的变量所以是线网类型的    
wire key_value;
wire key_flag;
//module例化
key_debounce u_key_debounce(
	.clk		(clk)		,//50mhz,t=20ns											
	.rst_n		(rst_n)		,
	             
	.key		(key)		,

	.key_value	(key_value)	,
	.key_flag	(key_flag)
    );
    
 beep_control u_beep_control(
	.clk		(clk)		,//50mhz,t=20ns											
	.rst_n		(rst_n)		,
                
	.key		(key)		,
              
	.key_value	(key_value)	,
	.key_flag	(key_flag)	,
	.beep		(beep)	//beep默认是wire类型
    );
endmodule

io配置
set_property PACKAGE_PIN U18 [get_ports clk]
set_property PACKAGE_PIN J15 [get_ports rst_n]
set_property PACKAGE_PIN L20 [get_ports {key}]
set_property PACKAGE_PIN G18 [get_ports {beep}]

set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {key}]
set_property IOSTANDARD LVCMOS33 [get_ports {beep}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值