FPGA开发——按键控制LED的实现

一、概述

在上一篇文章中我们学习了按键的相关消抖及其使用,在这篇文章当中我们就针对通过按键实现LED的控制。

1、按键原理图

2、基本框架

通过我们前面编写的按键消抖的文件和LED文件将按键和LED两个模块进行交互,从而达到按键控制LED的目的。

 二、代码编写

1、首先是按键相关设计文件的编写,新建key.v,如下:

//状态机实现
module key (input           clk     ,input           rst_n   ,input           key_in  ,   //输入原始的按键信号output  reg     key_out     //输出处理之后的按键信号
);
//参数定义localparam  IDLE        = 4'b0001,//空闲JITTLE0     = 4'b0010,//滤除第一次抖动DOWN        = 4'b0100,//稳定JITTLE1     = 4'b1000;//滤除第二次抖动parameter   TIME_20MS = 1_000_000;//需要计数的值,20ms//内部信号reg  [3:0]   state_c;//现态reg  [3:0]   state_n;//次态reg  [19:0] cnt_20ms;//计数20mswire        add_cnt_20ms;wire        end_cnt_20ms;wire        nedge   ;//下降沿信号wire        pedge   ;//上升沿信号reg         key_in_r1  ;//  同步打拍//状态转移 同步时序逻辑描述状态转移always @(posedge clk or negedge rst_n) beginif(!rst_n)state_c <= IDLE;elsestate_c <= state_n;end//状态转移条件 组合逻辑always @(*) begincase (state_c)//一定是case  现态IDLE:beginif(nedge)state_n = JITTLE0;elsestate_n = state_c;endJITTLE0:beginif(end_cnt_20ms)state_n = DOWN;elsestate_n = state_c; endDOWN:beginif(pedge)state_n = JITTLE1;elsestate_n = state_c;endJITTLE1  :beginif(end_cnt_20ms)state_n = IDLE;elsestate_n = state_c;  end   default: state_n = IDLE;endcaseend//20ms计数器
always @(posedge clk or negedge rst_n) beginif(!rst_n)cnt_20ms <= 0;else if(add_cnt_20ms)beginif(end_cnt_20ms)cnt_20ms <= 0;elsecnt_20ms <= cnt_20ms + 1;end
endassign add_cnt_20ms = (state_c == JITTLE0) || (state_c == JITTLE1);
assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == TIME_20MS - 1;//下降沿  上升沿
//同步  打拍
always @(posedge clk or negedge rst_n)begin if(!rst_n)beginkey_in_r1 <= 2'b11;end else begin key_in_r1 <= key_in;      //同步按键输入信号end 
end//r1当前状态
assign nedge = ~key_in_r1 && key_in;
assign pedge = key_in_r1 && ~key_in;//key_outalways @(posedge clk or negedge rst_n) beginif(!rst_n)key_out <= 0;else if(end_cnt_20ms &&(state_c== JITTLE1))key_out <= ~key_in_r1;//有效脉冲 20nselse key_out <= 0;endendmodule

2、LED相关设计文件编写

新建led_ctrl.v文件

module led_ctrl(input               clk         ,input               rst_n       ,input          key_flag    ,//输入原始的按键信号output  reg    led     //输出处理之后的按键信号
);
always @(posedge clk or negedge rst_n )beginif(!rst_n)led<=1'b0;else if(key_flag)led<=~led;
end
endmodule

3、顶层文件编写

在顶层文件中,使用一个中间变量key_out将按键中的输出赋值给LED模块中的按键标志位输入key_flag。

module top(input  clk,input  rst_n,input  key_in,output  led);
wire   key_out;
key key_inst(/*input          */ .clk     (clk   ),/*input          */ .rst_n   (rst_n ),/*input          */ .key_in  (key_in),   //输入原始的按键信号/*output  reg    */ .key_out (key_out)    //输出处理之后的按键信号
);led_ctrl led_inst(/*input          */ .clk     (clk   ),/*input          */ .rst_n   (rst_n ),/*input          */ .led     (led),   //输入原始的按键信号/*output  reg    */ .key_flag (key_out)    //输出处理之后的按键信号
);
endmodule

