【正点原子FPGA连载】第九章 按键控制LED实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

news2024/9/22 9:31:06

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第九章 按键控制LED实验

按键是常用的一种控制器件。生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电、数码产品、玩具等方面有广泛的应用。本章我们将介绍如何使用按键来控制LED闪烁的方式。
本章包括以下几个部分:
799.1按键简介
9.2实验任务
9.3硬件设计
9.4程序设计
9.5下载验证

9.1按键简介
按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关:第一种是本实验所使用的轻触式按键开关(如图 9.1.1),简称轻触开关。使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键(如图 9.1.2),自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来,开发板上的电源键就是这种开关。
在这里插入图片描述

图 9.1.1 轻触式按键
在这里插入图片描述

图 9.1.2 自锁式按键
9.2实验任务
本节实验任务是使用开发板上的PL_KEY1和PL_KEY2按键来控制开发板上的PL_LED1和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键PL_KEY1按下,则两个LED交替闪烁;如果按键PL_KEY2按下,则两个LED同时闪烁。
9.3硬件设计
开发板上按键的原理图如下图所示:
在这里插入图片描述

图 9.3.1 按键电路原理图
在图 9.3.1中,PL_KEY1和PL_KEY2与PL_RST连接到MPSoC的PL端,PS_KEY1和PS_KEY2连接到MPSoC的PS端。在《DFZU2EG/4EV MPSoC开发板之FPGA开发指南》中,我们只使用PL端的外设。
PL端的按键没有按下时,对应的IO端口为高电平;当按键按下时,对应的IO端口变为低电平。
本实验的管脚分配如下表所示:
表 9.3.1 按键控制LED实验管脚分配
在这里插入图片描述

对应的XDC约束语句如下所示:
#IO管脚约束

#时钟周期约束
create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p]
#时钟
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n]
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AF5 [get_ports sys_clk_n]
#复位
set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
#按键
set_property -dict {PACKAGE_PIN AD11 IOSTANDARD LVCMOS33} [get_ports key[0]]
set_property -dict {PACKAGE_PIN AD10 IOSTANDARD LVCMOS33} [get_ports key[1]]
#LED灯
set_property -dict {PACKAGE_PIN AE10 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN AF10 IOSTANDARD LVCMOS33} [get_ports {led[1]}]

9.4程序设计
按键控制LED系统框图如下图所示:
在这里插入图片描述

图 9.4.1 按键控制LED系统框图
在图 9.4.1中,计数器对由差分转单端得到的系统时钟(sys_clk)100MHz时钟进行计数,从而达到计时的目的。计数器在每次计时到0.5秒的时候,就改变LED的显示状态,然后清零并重新开始计数。
然后根据两个按键(KEY0和KEY1)的状态,在不同的LED状态下,分别设置LED的显示模式(是同时闪烁,或者交替闪烁)。
顶层模块代码如下:

