FPGA按钮消抖实验

这篇具有很好参考价值的文章主要介绍了FPGA按钮消抖实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、概述
        按键的消抖,是指按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性,降低响应灵敏度。因此,必须对抖动进行处理,即消除抖动的影响。实际工程中,有很多消抖方案,如 RS 触发器消抖,电容充放电消抖,软件消抖。本章利用 FPGA 内部来设计消抖,即采取软件消抖。
        按键的机械特性,决定着按键的抖动时间,一般抖动时间在 5ms~10ms。消抖,也意味着,每次在按键闭合或松开期间,跳过这段抖动时间,再检测按键的状态。只要通过简单的延时就可实现按键的消抖动。

FPGA按钮消抖实验,fpga开发

2、硬件电路分析
2.1 原理图
        开发板底板中配套 2 个独立按键与 FPGA 相连,具体请参见底板原理图。本章使用了开发板按键和 led。各个按键独立,消抖过程相同,因此使用底板上的 SW1 按键模拟实际使用。按键每按一次,对应的 LED 灯反转一次。即检测按键是否有闭合和断开的过程,如果有,第一次则 LED 灯点亮,第二次,则 LED 灯熄灭。

FPGA按钮消抖实验,fpga开发

2.2 IO约束

set_property PACKAGE_PIN D9 [get_ports {led_o[0]}]
set_property PACKAGE_PIN J11 [get_ports {led_o[1]}]
set_property PACKAGE_PIN B9 [get_ports {led_o[2]}]
set_property PACKAGE_PIN J10 [get_ports {led_o[3]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led_o[*]}]
set_property PACKAGE_PIN C8 [get_ports clk_i]
set_property IOSTANDARD LVCMOS15 [get_ports clk_i]
set_property PACKAGE_PIN H13 [get_ports key_i]
set_property IOSTANDARD LVCMOS15 [get_ports key_i]
set_property PACKAGE_PIN V19 [get_ports rst_n_i]
set_property IOSTANDARD LVCMOS15 [get_ports rst_n_i]

2.3 key 模块的设计
        由于按键滤波是比较通用的一个程序,因此我们可以把一个通用的程序设置为一个模块,方便后面重复使用。

module key #
(
    parameter CLK_FREQ = 100000000
)
(
input clk_i,
input key_i,
output key_cap
);
//10ms
parameter CNT_10MS = (CLK_FREQ/100 - 1'b1);
parameter KEY_S0 = 2'd0;
parameter KEY_S1 = 2'd1;
parameter KEY_S2 = 2'd2;
parameter KEY_S3 = 2'd3;

reg [24:0] cnt10ms = 25'd0;
(*mark_debug = "true"*) reg [1:0] key_s = 2'b0;
(*mark_debug = "true"*) reg [1:0] key_s_r = 2'b0;
(*mark_debug = "true"*) wire en_10ms ;
 
assign en_10ms = (cnt10ms == CNT_10MS);
assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);

always @(posedge clk_i)begin
    if(cnt10ms < CNT_10MS) 
        cnt10ms <= cnt10ms + 1'b1;
    else 
        cnt10ms <= 25'd0;
end

always @(posedge clk_i)begin
    key_s_r <= key_s;
end

always @(posedge clk_i)begin
    if(en_10ms)begin
        case(key_s)
        KEY_S0:begin
           if(!key_i)
               key_s <= KEY_S1; 
        end  
        KEY_S1:begin
           if(!key_i)
               key_s <= KEY_S2; 
            else 
               key_s <= KEY_S0; 
        end 
        KEY_S2:begin
           if(key_i)
               key_s <= KEY_S3; 
        end  
        KEY_S3:begin
           if(key_i)
              key_s <= KEY_S0;
            else   
              key_s <= KEY_S2; 
        end
        endcase                  
    end
end

endmodule

        以上代码中,首先把系统时钟做分频,产生 10ms 的分频时钟使能信号。每10ms都会判断一次是否有按键按下。在设计的状态机中,分 4 个状态:
        KEY_S0:判断按键是否按下,如果是,转移到状态 KEY_S1;
        KEY_S1:10ms 后再次判断按键是否按下,如果是,转移状态到 KEY_S2,否则继续回到KEY_S0;
        KEY_S2:判断按键是否抬起,如果是,转移状态到 KEY_S3
        KEY_S3:10ms 后再次判断按键是否抬起,如果是,转移状态到 KEY_S0,否则继续回到KEY_S2;
        当状态从 KEY_S1 转到 KEY_S2 代表依次按钮按下 key_cap 输出一次高电平。

2.4 调用 key 模块
        以下代码中调用了 key 模块,并且每次 key_cap 有效,都会翻转一次 LED 的输出。