4、测试文件编写

`timescale 1ns/1nsmodule top_tb ;reg         clk    ;reg         rst_n  ;reg         key_in ;wire        led    ;defparam top_inst.key_inst.TIME_20MS = 1000;top top_inst(.clk            (clk        ),.rst_n          (rst_n      ),.key_in         (key_in     ),   //输入原始的按键信号.led            (led    )    //输出处理之后的按键信号
);
//激励信号产生
parameter CLK_CLY = 20;
//时钟
initial clk=1;
always #(CLK_CLY/2)clk=~clk;//复位
initial beginrst_n= 1'b0;#(CLK_CLY*3);#5;//复位结束避开时钟上升沿rst_n= 1'b1;
end//激励
integer i;
initial repeat(5)beginkey_in = 1;//模拟按键未按下i ={$random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;repeat (3)begin key_in = 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i+5)*50)beginkey_in = $random;#(CLK_CLY*1);end key_in = 0;//按键稳定#(CLK_CLY*100*50);//后抖动开始key_in = 1;#(CLK_CLY*1);repeat ((i+5)*50)beginkey_in = $random;#(CLK_CLY*1);end key_in = 1;//按键稳定#(CLK_CLY*10*500);end//模拟意外抖动repeat (3)begin repeat ((i+5)*50)beginkey_in = $random;#(CLK_CLY*1);end key_in = 1;//按键稳定#(CLK_CLY*500);end $stop;
end
endmodule

三、仿真波形图

通过波形图我们可以看见当按键按下一次,LED状态切换一次,实现了按键控制LED的功能实现。 

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

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

相关文章

计算机毕业设计碾压导师Python+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

基于Spark的农产品个性推荐系统 相关技术介绍: 1. Python Python是一种高级编程语言&#xff0c;具有简洁、易读、易学的特点&#xff0c;被广泛应用于Web开发、数据分析、人工智能等领域。 在此系统中&#xff0c;我们使用Python进行后端开发&#xff0c;利用其强大的语法…

Mysql 输出本月初至当前的全部天数

代码&#xff1a; SELECT DATE_FORMAT(DATE_ADD(CONCAT(DATE_FORMAT(CURDATE(), "%Y-%m-01")),INTERVAL (CAST(help_topic_id AS SIGNED)) DAY),%Y-%m-%d) as DATE FROMmysql.help_topic WHERE help_topic_id < TIMESTAMPDIFF(DAY, CONCAT(DATE_FORMAT(CURDATE…

【最优化方法】随笔 - 基本概念简单整理

文章目录 前言1.背景知识两个概念&#xff1a; 2.最优化问题2.1应用2.2 最优化问题的数学形式极小化目标函数可行区域可行解 2.3 举例说明2.4 最优化问题不同的类型2.5 一些概念 3.凸集和凸函数3.1 范数3.2 矩阵范数&#xff08;扩展&#xff09;3.3 凸集与凸函数凸集凸函数 写…

无人机像素经纬度识别

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

旅美钢琴学者何超东北巡演启幕,精湛演绎肖邦全套作品

7月26日、28日&#xff0c;旅美钢琴学者何超在长春和哈尔滨两地成功开启了他的暑期钢琴独奏音乐会东北巡演。在这两场演出中&#xff0c;何超为观众带来了全套肖邦的「谐谑曲」与「叙事曲」&#xff0c;以娴熟的技巧、惊人的记忆力和体力&#xff0c;将八首曲目一气呵成&#x…

这可能是开源界最好用的能源管理系统

&#x1f482; 个人网站: IT知识小屋&#x1f91f; 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 写在前面项目简介项目特点项目架构模块展示项目获取 写在前面 大…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

Java之归并排序

归并排序 归并排序(Merge Sort)算法&#xff0c;使用的是分治思想。分治&#xff0c;顾名思义&#xff0c;就是分而治之&#xff0c;将一个大问题分解成小的子问题来解决。小的子问题解决了&#xff0c;大问题也就解决了。 核心源码: mergeSort(m->n) merge(mergeSort(m-&g…

什么是等保测评?

信息安全等级保护测评&#xff0c;简称等保测评&#xff0c;是根据我国《信息安全等级保护管理办法》的规定&#xff0c;对国家重要信息系统进行的安全评估制度。等保测评的频率、必要性以及在实际操作中的常见误区&#xff0c;是企业和机构在进行等保测评时需要了解的重要内容…

ts踩坑!使用可选链 ?.处理可能遇到的 undefined 或 null 值的情况,但是仍然收到一个关于可能为 undefined 的警告!

在 TypeScript 中&#xff0c;当你使用可选链&#xff08;Optional Chaining&#xff09;?. 时&#xff0c;你其实已经处理了可能遇到的 undefined 或 null 值的情况。但是&#xff0c;如果你仍然收到一个关于可能为 undefined 的警告&#xff0c;这可能是因为 TypeScript 的类…

web自动化6-pytest③实践测试用例-回归用例web自动化

# -*- coding: utf-8 -*- """ lemut_select - 业务受理 Author: duxiaowei Date: 2024/7/17 """ import timeimport allure import pytest from selenium.webdriver.common.by import By# 业务受理 allure.feature("业务受理") class …

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 &#x1f4d5;Play To Device 软件升级 ht…

使用 Visual Studio 2022 自带的 cl.exe 编译 tensorRT自带测试样例 sampleOnnxMNIST

1. 新建任意文件夹&#xff0c;将 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sampleOnnxMNIST.cpp 文件复制进来&#xff0c;同时 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sample_onnx_mnist.vcxproj 中的内容&…

vite5-macos仿macOS网页osx管理系统|vue3+arcoDesign桌面os

基于vite5.xvue3arco-design原创自研网页版os管理框架ViteWebOS。 使用最新前端技术vite5vue3pinia2arcoDesignsortablejsecharts搭建网页pc版桌面os式后台管理系统解决方案。支持自定义桌面栅格布局引擎、可拖拽桌面图标、多屏分页管理、自定义桌面壁纸主题、毛玻璃虚化背景等…

学Java一篇文章就够了(手把手教你入门)

第11章 枚举&注解&内部类 一、枚举 概念 枚举类型是Java 5中新增特性的⼀部分&#xff0c;它是⼀种特殊的数据类型&#xff0c;之所以特殊是因为它既是⼀种类 (class)类型却⼜⽐类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安…

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测&#xff0c;三角拓扑聚合…

C语言 #具有展开功能的排雷游戏

文章目录 前言 一、整个排雷游戏的思维梳理 二、整体代码分布布局 三、游戏主体逻辑实现--test.c 四、整个游戏头文件的引用以及函数的声明-- game.h 五、游戏功能的具体实现 -- game.c 六、老六版本 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 一、整个排…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录&#xff0c;有wordpress框…

Paimon数据湖详解(第49天)

系列文章目录 一. Paimon数据湖增删改查 二. 查询优化 三. 系统表 四. Lookup Joins 文章目录 系列文章目录前言Paimon数据湖的使用1、创建Table1.1 创建catalog管理的表1.2 分区表1.3 Create Table As&#xff08;了解&#xff09;1.4 Create Table Like1.5 表属性1.6 创建外…

无心剑中译莎士比亚《爱如星辰引迷舟》

莎士比亚十四行诗第116首 Sonnet 116 爱如星辰引迷舟 Let me not to the marriage of true minds Admit impediments. Love is not love Which alters when it alteration finds, Or bends with the remover to remove: O, no! it is an ever-fixed mark That looks on tempe…