1  module key_led(
2      input               sys_clk_p,    //系统差分输入时钟
3      input               sys_clk_n,    //系统差分输入时钟
4      input               sys_rst_n,    //系统复位
5  
6      input        [1:0]  key,          //按键
7      output  reg  [1:0]  led           //LED灯
8  );
9  
10 //reg define
11 reg [26:0] cnt;                      //计数器
12 reg        led_ctrl;
13 
14 //*****************************************************
15 //**                    main code
16 //*****************************************************
17 
18 //转换差分信号
19 IBUFDS diff_clock
20 (
21     .I (sys_clk_p),    //系统差分输入时钟
22     .IB(sys_clk_n),    //系统差分输入时钟
23     .O (sys_clk)       //输出系统时钟
24 ); 
25 
26 //计数器
27 always @ (posedge sys_clk or negedge sys_rst_n) begin
28     if(!sys_rst_n)
29         cnt <= 27'd0;
30     else if(cnt < 27'd5000_0000)  //计数500ms
31         cnt <= cnt + 1'b1;
32     else
33         cnt <= 27'd0;
34 end
35 
36 //每隔500ms就更改LED的闪烁状态
37 always @ (posedge sys_clk or negedge sys_rst_n) begin
38     if(!sys_rst_n)
39         led_ctrl <= 1'b0;
40     else if(cnt == 27'd5000_0000)
41         led_ctrl <= ~led_ctrl;
42 end
43 
44 //根据按键的状态以及LED的闪烁状态来赋值LED
45 always @ (posedge sys_clk or negedge sys_rst_n) begin
46     if(!sys_rst_n)
47         led <= 2'b11;
48     else case(key)
49         2'b10 :  //如果按键0按下,则两个LED交替闪烁
50             if(led_ctrl == 1'b0)
51                 led <= 2'b01;
52             else
53                 led <= 2'b10;
54         2'b01 :  //如果按键1按下,则两个LED同时亮灭交替
55             if(led_ctrl == 1'b0)
56                 led <= 2'b11;
57             else
58                 led <= 2'b00;
59         2'b11 :  //如果两个按键都未按下,则两个LED都保持点亮
60                 led <= 2'b11;
61         default: ;
62     endcase
63 end
64 
65 endmodule

代码的第27行的always块用于产生计数器,计时500ms。代码的第37行的always块功能是每隔500ms就给出led的闪烁状态控制信号。代码第45行的always块使用了一个case语句,来根据当前按键的输入值和led闪烁状态控制信号,来进行两个led的赋值。如果按键1按下,则两个LED交替闪烁;如果按键0按下,则两个LED同时亮灭交替;如果两个按键都未按下,则两个LED都保持点亮。
9.5下载验证
连接开发板的下载器,然后连接电源线,最后将开发板的电源拨码开关按键往电源指示灯的方向拨动对开发板进行上电,上电成功后开发板的电源指示灯会亮蓝灯。在工程编译之后,将生成的bit文件下载到开发板中。下载完成之后,开发板上两个PL LED处于点亮状态。然后按下PL_KEY1,可以看到两个PL LED交替闪烁;按下PL_KEY2,可以看到两个PL的LED同时闪烁。如下图所示:
在这里插入图片描述

图 9.5.1 实验现象

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

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

相关文章

骨传导耳机是怎么传声的?骨传导耳机到底有哪些好处?

骨传导耳机最近在网上也是越来越火了&#xff0c;作为一种可以开放双耳的耳机&#xff0c;对比一般的耳机&#xff0c;它可以做到开放双耳&#xff0c;不堵耳道&#xff0c;保持耳朵健康卫生。 但是随着这种耳机的逐渐崛起&#xff0c;很多人也对这种耳机产生了疑惑&#xff1…

正版软件|WonderFox Photo Watermark 图片水印批量处理软件

Photo Watermark 可以为您做什么&#xff1f;水印是最有效的方法&#xff0c;可防止他人擅自使用您的照片。只需单击几下&#xff0c;Watermark Software 将为您的图像文件提供不可磨灭的保护。 可自定义的水印 文本水印 只需按键即可创建支持丰富字体&#xff0c;符号&#x…

Redis进阶(主从复制、Redis集群、缓存穿透、缓存击穿、缓存雪崩)

目录 1、主从复制&#xff08;读写分离&#xff09; 1.1、什么是主从复制 1.2、主从复制的作用 1.3、环境搭建 1.4、一主二仆 1.5、注意事项 1.6、反客为主 1.7、哨兵模式&#xff08;sentinel&#xff09; 2、Redis集群 2.1、什么是集群 2.2、什么是redis集群 2.3…

报表工具使用之FineReport大数据集导出插件

1. 概述 1.1 版本 报表服务器版本 插件版本 功能变更 11.0 V1.0.0 - 11.0.10 V1.1.16 1&#xff09;插件名称变更为&#xff1a;大数据集导出插件 2&#xff09;支持导出为 CSV 类型文件 1.2 应用场景 大批量数据导出的时候&#xff0c;会对服务器、网络传输、数据库…

Python eval()函数详解

一、eval()函数 用来执行一个字符串表达式&#xff0c;并返回表达式的值。可以把字符串转化为list,dict ,tuple。 二、eval()函数源码 三、eval()函数语法 eval(*args, **kwargs) 说明&#xff1a; expression -- 表达式。globals -- 变量作用域&#xff0c;全局命名空间&…

设计模式之美——单元测试和代码可测性

最可落地执行、最有效的保证重构不出错的手段应该就是单元测试&#xff08;Unit Testing&#xff09;。 什么是单元测试&#xff1f; 单元测试由研发工程师自己来编写&#xff0c;用来测试自己写的代码的正确性。我们常常将它跟集成测试放到一块来对比。单元测试相对于集成测…

【PyTorch】Torchvision Models

文章目录六、Torchvision Models1、VGG1.1 add1.2 modify2、Save and Load2.1 模型结构 模型参数2.2 模型参数&#xff08;官方推荐&#xff09;2.3 Trap六、Torchvision Models 1、VGG VGG参考文档&#xff1a;https://pytorch.org/vision/stable/models/vgg.html 以VGG16为…

apache-atlas-hbase-hook源码分析

元数据类型 Hbase元数据类型, 包括命令空间、表、列族、列 public enum HBaseDataTypes {// ClassesHBASE_NAMESPACE,HBASE_TABLE,HBASE_COLUMN_FAMILY,HBASE_COLUMN;public String getName() {return name().toLowerCase();} }Hbase元数据采集实现 1&#xff09;批量采集HBa…

【windows】实战部署二(使用)SVNserver服务端+SVNclient客户端

SVN服务器应用 创建版本库 1、打开VisualSVN Server&#xff1a; 2、建立版本库&#xff1a; 需要右键单击左边窗口的Repositores,在弹出的右键菜单中选择Create New Repository或者新建-Repository 3、默认选择&#xff0c;点击 “下一步” 按钮&#xff1a; Regular FSFS…

物联网安全年报漏洞情况

物联网 威胁分析漏洞篇物联网威胁分析—漏洞篇 引言 本章将从漏洞利用角度对物联网威胁进行分析。首先&#xff0c;我们分析了 NVD和 Exploit-DB中的物联网 年度漏洞及利用 1 变化趋势&#xff1b;之后统计了绿盟威胁捕获系统捕获到的物联网漏洞利用的整体情况&#xff1b;最…

Matlab深度学习实战一:LeNe-5图像分类篇MNIST数据集分十类且matlab提供模型框架全网为唯一详细操作流程

1.数据集简介下载与准备 2.matlab搭建模型相关知识 3.matlab软件的操作过程&#xff1a; &#xff08;1&#xff09;界面操作 &#xff08;2&#xff09;深度学习设计器使用 &#xff08;3&#xff09;图像数据导入 &#xff08;4&#xff09;训练可视化 一、数据集简介下载与…

mysql基本命令操作

MySQL数据库管理 SQL语句 SQL语句用于维护管理数据库&#xff0c;包括数据查询、数据更新、访问控制、对象管理等功能 DDL&#xff1a;数据定义语言&#xff0c;用于创建数据库对象&#xff0c;如库、表、索引等 DML&#xff1a;数据操纵语言&#xff0c;用于对表中的数据进行…

[附源码]计算机毕业设计JAVA民宿网站管理系统

[附源码]计算机毕业设计JAVA民宿网站管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

Android 10.0 11.0 12.0 启动模拟器教程

Android 10.0 11.0 12.0 启动模拟器教程 一、android 12.0 模拟器二、创建模拟器设备三、创建删除路经文件夹avd和配置环境变量四、启动模拟器一、android 12.0 模拟器 Android 10.0 11.0 12.0 启动模拟器都行,我选择android 12.0 模拟器 二、创建模拟器设备 第一步骤:在 …

i211网卡在Monterey及以上驱动方法

两种方法&#xff1a;一、驱动换成别人修改后的AppleIGB.kext。这么做一般情况用着没问题。但是如果你虚拟机桥接到这个网卡&#xff0c;可以获取到IP,网关等所有参数&#xff0c;就是不能上网 二、刷网卡固件&#xff0c;将i211刷成i210&#xff0c;直接免驱。 macos下操作 …

Brooks曾经在UMLChina网站留过言-回忆和送别(1)

&#xff08;抱歉&#xff0c;有点标题党。&#xff09; 《人月神话》作者Frederick Phillips Brooks Jr. 于2022年11月17日逝世&#xff0c;享年91岁。 图1 摘自 https://christianityandscholarship.org/event/making-things-ncsu-10-27-2015/ 这个岁数即使在今天也算是“…

玩转MySQL:都2022年了,这些数据库技术你都知道吗

引言 MySQL数据库从1995年诞生至今&#xff0c;已经过去了二十多个年头了&#xff0c;到2022.04.26日为止&#xff0c;MySQL8.0.29正式发行了GA版本&#xff0c;在此之前版本也发生了多次迭代&#xff0c;发行了大大小小N多个版本&#xff0c;其中每个版本中都有各自的新特性&…

亚马逊差评怎么删?常用的几种删差评方法介绍

正常情况下每个电商产品都是有好评和差评的&#xff0c;如果一味的都是好评&#xff0c;那么也显的很假&#xff0c;但是差评太多也会影响销售&#xff0c;特别是面对那些恶意差评&#xff0c;这会严重的影响客户下单&#xff0c;因此对于恶意差评&#xff0c;我们还是的想办法…

【Java八股文总结】之Java Web

文章目录Java Web一、Java Web介绍Q&#xff1a;什么是Java Web&#xff1f;Q&#xff1a;Java Web的工作原理&#xff1f;Q&#xff1a;Java Web的知识体系二、JDBC1、JDBC的使用步骤2、JDBC API详解1、DriverManager2、Connection3、Statement4、ResultSet5、PreparedStateme…

连续词袋模型(Continous bag of words, CBOW)

将高维度的词表示转换为低纬度的词表示方法我们称之为词嵌入&#xff08;word embedding&#xff09;。 CBOW是通过周围词去预测中心词的模型。&#xff08;Skip-gram是用中心词预测周围词&#xff09; CBOW模型的结构 最左边为上下文词&#xff0c;这些词用One-hot编码表示&a…