`timescale 1ns / 1ps
module Key_Jitter(
input clk_i,
input rst_n_i,
input key_i,
output [3:0] led_o

);
reg [3:0] led_o;
wire key_cap;

always @(posedge clk_i)begin
    if(!rst_n_i)begin
        led_o <= 4'b0000;
    end
    else if(key_cap)begin
        led_o <= ~led_o;  
    end
end

key#
(
.CLK_FREQ(100000000)
)
key0
(
.clk_i(clk_i),
.key_i(key_i),
.key_cap(key_cap)
);

ila_0 ila_debug (
	.clk(clk_i),
	.probe0({key_cap,led_o})
);

endmodule

2.5 综合布线前仿真时序
1)新建仿真文件,仿真文件源码如下所示。


module Key_Jitter_tb;

	// Inputs
	reg clk_i;
	reg rst_n_i;
	reg key_i;
	wire [2:0] led_o;


	// Instantiate the Unit Under Test (UUT)
	Key_Jitter uut (
		.clk_i(clk_i), 
		.rst_n_i(rst_n_i), 
		.key_i(key_i), 
		.led_o(led_o)
	);

initial
	begin
		// Initialize Inputs
		clk_i = 0;
	end
	always #5 clk_i=~clk_i;

initial
	begin
		// Initialize Inputs
		rst_n_i = 0;
		#100;
		rst_n_i=1;
		key_i = 1;
		#10000;
		forever
			begin
				key_i = 0;
				// Wait 100 ns for global reset to finish
				#100;
				key_i=1; #1000;
				key_i=0; #1000;
				key_i=1; #2000;
				key_i=0; #5000;
				#50000000;
				key_i=1;
				key_i=0; #1000;
                key_i=1; #2000;
                key_i=0; #1000;
                key_i=1; #2000;
				#50000000;
				key_i=0;
				
			end
	end

endmodule


2)进入仿真界面:SIMULATION->单击 Run Simulation ->单击 Run Behavioral Simulation。

FPGA按钮消抖实验,fpga开发

Setp3:设置断点

FPGA按钮消抖实验,fpga开发

之后再点击下图箭头所指

FPGA按钮消抖实验,fpga开发

之后可以看到增加的内部信号,可以以这种方法去观察内部信号

FPGA按钮消抖实验,fpga开发

右击框选的需要增加观察的信号选择添加到波形窗口,并且取消断点

FPGA按钮消抖实验,fpga开发

3)复位仿真波形

FPGA按钮消抖实验,fpga开发

4)重新仿真时间为 1000ms

FPGA按钮消抖实验,fpga开发

5)观察仿真波形

FPGA按钮消抖实验,fpga开发

6)放大波形观察毛刺

FPGA按钮消抖实验,fpga开发

3、板级验证结果分析
        将程序下载。按键 SW1 每按一次,LED 灯很好地熄灭和点亮。LED 灯响应无差错。为清晰的表示消抖的效果,可将延时参数设置很小,可以发现,按键有时候明明已经按下去了,LED 却无响应。文章来源地址https://www.toymoban.com/news/detail-803257.html

到了这里,关于FPGA按钮消抖实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA入门】第五篇、按键消抖

    目录 第一部分、按键抖动现象 第二部分、消抖思路及代码 1、简单的按键消抖思路 2、实际按键消抖思路 3、实际按键消抖模块代码 第三部分、总结         只要学习过单片机的都会知道,按键在按下去和松开的那个瞬间都存在抖动,在单片机消除抖动最简单的方式就是 延

    2024年02月11日
    浏览(44)
  • FPGA学习-Verilog实现独立按键消抖

    利用verilog语言实现独立按键消抖,文章首先对按键抖动产生的原因、消抖原理进行简要解释;之后详细阐述各模块verilog语言实现方法;最后利用四个独立按键控制led亮灭,在vivado下进行源码设计与仿真。(完成程序代码附在文章结尾) 按键一般是机械弹性开关,由于机械触

    2024年02月04日
    浏览(39)
  • FPGA入门学习笔记(十三)Vivado实现按键消抖

    四种状态 按键未按下:静止状态呈高电平; 按下过程中:抖动状态呈高低电平; 按键已按下:静止状态呈低电平; 释放过程中:抖动状态呈高低电平。 按键消抖思路 :区别于单片机使用20ms延时判断电平正负,FPGA中采用电平保持计时,若时间长度超过20ms则认为发生了一次

    2024年02月04日
    浏览(71)
  • FPGA拾忆_(10):按键控制蜂鸣器_边沿检测_按键消抖

    1.硬件特征: 轻触式(回弹式)按键         略 蜂鸣器: 分为蜂鸣器按照结构原理不同可分为压电式蜂鸣器和电磁式蜂鸣器。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成; 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组

    2024年04月10日
    浏览(41)
  • FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

    在博主的cyclone4开发板上一共有4个按键,本次实验的目的是为了实现每按下一次按键,都会使开发板上的4个LED灯切换一次状态,博主一共设计了四种状态,分别是: 按键 状态 按键1按下 自右向左的流水灯 按键2按下 自左向右的流水灯 按键3按下 四灯常亮 按键4按下 四灯闪烁

    2024年02月06日
    浏览(47)
  • 【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

    🎉欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 模块设计: 🥝 按键消

    2024年02月12日
    浏览(45)
  • FPGA在校学习记录系列---实验4不同状态的LED+开发板(Verilog HDL)

    此系列记录FPGA在学校的学习过程。 FPGA系列 需要用到的软硬件: 软件:Quartus II 15.0 (64-bit) 硬件: 5CEBA4F23C7芯片 链接: FPGA在校学习记录系列—新建一个FPGA工程编写程序并仿真(Verilog HDL) 创建的工程名字为:LED (这次不用仿真,直接用开发板验证) 编译文件 按键资源:

    2024年04月09日
    浏览(49)
  • 【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 现在几乎所有智能手机,包括平板电脑都是采用电容屏作为触摸屏,电容屏是利用人体感应进行触点检测控制

    2023年04月23日
    浏览(115)
  • 【正点原子FPGA连载】第二十七章 MDIO接口读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 在以太网通信中,设备之间的物理层链路均由PHY芯片(物理层芯片,本文指YT8521)建立。PHY芯片有一个配置接

    2024年02月09日
    浏览(64)
  • 【正点原子FPGA连载】第三十一章DDR4读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html DDR4 SDRAM(Double-Data-Rate Fourth Generation Synchronous Dynamic Random Access Memory,简称为DDR4 SDRAM),是一种高速动态随机

    2024年01月16日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包