FPGA知识基础之--500ms计数器,边沿检测,按键消抖

news2024/9/20 18:53:18

目录

  • 前言
  • 一、边沿检测
    • 1.1 使用背景
    • 1.2 方法:打拍法
      • 1.2.1 背景
      • 1.2.2 原理
      • 1.2.3 上升沿
  • 二、计数器
    • 2.1 原理
    • 2.2 RTL代码
  • 三、按键消抖


前言


一、边沿检测

1.1 使用背景

在我们设计电路时,经常会遇到需要继续检测上升沿和下降沿的电路,因此需要对边沿继续检测

1.2 方法:打拍法

1.2.1 背景

data数据信号不是时钟信号,不稳定,有许多毛刺,不能直接利用always语句中的posedge和nesedge来检测,因此需要通过其他办法来对边沿进行检测
有关毛刺,在数字电路的竞争与冒险中有讲解,是一个很重要的概念,希望读者先行掌握

在这里插入图片描述

1.2.2 原理

采用两个寄存器,对data数据信号进行打两拍处理,来消除数据不稳定产生的毛刺
在这里插入图片描述

1.2.3 上升沿

在这里插入图片描述由上述波形图可知:上升沿脉冲即为data_0为0 ,data_1为1时所取的信号
代码

module pos_data(
input 			sys_clk,
input 			sys_rst_n,
input 			data,
			
output			pos_data
);

reg 			data_0;
reg 			data_1;

always @(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		begin 
			data_0 <= 1'd0;
			data_1 <= 1'd0;
		end
	else 
		begin
			data_0 <= data;
			data_1 <= data_0;
		end 
end 

assign pos_data = data_0 && ~data_1; //若是下降沿,则改为~data_0 && data_1;若是边缘,则改为 data_0 ^ data_1
endmodule

tb代码



`timescale 1ns / 1ns        

module tb_pos_data();

//parameter define
parameter  CLK_PERIOD = 20;           
      

//reg define
reg           sys_clk;
reg           sys_rst_n;
reg           data;

//wire define
wire         pos_data;


initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;
    data <= 1'b0;
    #200
    sys_rst_n <= 1'b1;

    #200
    data <= 1'b1;
    #200
    data <= 1'b0;
    #200
    data <= 1'b1;

end


always #(CLK_PERIOD/2) sys_clk = ~sys_clk;


pos_data  u_pos_data(
    .sys_clk      (sys_clk),
    .sys_rst_n    (sys_rst_n),
    .data          (data),
    .pos_data        (pos_data)
    );

endmodule


波形

在这里插入图片描述

需要注意的是,在编写Testbench时,要将data改变的时间间隔延长一些,否则结果不明显

二、计数器

2.1 原理

计时500ms用寄存器cnt_500;因为晶振为50MHZ,即20ns,所以需要cnt记到25000时清零,25000转化为二进制为0110 0001 1010 1000,有15位,所以cnt需要定义为15位
在这里插入图片描述

2.2 RTL代码

module cnt_500(
input                   sys_clk,
input                   sys_rst_n,

output  reg  [14:0]      cnt

);

parameter  CNT_MAX = 25000 ;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) 
        cnt <= 15'd0;
    else if (cnt < (CNT_MAX - 1'd1))
        cnt <= cnt + 1'd1;
    else 
        cnt <= 1'd0;
    
end

endmodule

Testbench代码


`timescale 1ns / 1ns   
module tb_cnt_500();

parameter CLK_PERIOD = 20;


reg            sys_clk;
reg           sys_rst_n;

wire   [14:0]     cnt ;






always #(CLK_PERIOD/2) sys_clk = ~sys_clk;

initial begin
    sys_clk <= 1'd0;
    sys_rst_n <= 1'd0;
    #200
    sys_rst_n <= 1'd1;


    
end

cnt_500 u_cnt_500(
    .sys_clk     (sys_clk),
    .sys_rst_n   (sys_rst_n),
    .cnt          (cnt)
);

endmodule

波形

在这里插入图片描述
符合预期

三、按键消抖

RTL代码

module key_debounce(  
input       sys_clk,
input       sys_rst_n,
input       key,

output   reg   key_filter
);

parameter CNT_MAX = 1000; //延时20ms


reg key_0;
reg key_1;
reg   [9:0] cnt;

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n) begin
        key_0 <= 1'b0;
        key_1 <= 1'b0;
    end
    else
    begin
        key_0    <= key;
        key_1   <= key_0;
    end 
