技术标签: fpga开发
按键作为FPGA最基本的外设,由于按键的机械特性,按键被按下后会发生抖动,影响FPGA对输入电平信号的采集,所以我们要对输入的按键信号进行消抖处理,才能得到稳定的按键触发信号。
如下图所示,按键按下后会有一段时间的抖动,称为抖动前沿,中间为稳定时期,持续时间为20ms左右,弹起时也会有一段抖动,称为抖动后沿。要想稳定读取按键信号,需要避开抖动前沿,采集中间的稳定状态,这时需要定义一个计数器来检测中间的稳定状态。当检测到按键引脚电平变化时开始计数,如果遇到按键抖动,则把计数器归零,在稳定时期才能计数到最大值(设定为20ms),这时就输出一个周期的按键触发信号,表示按键已经按下。
按键抖动示意图
module key_debounce(
input sys_clk, //50MHz系统时钟
input rst_n, //系统复位
input key_in, //按键输入
output reg led //LED输出
);
parameter CNT_MAX = 24'd10000000; // 50MHz时钟下计数20ms
reg [23:0] cnt;
always @(posedge sys_clk or negedge rst_n) begin
if(!rst_n)
cnt <= 24'd0;
else if(key_in == 1'b0)
if(cnt <= CNT_MAX )
cnt <= cnt + 1'b1;
else
cnt <= cnt ;
else
cnt <= 24'd0;
end
always @(posedge sys_clk or negedge rst_n) begin
if(!rst_n)
led <= 1'b0;
else if(cnt == CNT_MAX - 1'b1)
led <= ~led;
else
led <= led;
end
计数器cnt的位宽大小与时钟频率有关,50MHz时钟频率下计数20ms,计数最大值为10^6,代码中采用cnt == CNT_MAX - 1’b1来翻转led保证一次按键触发只会翻转一次。
如果要输出触发信号,只需对代码做如下更改即可
reg key_flag;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
key_flag <= 1'b0;
else if(cnt == CNT_MAX - 1'b1)
key_flag <= 1'b1;
else
key_flag <= 1'b0;
学习了按键抖动和消抖原理,本代码可以轻松的从一位按键扩展到多位按键。
文章浏览阅读1.9k次,点赞5次,收藏11次。请求转发:request.getRequestDispatcher().forward();重定向:response.sendRedirect();例如:请求转发:request.getRequestDispatcher("/student_list.jsp").forward(request,response);重定向:response.sendRedirect(request.getContextPath + "/student_list.jsp")转发过.._java重定向和转发的区别
文章浏览阅读1.1k次。查看效果:http://hovertree.com/texiao/css3/37/以下为讲解和代码。可以通过 @keyframes 规则,创建动画。创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。在动画过程中,您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%。0% 是动画的开始时间,100% 动画的结..._css3 背景扩散效果
文章浏览阅读1.7k次。本文结合FPGA芯片的高并行、低功耗、可重配置等优势,对基于卷积神经网络结构的目标检测算法,在端侧场景下的加速与部署进行研究与实现。本章节对本文涉及到的基本理论知识与技术手段进行介绍,为后续系统的方案分析与系统设计奠定理论基础。首先,介绍了卷积神经网络的基本组成部分及其原理。然后,对FPGA及其开发技术进行简单介绍。最后,对当前常用的部分基于FPGA的卷积神经网络加速方法进行概述。_yolo fpga
文章浏览阅读1.2w次。堆栈溢出堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前,先了解以下几个概念:缓冲区 简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例。 堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先出 (LIFO)队列。堆栈中定义了一些操作。两个最重要的是PU..._buffer over flow l
文章浏览阅读455次。我们日常开发中,经常会碰到并发的场景,在 Java 中语言体系里,我们会想到 ReentrantLock、CountDownLatch、Semaphore 等工具,但你是否清楚它们内部的实现原理?这些工具都很类似,底层都是基于AbstractQueuedSynchronizer(AQS)来实现的。今天我们就来一起学习 AQS 内部原理。_aqs 入对之后就一定顺序执行
文章浏览阅读4.1k次。编写一个程序,在屏幕上显示如下图形(图形的层数有输入者自行定义)源代码如下所示:#include<stdio.h>int main(){ int line; // 菱形总行数 int column; // 菱形总列数 int i; // 当前行 int j; // 当前列 printf("请输入菱形的行数(奇数):"); scanf("%d", &line); while(2) { if(line%_c语言画菱形
文章浏览阅读81次。苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新。但是并未发现 macOS 14 Sonoma 的第三个开发者测试版的新功能,且更新日志和 Beta 2 类似。_mac os sonoma最新版本
文章浏览阅读270次。一.类(1).基础最简单的定义方式class Person{}log(new Person());//Person{}log(typeof Person);function标准写法class Person{ constructor(name = "zhangsan",age = "18"){ //私有属性 this.name = name; this.age = age; } //公有属性 _es6 类修饰 详解
文章浏览阅读335次。3.1 可变字符串和BigDecimal3.1.1 可变字符串由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。我们的 Java 就开发了 可变字符串下面的两者,都比传统的 String 类型要快很多。① StringBuffer:JDK1.0提供的,效率低,线程安全。它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。② StringBuilder:JDK5.0提供的,效率高,线程不安全3.1.2 StringBuffer①_java字符串和bigdecimal类
文章浏览阅读2.6k次,点赞9次,收藏2次。32×32位寄存器堆设计,杭电计算机组成原理实验四,实验的开发工具是vivado2018,vivado2022也兼容2018_fpga2s需要多少位寄存器
文章浏览阅读644次。因为STM32F103C8T6,没有硬件随机数,所以需要自己通过软件配置。最后得到的mmm1变量为一个0~100的随机值。首先增加一段include用于产生真随机数。_stm32f103c8t6可以生成随机数么
文章浏览阅读4.5k次。先说下需求吧,我们的需求是通过一个经纬度,然后打开微信内置的地图页面代码如下://导航到停车场 gogogo() { //获取当前页面url //var url = location.href.split('#')[0]; // alert(11111) // window.location.href = // "https://apis.map.qq.com/uri/v1/marker?marker=coord:30.595810_h5 wx.openlocation