FPGA 20个例程篇:1.不同按键控制不同LED亮灭

2023-10-11 14:30

本文主要是介绍FPGA 20个例程篇:1.不同按键控制不同LED亮灭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一、典型基础入门,小试牛刀 :

1.不同按键控制不同LED亮灭

      大家不妨回忆下从上学到工作,有趣的是仿佛在学习任何一款嵌入式芯片的编程时,几乎不约而同地都是先从按键、发光二极管、蜂鸣器入门的,这些外设虽然看上去很基础但也具有很强的代表性,所以第一章里笔者通过两个基础例程,帮助大家自然而然地入门FPGA设计,闲话不多说我们直接步入正题。

         按键和发光二极管可以说是嵌入式设备中最为常见的外设了,本身应用场景有很多,例如发光二极管从电路上通过CPU控制高低电平的输出可以用来指示通信传输速度、设备运行状态等,按键从电路上分为独立式和扫描式可以用来控制少数普通按键、编码器以及行列式矩阵按键。

         如图1和图2所示,分别是独立式和扫描式按键电路设计,大家可以清楚地看到对CPU而言,每个独立式按键都需要一个IO口对其进行连接,而扫描式按键则不需要IO口在数量上和按键进行逐一匹配,只用在同一时刻通过对按键矩阵进行扫描,即可判断出当前时刻哪个按键被按下,硬件上节约了主CPU的IO口,软件上也简化了代码逻辑,在这里我们不对扫描式的代码设计展开详细的叙述,例程中只对项目中用得比较多的独立式按键进行分析讲解。

        图1 独立式的按键电路

 图2 扫描式的按键电路

        通过FPGA基础知识专栏的实践学习,其实大家已经掌握了按键消抖处理设计,如果忘记的话,那么我们在这里再回过头简单地复习一下,如图3所示是豌豆开发板Artix7上按键电路,非常普遍的硬件设计,按键一端接地,而另外一端接一个上拉电阻再连到Artix7芯片的引脚上,所以当按键断开时是高电平,闭合时是低电平,但是因为按键具有机械特性,在断开和闭合的时候都会有抖动有误触发的情况,这个时间通常是小于10ms的,如图4所示是按键闭合、断开以及稳定时的电平变化示意图,所以不管是MCU还是FPGA程序设计里都会对按键检测去做20ms的消抖处理。

      如表1为这个模块的信号列表,本模块的输入信号有:clk系统时钟信号、rst_n系统复位信号、外部4个按键key_in引脚输入信号;输出信号有:key _vld按键消抖有效信号、key_value按键键值信号,在整体工程的设计中,通过例化key_vld和key_value两个输出信号,即可得到外部按键哪个按键被按下了,其他模块再据此去做后续的处理。

 图3 豌豆开发板Artix7上按键电路

 图4 按键闭合和断开抖动电平变换示意图

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

key_in

I

4

key_vld

O

1

key_value

O

4

表1 key_scan模块信号列表

       为了方便理解,我们可以把这个模块的整体流程用一个流程示意图来表示,如图5所示,大家再根据这个流程示意图去思考下,我们应该如何去合理划分这个模块中状态机的状态,以及不同状态之间应该怎么去跳转。

       首先把整个流程提取出来,可以分为四个状态,即IDLE空闲状态、CHECK_KEYIN检测按键闭合状态、KEEP_KEYIN按键持续闭合状态、CHECK_KEYOUT检测按键断开状态。然后设计debounce_cnt消抖的计数器,用来计时20ms的按键闭合断开的消抖时间,显然在状态CHECK_KEYIN和CHECK_KEYOUT的时候,消抖计数器再去计时20ms时间,所以把debounce_cnt的加一条件设置为:state_c == CHECK_KEYIN || state_c == CHECK_KEYOUT,把结束条件设置为add_debounce_cnt && debounce_cnt== TIM_20MS-1。

     接着再去考虑状态跳转,根据图5的按键消抖处理设计流程图,IDLE状态可以跳转到CHECK_KEYIN状态;CHECK_KEYIN状态在消抖20ms后通过判断key_in的输入值,则可以跳转到IDLE状态或者KEEP_KEYIN状态;KEEP_KEYIN状态在检测到key_in的输入值不为4'b1111时便会跳转到CHECK_KEYOUT状态;CHECK_KEYOUT状态在消抖20ms后通过判断key_in的输入值,则可以跳转到IDLE状态或者KEEP_KEYIN状态。

      最后我们需要去注意输出信号key_vld以及key_value的设计,大家想一想这两个关键输出信号应该什么时候被置位和赋值,通过图5的设计流程图可以看出来,我们应该在CHECK_KEYIN状态跳转到KEEP_KEYIN状态的时刻,把key_value用key_in的逐位取反来赋值,这时key_value记录下当前哪个按键被按下,当用户断开按键时即在CHECK_KEYIN跳转到IDLE状态的时刻,再去置高一个周期的key_vld把key_value的值送到其他处理模块,key_vld和key_value都用时序逻辑去产生,在搞清楚整个模块的逻辑以后,把代码写漂亮已经不困难了,如图6所示是其对应的代码设计供参考,当然也可以有不同的状态机划分方法,只有符合预期设计要求即可,答案完全不唯一。

 图5 按键消抖处理设计流程图

     如图7所示,在把key_scan模块产生的key_value和key_vld信号例化到顶层模块即可,通过key_value和key_vld再对LED进行点灯操作。

图6 按键消抖处理模块的代码设计

图7 按键控制LED亮灭顶层文件的例化
 

这篇关于FPGA 20个例程篇:1.不同按键控制不同LED亮灭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188688

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但