FPGA入门学习笔记(十三)Vivado实现按键消抖

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

四种状态
按键未按下:静止状态呈高电平;
按下过程中:抖动状态呈高低电平;
按键已按下:静止状态呈低电平;
释放过程中:抖动状态呈高低电平。

按键消抖思路:区别于单片机使用20ms延时判断电平正负,FPGA中采用电平保持计时,若时间长度超过20ms则认为发生了一次按键操作。

vivado按键消抖,FPGA,fpga开发,学习
按键实际电路存在亚稳态现象,当按键正好在时钟上升沿按下时,触发器1的输出Q_1将不确定,可能为1,也可能为0,此时无法准确的判断下降沿的触发,通过两个触发器可有效解决上述问题,通过判断Q_1与Q_2,将有效的判断按键下降沿的触发,且判断仅有一个始终距离。
vivado按键消抖,FPGA,fpga开发,学习

仿真波形

vivado按键消抖,FPGA,fpga开发,学习

设计文件程序

`timescale 1ns / 1ns

module Key_Filter(
        Clk,
        Reset_N,
        Key,
        Key_P_Flag,
        Key_R_Flag,
        Key_State
        
    );
    input Clk;
    input Reset_N;
    input Key;
    output reg Key_P_Flag;
    output reg Key_R_Flag;
    output reg Key_State;
    
    reg [1:0]R_Key;
    reg [1:0]Sync_Key;

    wire Pedge_Key;
    wire Nedge_Key;
    
    always@(posedge Clk)begin
        Sync_Key <= #1 {Sync_Key[0],Key};
    end
    
    always@(posedge Clk)begin
        R_Key <= #1 {R_Key[0],Sync_Key[1]};
//        R_Key[0] <= Key;
//        R_Key[1] <= R_Key[0];
    end
    //Posedge Check
    assign Pedge_Key = (R_Key == 2'b01);
    //Negedge Check
    assign Nedge_Key = (R_Key == 2'b10);
    
    reg [19:0]Counter;
    
    localparam IDLE = 0;
    
    reg [1:0]state;
    always@(posedge Clk or negedge Reset_N)
    if(!Reset_N)begin
        state <= #1 0;
        Counter <= #1 0;
        Key_P_Flag <= #1 0;
        Key_R_Flag <= #1 0;
        Key_State <= #1 1;
    end
    else begin
        case(state)
            0:
                begin
                    Key_R_Flag <= #1 0;
                    if(Nedge_Key)
                        state <= #1 1;
                    else
                        state <= #1 0;
                end
            1:
                if((Pedge_Key)&&(Counter < 1000000 - 1))begin
                    state <= #1 0;
                    Counter <= #1 0;
                end
                else if(Counter >= 1000000 -1)begin
                    state <= #1 2;
                    Counter <= #1 0;
                    Key_P_Flag <= #1 1;
                    Key_State <= #1 0;
                end
                else begin
                    Counter <= #1 Counter + 1'd1;
                    state <= #1 1;
                end
            2:
                begin
                    Key_P_Flag <= #1 0;
                    if(Pedge_Key)
                        state <= #1 3;
                    else
                        state <= #1 2;
                end
            3:
                if((Nedge_Key)&&(Counter < 1000000 - 1))begin
                    state <= #1 2;
                    Counter <= #1 0;
                end
                else if(Counter >= 1000000 -1)begin
                    state <= #1 0;
                    Counter <= #1 0;
                    Key_R_Flag <= #1 1;
                    Key_State <= #1 1;
                end
                else begin
                    Counter <= #1 Counter + 1'd1;
                    state <= #1 3;
                end
        endcase
    end
endmodule

仿真文件程序

`timescale 1ns / 1ns

module Key_Filter_tb();
    
    reg Clk;
    reg Reset_N;
    reg Key;
    wire Key_P_Flag;
    wire Key_R_Flag;
    wire Key_State;
    
    Key_Filter Key_Filter(
        Clk,
        Reset_N,
        Key,
        Key_P_Flag,
        Key_R_Flag,
        Key_State
    );
    
    initial Clk = 1;
    always #10 Clk = !Clk;
    initial begin
        Reset_N = 0;Key = 1;
        #201;
        Reset_N = 1;
        #2000;
        Key = 0;
        #20000;
        Key = 1;
        #30000;
        Key = 0;
        #20000;
        Key = 1;
        #30000;
        Key = 0;
        #50000000;
        Key = 1;
        #30000;
        Key = 0;
        #20000;
        Key = 1;
        #30000;
        Key = 0;
        #20000;
        Key = 1;
        #50000000;
        $stop;
    end
