`

实验六 按键防抖动实验

 
阅读更多

实验原理

若要使用开发板上面的四个SW按键来做计数输入,就需要知道一共按了几下按键。
在这种情况下不能像以前设计电路中,简单地使用输入时钟的上升沿来检测按键是否按
下。因为,如果分频以后的时钟频率是10Hz,按键一下按了1 秒钟,那么如果简单地
以时钟的上升沿来检测按键,程序就会认为实际一共按了十下按键。
我们经常使用的键盘也存在这种情况,这里就需要一部分电路来防止上面情况的出
现。
如果要防抖动,就不能用时钟去检测按键的按下状态,而要去检测按键按下或者抬
起的边沿。例如按键按下的时候就检测与按键连接的FPGA 管脚的下降沿,按键松开
的时候就检测与按键连接的FPGA 管脚的上升沿。这样就可以不用理会按键按下的时
间长度,根据按键按下或者抬起的次数来评定计数。

实验内容

本次实验设计一个防抖动电路,用来检测按键的输入。设置一个计数器,初始数值
为零。用防抖动检测电路来检测SW按键的输入,每检测到一次按键的按下或者抬起,
计数器的数值加一。在数码管显示计数器的数值。

module seg(clk,rst_n,data_in,data_out,data_en);
	input          clk,rst_n                 ;
	input  [3 :0 ] data_in                   ;
	
	output [7 :0 ] data_out                  ;
	output [3 :0 ] data_en                   ;
	
	reg    [7 :0 ] data_out                  ;
	
assign data_en = 4'b1111                   ;

always @ ( posedge clk or negedge rst_n )
	if( !rst_n )
		data_out <= 8'b0000_0000 ;
	else
		begin
			case( data_in )
				4'b0000: data_out <= 8'b1111_1100 ;
				4'b0000: data_out <= 8'b0110_0000 ;
				4'b0000: data_out <= 8'b1101_1010 ;
				4'b0000: data_out <= 8'b1111_0010 ;
				4'b0000: data_out <= 8'b0110_0110 ;
				4'b0000: data_out <= 8'b1011_0110 ;
				4'b0000: data_out <= 8'b1011_1110 ;
				4'b0000: data_out <= 8'b1110_0000 ;
				4'b0000: data_out <= 8'b1111_1110 ;
				4'b0000: data_out <= 8'b1111_0110 ;
			endcase
		end	
endmodule  

 

module counter(
			clk,
			rst_n,
			data_in,
			data_out
			);
	input           clk,rst_n           ;
	input           data_in             ;
	
	output [3 :0 ]  data_out            ;
	
	reg    [3 :0 ]  data_out            ;
	
always @ ( posedge clk or negedge rst_n )
	if( !rst_n )
		data_out <= 4'b0000 ;
	else
		begin
			if( 1'b1 == data_in )
				begin
					if( 4'b1001 <= data_out )
						data_out <= 4'b0000 ;
					else
						data_out <= data_out + 4'b0001 ;
				end
			else
				data_out <= data_out ;
		end
		
endmodule

 

module debounce(
    clk,
    rst_n,
    key_i,
    key_o
    );

input   clk;
input   rst_n;
input   key_i;
output  key_o;

reg   key_o;

wire   key;
wire   clk_slow;    
    //分频电路
reg [22:0]  cnt;
reg [25:0]  cnt_out;
wire     key_o_reg ;
always @ ( posedge clk or negedge rst_n )
  if ( !rst_n ) 
   	cnt <= 23'd0;
  else 
  	cnt <= cnt + 1'b1;
  	
assign  clk_slow = cnt[22];
    
    //防反跳电路       
reg    temp_r  [2:0];
reg    key_r;
integer     i;
always @ ( posedge clk_slow or negedge rst_n )
  if ( !rst_n ) 
  	begin
  	 	for ( i = 0 ; i < 3; i = i+ 1)
        temp_r[i] <= 'd0;
    end
  else 
  	begin
      temp_r[0] <= key_i;
      temp_r[1] <= temp_r[0];
      temp_r[2] <= temp_r[1]; 
    end

assign key = (~temp_r[0]) & temp_r[1] & temp_r[2];
 
always @ ( posedge clk or negedge rst_n )
  if ( !rst_n ) 
    key_r <= 1'b0;
  else 
  	key_r <= key;

assign key_o_reg = key & (~key_r);   
/*
always @ ( posedge clk or negedge rst_n )
	if( !rst_n )
		key_o <= 1'b0 ;
	else
		begin
			if( cnt_out<='d33554432 )
				begin
					if( cnt_out=='d0 )
						begin
							if( key_o_reg )
								begin
									cnt_out <= 'd1 ;
									key_o <= 1'b1 ;
								end
							else
								begin
									cnt_out <= 'd0 ;
									key_o <= 1'b0 ;
								end
						end
					else
						cnt_out <= cnt_out + 'd1 ;
				end
			else
				cnt_out <= 'd0 ;
		end						      
*/
endmodule

 

module top_new(clk, 
           key_i, 
           rst_n, 
           data, 
           en);

    input clk;
    input key_i;
    input rst_n;
   output [7:0] data;
   output [3:0] en;
   
   wire [3:0] XLXN_1;
   wire XLXN_3;
   
   counter XLXI_1 (.clk(clk), 
                   .data_in(XLXN_3), 
                   .rst_n(rst_n), 
                   .data_out(XLXN_1[3:0]));
   debounce XLXI_2 (.clk(clk), 
                    .key_i(key_i), 
                    .rst_n(rst_n), 
                    .key_o(XLXN_3));
   seg XLXI_3 (.clk(clk), 
               .data_in(XLXN_1[3:0]), 
               .rst_n(rst_n), 
               .data_en(en[3:0]), 
               .data_out(data[7:0]));

endmodule

 

分享到:
评论

相关推荐

    数电实验-按键防抖动.pdf

    数电实验-按键防抖动.pdf 本文将对数电实验-按键防抖动.pdf 文件中的知识点进行详细的解释和分析。 一、 实验目的 本实验的目的是学习有限状态机的设计和信号边沿抖动的消除方法。有限状态机是一种基本的数字电路...

    实验六-按键防抖动.docx

    实验六-按键防抖动 本实验是西南交通大学数字电子技术实验的一部分,实验名称为按键防抖动设计。该实验的目的是设计和实现一个按键防抖动电路,能够过滤掉按键抖动的影响,输出稳定的信号。 实验电路图: 该实验...

    【swjtu】数电实验5_按键防抖动.zip

    用 Verilog HDL 设计一个按键防抖动电路,要求用有限状态机实现。防抖动电路的输入 接实验箱的按键,输出接 1 位十进制计数译码显示电路的时钟输入,实现每按一次按键计数 器加 1,多次测试不出现抖动现象。

    数字电子技术实验课程报告,verliog语言,按键防抖动

    交通大学,数字电子技术实验课程实验报告,verliog语言,含源码,仿真图,及引脚分配。按键防抖动,数电实验学习资料,仅供参考。

    西南交通大学数组(数电)实验7报告加代码:按键防抖动

    在本实验“西南交通大学数组(数电)实验7报告加代码:按键防抖动”中,我们将深入探讨数组在数字逻辑与计算机组成原理中的应用,以及一个特定的实践问题——按键防抖动技术。 在数字电路设计中,我们常常遇到按键...

    实验11 触摸按键实验.zip

    此外,可能还需要防抖动处理,以避免因快速触摸或机械振动引起的误触发。 为了使用户界面更加友好,我们还需要编写用户界面(UI)代码。这可能包括显示触摸按键的状态,如按下或释放,以及对应的反馈,如LED闪烁或...

    实验3 按键输入_KEYSTM32_TooMuchHappiness_

    总结来说,“实验3 按键输入_KEYSTM32_TooMuchHappiness_”涵盖了STM32的GPIO配置、中断处理、按键扫描和防抖动技术等核心知识点。通过这个实验,你可以深入理解STM32如何处理外部输入,为后续的嵌入式开发打下坚实...

    xiaos.rar_VHDL 防抖动

    防抖动技术是解决电子设备中开关信号(如键盘按键)在按下和释放瞬间可能产生的抖动问题,以确保系统能够准确识别和响应单次按键操作。 在实际应用中,当用户按下或释放键盘上的键时,由于机械结构和电磁干扰,开关...

    按键实验_按键去抖检测_

    在电子设计领域,按键实验是基础且重要的环节,特别是在嵌入式系统和数字逻辑设计中。本文将深入探讨“按键去抖检测”这一关键知识点,以及如何通过编程实现这一功能。我们将结合“按键实验.c”代码文件和“北航...

    8-单片机入门基础实验-独立按键实验.rar

    - 防抖动处理:由于机械按键在按下和释放过程中可能会产生多次脉冲,需要通过延时或去抖动算法来确保只响应一次按键动作。 4. **实验步骤** - 编写程序,设置I/O口为输入模式,并初始化。 - 实现按键扫描和防...

    西南交通大学数电实验5

    本次我们将深入探讨由龙文杰老师指导的数电实验5,该实验旨在让学生掌握数字电路中的关键概念——按键防抖动技术,并通过实际操作提升学生的实践能力。 实验5的主题是“按键防抖动”,这是电子工程中常见的一种问题...

    按键实验,关于stm32f130的按键控制实验代码.zip

    通过这个按键控制实验,你不仅可以掌握STM32F130的基本GPIO操作,还能了解中断处理和防抖动技术,这些都是嵌入式系统开发中的重要技能。同时,这个实验也为后续更复杂的项目,如多按键处理、按键扫描矩阵等奠定了...

    ACTEL FPGA 按键实现,防抖 libero

    在ACTEL FPGA中,我们可以创建一个状态机来处理按键的输入,这个状态机包含检测按键按下、等待稳定、检测按键释放等多个状态,以实现防抖动效果。具体来说,当检测到按键按下后,会进入一个延时周期,如果在此期间...

    嵌入式实验三 基于STM32按键及LED的显示.zip

    5. **错误处理**:考虑到实际应用中的干扰和不确定性,应加入适当的错误处理机制,例如防抖动处理,以防止按键快速按下/释放产生的误触发。 在进行这个实验时,你可能会使用诸如Keil MDK、IAR Embedded Workbench或...

    STM32F1按键输入实验

    总之,这个STM32F1按键输入实验涵盖了基本的GPIO配置、中断处理和防抖动技术。通过实践,开发者能够更好地理解和掌握STM32F1在实际应用中的输入处理能力,为更复杂的嵌入式系统设计打下坚实基础。

    实验5:按键_单片机_

    在处理按键事件时,还需要注意防抖动处理,因为机械按键在按下和释放过程中可能会产生多次电平跳变,防抖动可以避免误触发。 5. **软件实现**:可以使用STM32CubeMX配置GPIO并生成初始化代码,然后在main.c或其他...

    一个按键实验

    4. 防抖动处理:由于机械开关在按下或释放时可能会产生瞬间的抖动,导致误读,因此通常需要添加软件防抖动机制,比如延时几毫秒后再检测一次电平,确保按键状态稳定。 5. 错误处理:考虑可能出现的异常情况,如按键...

    北邮数电实验六随机数生成电路报告.pdf

    4. **防抖电路**:防抖电路是为了消除按键输入的抖动问题,确保稳定可靠的信号。在给定的VHDL代码中,`anti_shake_key`实体实现了这一功能,它监控按键输入,并确保在稳定的时钟周期内只响应一次按键操作。 5. **模...

    单片机按键读取实验仿真

    - **按键检测**:使用循环或中断方式检测按键状态,通常需要防抖动处理,避免因机械抖动导致误判。 - **按键处理**:当检测到按键按下,根据应用需求执行相应的功能,如点亮LED、发送数据等。 6. **实验步骤**: ...

Global site tag (gtag.js) - Google Analytics