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 凸集与凸函数凸集凸函数 写…

实时宽表建设

实时宽表建设是数据仓库&#xff08;Data Warehouse, 简称数仓&#xff09;中的一种重要建模技术&#xff0c;旨在提高数据查询和分析的效率。以下是对实时宽表建设的详细解释&#xff1a; 一、定义 实时宽表&#xff0c;顾名思义&#xff0c;是指具有较多字段&#xff08;列…

无人机像素经纬度识别

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

组件库 组件工程化管理探索

文章目录 组件库单组件版本控制打包组件在用户项目中注册组件项目可以直接在模版中使用引入的打包后的组件原因 每个组件独立的 package.json 文件的单组件包管理使用 lerna 或 yarn workspaces 进行统一管理添加组件文档、测试通过 CI/CD 流水线自动化这个流程 国际化换肤组件…

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

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

一体化政务大数据体系-数据目录系统

1、系统目标 实现数据目录一体化&#xff0c;按照应编尽编的原则&#xff0c;推动各地区各部门建立全量覆盖、互联互通的高质量一体化政务数据目录。建立数据目录系统与部门目录、地区目录实时同步更新机制&#xff0c;实现政务数据“一本账”管理。 2、需求描述 一是实现政…

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

&#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…

Java8新特性(一) Lambda表达式与函数式接口

Java8新特性&#xff08;一&#xff09; Lambda表达式与函数式接口 一. 基本概念 Lambda表达式是Java 8中引入的一个重要的新特性&#xff0c;该表达式提出了一种新的语法规则&#xff0c;用于对某些&#xff08;函数式接口&#xff09;匿名内部类的书写方式进行简化。除此之外…

什么是等保测评?

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

智能写作分享

智能写作技术路线 ​ 在大模型的现有能力框架内&#xff0c;其对于处理长文档级别的智能写作任务存在一定的局限性。针对这一问题&#xff0c;本文深入探讨了长文档智能写作这一应用场景&#xff0c;并在此基础上&#xff0c;提出了一套切实可行的技术解决方案。该方案旨在弥补…

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

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

关于js函数参数是否会实时更新的问题

遇到一个小问题 export function test001(value, callback) {setTimeout(() > {if (value undefined) {test001(value, callback)} else {callback()}}, 100) }// 调用处 // 要测试的变量 param01 test001(param01, () > {console.log(值不为空啦) }) 这个变量param01…

指针的意义

/指针------------------------------------------------------------------------------------------ // 1&#xff0c;指针是---------- // 通过它能找到以它为地址的内存单元 //int main() //{ // int a 10;//开辟一块空间 // int* p &a;//将变量a的地址取出&…

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 中的内容&…