endmodule
`timescale 1ns/1ns

// Random Function
module Key_Filter_tb2();
    
    reg Clk;
    reg Reset_N;
    reg Key;
    wire Key_P_Flag;
    wire Key_R_Flag;
    wire Key_State;
    
    Key_Filter Key_Filter(
        Clk,
        Reset_N,
        Key,
        Key_P_Flag,
        Key_R_Flag,
        Key_State
    );
    
    initial Clk = 1;
    always #10 Clk = !Clk;
    initial begin
        Reset_N = 0;Key = 1;
        #201;
        Reset_N = 1;
        #2000;
        press_Key(2);
        $stop;
    end
    
    reg [24:0]rand;
    
    task press_Key;
        input [3:0]seed;
        begin
            Key = 1;
            #20000000;
            repeat(5)begin
                rand = {$random(seed)}%10000000;
                #rand Key = ~Key;
            end
            Key = 0;
            #40000000;
            
            repeat(5)begin
                rand = {$random}%10000000;
                #rand Key = ~Key;
            end
            Key = 1;
            #40000000;
        end
    endtask
endmodule

使用Random函数进行设计仿真时,发现了原设计文件中未及时将Counter置零的问题,现已对设计文件修正。


vivado按键消抖,FPGA,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-764987.html

到了这里,关于FPGA入门学习笔记(十三)Vivado实现按键消抖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

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

    2024年02月06日
    浏览(31)
  • 按键消抖(Verilog&Vivado)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 按键作为基本的人机输入接口,由于其机械特性,在按键按下或松开的时候,都是会有抖动的。按键小豆的方式有很多。我的方法是通过计时来消抖,通过一个计数器,当按键输入有变化时,计数器清零

    2024年02月08日
    浏览(26)
  • FPGA按键消抖

    按键是输入设备,一般来说,按键在没有按下的时候是高电平;当按键按下的时候,为低电平。 在 DE2-70 User Manual 中 Each switch provides a high logic level (3.3 volts) when it is not pressed, and provides a low logic level (0 volts) when depressed. Since the pushbutton switches are debounced, they are appropriate for use

    2024年02月15日
    浏览(40)
  • FPGA开发:按键消抖

    相关阅读 FPGA开发专栏 https://blog.csdn.net/weixin_45791458/category_12388695.html?spm=1001.2014.3001.5482         按键是FPGA开发板上的重要交互元件,因为按键的内部的结构设计,在按下和松开按键时,按键会无法避免地产生机械抖动,因此要对按键输入进行特殊处理,否则可能会因为机械

    2024年02月15日
    浏览(38)
  • 学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯

    来源:爱问知识人:sos用灯光怎么表示 三短三长三短 SOS作为世界上通用的求救信号,如果用灯光信号来表示,三短亮代表字母S,三长亮代表字母O,再接着的三短亮代表S。 灯的长亮时间是短亮时间的三倍,而短亮时间则与LED两次点亮的间隔时间相同,字母与下一个字母间也有

    2024年02月12日
    浏览(32)
  • 基于FPGA的按键消抖

    按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。当按下一次按键,可能在A点检测到一

    2024年02月16日
    浏览(35)
  • 二、13【FPGA】按键消抖

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第十六讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3 按键常常作为系统复位信号和控制信号的外部输入,主要分为自锁按键、机械按键和薄膜按键等。开发

    2023年04月26日
    浏览(32)
  • linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验

    之前的延时消抖,是直接借助delay函数进行的,但是这样会浪费CPU的性能。我们采用延时函数的方式实现,可以实现快进快出。  定时器消抖,必须是在t3的时间点才可以,当在t1,t2的时间点每次进入中断函数都要重新开启定时器的计时 但是,这两个时间点的时间小于定时器设

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

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

    2024年04月10日
    浏览(26)
  • 单片机入门资料,按键消抖方式,按键怎么消抖

     1.什么是按键消我们先来看一下按键按下去的波形图   1.按键消抖原理 我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行硬件消抖或者进行软件消抖.          上图中我们可以

    2024年02月08日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包