按键延迟时间测试的Verilog实现(FPGA实验)

本次实验目的在于熟悉状态机的控制,需要实现的功能如下:
按下按键并保持然后松开
当保持时间小于1s时,一个led灯闪烁2次。
当保持时间小于2s大于1s时,一个led灯闪烁4次。
当保持时间大于2s时,四个led灯闪烁4次。
本次实验采用了状态机的思想控制,主要的细节包括:1.输入信号的缓冲;2输入信号的上升沿和下降沿的检测;3.不同延迟时间的跳转;4.按下计时和led闪烁计时器的各自设计;5,led闪烁的控制。
RTL代码如下:

module keykeeper(
	clk,
	rst,
	key_in,
	led,
	state_out,
	cnt,
	cnt_led,
	led_finish,
	time_flag_1,
	time_flag_2,
	key_pos,
	key_neg
	);
	
	input clk;
	input rst;
	input wire key_in;//输入信号
	output reg [3:0]led;//led信号
	output wire [1:0]state_out;//状态跳转输出
	output reg [15:0]cnt; //按下计时
	output reg [15:0]cnt_led;//led闪烁计时
	output reg led_finish;//led完成闪烁返回信号
	reg en_cnt;//按下计时使能信号
	
	reg key_temp_1;//信号缓冲同步
	reg key_temp_2;
	reg key_temp_3;//边沿寄存
	reg key_temp_4;
	
	reg en_cnt_led;
	
	output wire key_pos;//检测边沿信号
	output wire key_neg;
	
	output reg time_flag_1;
	output reg time_flag_2;
	
	//设置状态跳转
	reg [1:0]state;
	
	assign state_out = state;
	
	localparam
		s0 = 2'b00,
		s1 = 2'b01,
		s2 = 2'b10,
		s3 = 2'b11;
	
	//两级缓冲器对输入信号进行同步
	always@(posedge clk or negedge rst)
		if(!rst)
		begin
			key_temp_1 <= 1'b1;
			key_temp_2 <= 1'b1;
		end
		else	
		begin
			key_temp_1 <= key_in;
			key_temp_2 <= key_temp_1;
		end		
	
	//检测key_in的下降沿和上升沿
	always@(posedge clk or negedge rst)
		if(!rst)
		begin
			key_temp_3 <= 1'b1;
			key_temp_4 <= 1'b1;
		end
		else	
		begin
			key_temp_3 <= key_temp_2;
			key_temp_4 <= key_temp_3;
		end
	assign key_pos = (key_temp_3)&&(!key_temp_4);
	assign key_neg = (!key_temp_3)&&(key_temp_4);
	
	//设置计数使能信
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值