`

实验六 按键防抖动实验

 
阅读更多

实验原理

若要使用开发板上面的四个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

    实验六-按键防抖动.docx

    西南交通数电实验,按键防抖动较难

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

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

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

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

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

    swjtu数字逻辑与计算机组成原理实验7报告

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

    按键去抖检测:持续按下不低于20mS,认为是有效按下,否则认为是抖动。内含北航夏宇闻verilog语法入门.ppt

    北邮 数电实验-双色点阵扫描显示控制器(包含vhdl、仿真及报告)

    (2)用按键进行字符切换,要求为按键设计防抖动电路。 (3)实验板上输入时钟选择 1kHz。 基本思路: (1) BUPTZJ 是六个字符,用模 6 计数器; (2) 用 8×8 点阵显示字符,用模 8 计数器; (3) 在任何一个时刻,点阵...

    按键消抖电路

    用触发器、计数器、和适当门电路设计的按键消抖电路,可以消除按键的机械抖动

    走马灯_数电_

    ? 设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路

    双色扫描管_vhdl_双色扫描管_

    设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路。

    走马灯_扫描_vhdl_走马灯_

    ? 设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路。

    VHDL 北邮数电实验四发光二极管走马灯.zip

    发光二极管走马灯电路设计与实现 设计并实现一个控制 16 个发光二极管亮灭的电路,仿真验证其功能,并下 ...(3)两个模式可用按键进行切换,要求为按键设计防抖动电路; (4)实验板上输入时钟选择 100Hz。

    LED_发光二极管走马灯电路_

    设计并实现一个控制 16 个发光二极管亮灭的电路,仿真验证其功能,并下 载到实验板测试。 (1) 单点移动模式:从左至右依次... (3)两个模式可用按键进行切换,要求为按键设计防抖动电路; (4)时钟频率选择 100Hz。

    ATMEGAL128键盘控制程序

    3、去抖动:采样、延时、再采样,两次结果相同,即确定有效。 4、显示部分,我们控制的位选信号,段码部分全部设置为有效。 5、按键部分,我们读取的是行信号,列信号全部设置为低电平。 知识点: 1、I/...

    实验四-电子密码锁的设计.doc

    数字密码输入部分一般用键盘加防抖动电路和键盘译码电路组成。这里结合SE- 3实验箱,采用十二路开关来模拟0~9十个数字和加锁按钮、解锁按钮。输入部分由输入 译编码器组成,用四位信号来模拟十二个数字信号。 密码...

    矩阵扫描实验

    矩阵扫描实验完整报告(VHDL),含有去抖动,键盘弹起…… 仿真,对应ucf管脚约束,对于初学者不可谓不给力!

    Xilinx FPGA工程例子源码 VERILOG设计源码学习资料合集 (78个).zip

    xilinx 3s400开发板厂家光盘源码(按键防抖动).zip Xilinx DDR2存储器接口调试代码.rar Xilinx DDR3最新VHDL代码(通过调试).rar Xilinx EDK工程一例MicroBlaze内置USB固件程序.rar Xilinx EDK设计试验.rar Xilinx ISE...

    2019年基于单片机的多功能秒表课程设计83327933.doc.doc

    单片机课程设计 题 目 基于单片机的 多功能秒表 ...对于按键的设计,采用了防抖动的程序设计,使系统的性 能得到进一步的提升。当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并 执行键功能程序,因此按下不

    (整理)单片机与键盘设计..doc

    晶振:频率为12MHz的晶振 一个采用采用+5伏的电源89C52单片机 一个八路反向驱动集成块 5个一千欧姆的电阻 九个单触点开关 具体设计: 软件功能流程图: 软件实现键位扫描、消除抖动、键码转换、键码发送等功能。...

Global site tag (gtag.js) - Google Analytics