end

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n) 
        cnt <= 0;
    else if  ( key_0 !=  key_1 | cnt == (CNT_MAX - 1)) 
        cnt <= 0;
    else if (cnt < (CNT_MAX - 1) )
        cnt <= cnt + 1;
    
    
   
end

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n) 
        key_filter <= 1;
    else if  (cnt == (CNT_MAX-1))
        key_filter <= key_1;
end 


endmodule

Testbench代码

`timescale 1ns/1ns 
module tb_key_debounce();


reg key;
reg sys_clk;
reg sys_rst_n;

wire key_filter;

parameter CLK_PERIOD = 20;
parameter CNT_MAX = 10;//延时200ns


initial begin
    sys_clk <= 1'd0;
    sys_rst_n <= 1'd0;
    key <= 1'd1;
    #10
    sys_rst_n <= 1'd1;
    key <= 1'd0;
    #20
    key <= 1'd1;
    #30
    key <= 1'd0;
    #300
    key <= 1'd1;
    #20
    key <= 1'd0;
    #10
    key <= 1'd1;
    #30
    key <= 1'd0;

end


always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
key_debounce #(
        .CNT_MAX    (CNT_MAX)
)
    u_key_debounce(
        .sys_clk    (sys_clk),
        .sys_rst_n  (sys_rst_n),
        .key        (key),

        .key_filter (key_filter)
);


endmodule

波形展示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

劳动仲裁经验篇【赶紧收藏】

【劳动仲裁】纯经验干货分享&#xff0c;点个关注防止需要时找不到&#xff01; 当公司决定搞你心态&#xff0c;变相逼退你时&#xff0c;无非就那么些手段&#xff0c;只要你能正确应对&#xff0c;并做好收集证据的准备&#xff0c;就不住畏惧。合理利用法律的武器维护自身…

大模型书籍电子书上新 |《图技术与大模型在多领域的应用》

资料目录及介绍&#xff1a; GraphGPT: 大语言模型的图结构指令微调 GraphGPT旨在使大语言模型理解图结构数据&#xff0c;执行图相关任务如节点分类和链接预测。面对图数据多样性和大模型能力迁移的挑战&#xff0c;GraphGPT探讨了图输入方法、模型对齐及推理能力增强等解决…

重生奇迹MU 从不孤军奋战

重生奇迹MU的世界里&#xff0c;每个职业都有自己的独特魅力和优势。本文将讲述圣导师和弓箭手在游戏中的表现&#xff0c;他们不仅拥有强大的个人实力&#xff0c;更擅长与队友协作奋战&#xff0c;成为团队推进的重要力量。无论你选择哪个职业&#xff0c;与他们一起并肩作战…

【pikachu靶场】之ITOver Permission越权漏洞

一、水平越权&#xff1a; 查看一下提示 里面有用户名和密码&#xff0c;&#xff0c;后面要用。。 登录一个用户 在地址栏里可以看到lili用户名直接被显示到了里面&#xff0c;可以直接在这里修改切换到其他的用户。 修改用户 我修改用户为lucy后&#xff0c;就看到了lucy…

【教程】Python语言的地球科学常见数据——MODIS土地利用数据的处理

读取多年土地利用数据、裁剪长江流域土地利用、分析长时间序列长江流域土地利用变化。 地覆盖动态产品包括标志着季节性周期的植被生长、成熟和衰老的时间层。MODISTerraAqua 组合土地覆盖产品包含了五个不同的士地覆盖分类方案&#xff0c;通过监督决策树分类方法得出。主要的…

Maven下载和安装(详细版)

前言 Maven 的含义 Maven 是一个 java 项目管理 和构建工具&#xff0c;他可以定义项目结构&#xff0c;项目依托&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是 java项目不可或缺的工具。 Maven 的 优点 1 提供 标准化的项目结构&#xff08;具体规定了文件的…

公司重要文件怎么保护

一、文件加密 采用加密算法&#xff1a;将重要文件转换成无法直接阅读的代码形式&#xff0c;只有在经过授权解密后才能恢复原始内容。这可以显著降低数据泄密的风险。 使用专业加密软件&#xff1a;如金刚钻信息防泄密系统等&#xff0c;这些软件提供多种加密模式&#xff0…

microsoft远程桌面,windows云电脑如何使用microsoft远程桌面

Microsoft远程桌面&#xff08;RemoteDesktop&#xff09;是一项强大的功能&#xff0c;允许用户从任何支持的设备&#xff08;如PC、Mac、iOS、Android设备&#xff09;远程访问和控制Windows电脑&#xff0c;尤其是Windows专业版或企业版系统。这对于远程办公、技术支持或访问…

SSM写真馆在线管理系统-计算机毕业设计源码77939

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 写真馆在线管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析…

对于mysql的字符串属性倒序如何做?

背景&#xff1a; 对于新闻排行榜中的hot_value 属性定义的时候使用了Varchar类型&#xff0c;代码排序时&#xff0c;往往是乱的&#xff1a; 待排序数据&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;40&#xff0c;300&#xff0c;1000希望排序为&#xff1a;1000&…

vulhub:Apache解析漏洞CVE-2017-15715

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个换行解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 #启动靶机 cd /Vulnhub/vulhub-mast…

武汉流星汇聚:亚马逊平台引领中国卖家,外贸经济再添强劲动力

在全球电商的浪潮中&#xff0c;亚马逊平台凭借其卓越的全球影响力、先进的运营体系和庞大的用户基础&#xff0c;成为了中国卖家拓展国际市场的重要桥梁。近年来&#xff0c;中国卖家在亚马逊上的快速发展&#xff0c;不仅为中国企业带来了丰厚的利润&#xff0c;更为中国外贸…

经典预测控制算法:动态矩阵控制(DMC)下篇——仿真实验(含Matlab源码)

目录 前文链接基础DMC算法Matlab源码代码解析仿真结果展示 参数对性能的影响参数P对性能影响Matlab源码仿真结果 参数M对性能影响Matlab源码仿真结果 参数q对性能影响Matlab源码仿真结果 参数lamda对性能影响Matlab源码仿真结果 讨论 算法改进效果验证阶梯式动态矩阵控制与基础…

分散存储的艺术:探索主流数据库分库分表解决方案

摘要&#xff1a; 随着大数据时代的到来&#xff0c;单一数据库系统越来越难以满足日益增长的数据存储和处理需求。分库分表技术应运而生&#xff0c;成为解决这一问题的有效手段。本文将深入探讨主流的数据库分库分表中间件&#xff0c;分析它们的设计理念、实现原理以及应用场…

企业定制AI智能名片微信小程序在私域流量运营中的应用与策略

摘要&#xff1a;随着2022年私域运营市场步入冷静期&#xff0c;企业逐渐从盲目模仿向精准化、个性化的运营模式转变。在这一背景下&#xff0c;企业定制AI智能名片微信小程序凭借其独特的智能化、便捷化特性&#xff0c;成为企业构建私域流量池、深化用户关系、实现高效转化的…

问答:OKR入门

通过使命、愿景和价值观来创建正确的公司文化&#xff0c;以及如何开始使用OKR。以下是对您提出的问题的回答。 让团队加入的最佳方式是什么&#xff1f; 这需要高管的认同和领导力。对于中小型企业来说&#xff0c;从高管团队开始。对于大公司来说&#xff0c;可以在单个业务部…

spring boot + vue3 接入钉钉实现扫码登录

1&#xff1a;准备工作 1.1&#xff1a;进入钉钉开放平台创建开发者应用。应用创建和类型介绍&#xff0c;参考下方。 应用类型介绍 - 钉钉开放平台 (dingtalk.com) 应用能力介绍 - 钉钉开放平台 (dingtalk.com) 扫码登录第三方网站 - 钉钉开放平台 (dingtalk.com) 1.2&…

DLT相机标定算法

本教程介绍了直接线性变换 (DLT)&#xff0c;这是一种用于解决以下类型方程组的通用方法&#xff1a; 这种类型的方程经常出现在射影几何中。一个非常重要的例子是场景中的 3D 点与它们在相机图像平面上的投影之间的关系。这就是为什么我们要使用此设置来激发 DLT 的使用。 NSD…

二百五十二、OceanBase——Linux上安装OceanBase数据库(二):新用户配置ssh免密登录

一、目的 在OBD页面上部署OceanBase数据库时发现&#xff0c;需要把新用户也要配置ssh免密登录 二、前提 root用户已经设置免密登录 三、配置步骤 1 切换到新用户obadmin [roothurys23 ~]# su obadmin 2 执行命令生成秘钥文件 [obadminhurys23 oceanbase]$ ssh-keygen …

动态规划:基础篇

目录 1. 斐波那契数(LeetCode509) 解法1&#xff1a;动态规划(基础版) 解法2&#xff1a;动态规划(优化版) 2. 爬楼梯(方案个数)(斐波那契数列扩展)(LeetCode70) 解法1&#xff1a;动态规划(基础版) 解法2&#xff1a;动态规划(优化版) 3. 爬楼梯(最小花费)(LeetCode746…