实验原理
若要使用开发板上面的四个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 文件中的知识点进行详细的解释和分析。 一、 实验目的 本实验的目的是学习有限状态机的设计和信号边沿抖动的消除方法。有限状态机是一种基本的数字电路...
实验六-按键防抖动 本实验是西南交通大学数字电子技术实验的一部分,实验名称为按键防抖动设计。该实验的目的是设计和实现一个按键防抖动电路,能够过滤掉按键抖动的影响,输出稳定的信号。 实验电路图: 该实验...
用 Verilog HDL 设计一个按键防抖动电路,要求用有限状态机实现。防抖动电路的输入 接实验箱的按键,输出接 1 位十进制计数译码显示电路的时钟输入,实现每按一次按键计数 器加 1,多次测试不出现抖动现象。
交通大学,数字电子技术实验课程实验报告,verliog语言,含源码,仿真图,及引脚分配。按键防抖动,数电实验学习资料,仅供参考。
在本实验“西南交通大学数组(数电)实验7报告加代码:按键防抖动”中,我们将深入探讨数组在数字逻辑与计算机组成原理中的应用,以及一个特定的实践问题——按键防抖动技术。 在数字电路设计中,我们常常遇到按键...
此外,可能还需要防抖动处理,以避免因快速触摸或机械振动引起的误触发。 为了使用户界面更加友好,我们还需要编写用户界面(UI)代码。这可能包括显示触摸按键的状态,如按下或释放,以及对应的反馈,如LED闪烁或...
总结来说,“实验3 按键输入_KEYSTM32_TooMuchHappiness_”涵盖了STM32的GPIO配置、中断处理、按键扫描和防抖动技术等核心知识点。通过这个实验,你可以深入理解STM32如何处理外部输入,为后续的嵌入式开发打下坚实...
防抖动技术是解决电子设备中开关信号(如键盘按键)在按下和释放瞬间可能产生的抖动问题,以确保系统能够准确识别和响应单次按键操作。 在实际应用中,当用户按下或释放键盘上的键时,由于机械结构和电磁干扰,开关...
在电子设计领域,按键实验是基础且重要的环节,特别是在嵌入式系统和数字逻辑设计中。本文将深入探讨“按键去抖检测”这一关键知识点,以及如何通过编程实现这一功能。我们将结合“按键实验.c”代码文件和“北航...
- 防抖动处理:由于机械按键在按下和释放过程中可能会产生多次脉冲,需要通过延时或去抖动算法来确保只响应一次按键动作。 4. **实验步骤** - 编写程序,设置I/O口为输入模式,并初始化。 - 实现按键扫描和防...
本次我们将深入探讨由龙文杰老师指导的数电实验5,该实验旨在让学生掌握数字电路中的关键概念——按键防抖动技术,并通过实际操作提升学生的实践能力。 实验5的主题是“按键防抖动”,这是电子工程中常见的一种问题...
通过这个按键控制实验,你不仅可以掌握STM32F130的基本GPIO操作,还能了解中断处理和防抖动技术,这些都是嵌入式系统开发中的重要技能。同时,这个实验也为后续更复杂的项目,如多按键处理、按键扫描矩阵等奠定了...
在ACTEL FPGA中,我们可以创建一个状态机来处理按键的输入,这个状态机包含检测按键按下、等待稳定、检测按键释放等多个状态,以实现防抖动效果。具体来说,当检测到按键按下后,会进入一个延时周期,如果在此期间...
5. **错误处理**:考虑到实际应用中的干扰和不确定性,应加入适当的错误处理机制,例如防抖动处理,以防止按键快速按下/释放产生的误触发。 在进行这个实验时,你可能会使用诸如Keil MDK、IAR Embedded Workbench或...
总之,这个STM32F1按键输入实验涵盖了基本的GPIO配置、中断处理和防抖动技术。通过实践,开发者能够更好地理解和掌握STM32F1在实际应用中的输入处理能力,为更复杂的嵌入式系统设计打下坚实基础。
在处理按键事件时,还需要注意防抖动处理,因为机械按键在按下和释放过程中可能会产生多次电平跳变,防抖动可以避免误触发。 5. **软件实现**:可以使用STM32CubeMX配置GPIO并生成初始化代码,然后在main.c或其他...
4. 防抖动处理:由于机械开关在按下或释放时可能会产生瞬间的抖动,导致误读,因此通常需要添加软件防抖动机制,比如延时几毫秒后再检测一次电平,确保按键状态稳定。 5. 错误处理:考虑可能出现的异常情况,如按键...
4. **防抖电路**:防抖电路是为了消除按键输入的抖动问题,确保稳定可靠的信号。在给定的VHDL代码中,`anti_shake_key`实体实现了这一功能,它监控按键输入,并确保在稳定的时钟周期内只响应一次按键操作。 5. **模...
- **按键检测**:使用循环或中断方式检测按键状态,通常需要防抖动处理,避免因机械抖动导致误判。 - **按键处理**:当检测到按键按下,根据应用需求执行相应的功能,如点亮LED、发送数据等。 6. **实验步骤**: ...