07 按键控制 LED

按键简介

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

硬件原理图

LED原理图

LED0 到 LED3 这 4 个发光二极管的阴极分别连到 S8050(NPN 三极管)的集电极上,阳极都与 3.3V 电压相连,三极管的基极分别与 FPGA 相连,这是由于 FPGA 的 IO 口的电压只有 1.5V,电压较低,所以此处连接三极管是为了起到放大电压的作用。这样就可以通过改变三极管的状态来控制 LED 的亮灭。当 FPGA 输出到为高电平时,三极管导通,LED 灯亮;当 FPGA 输出到为低电平时,三极管截止,LED 灯灭。
在这里插入图片描述
在这里插入图片描述

按键原理图

每个按键都连接了一个 1K 电阻(起到限流的作用,以防止按键被按下时电源直接接地造成电路短路),当按键未按下时,为高电平,按下后,为低电平。
在这里插入图片描述
在这里插入图片描述

程序功能

使用 4 个按键来控制 4 颗 LED 灯。没有按键被按下时,4 颗 LED 保持常灭;如果按键 KEY0 被按下, LED 灯从低位到高位流水;如果按键 KEY1 被按下,LED 灯从高位到低位流水;如果按键 KEY2 被按下,LED 灯交替闪烁;KEY3 被按下,LED 灯常亮。
在这里插入图片描述

系统框图

在这里插入图片描述

代码编写

`timescale 1ns / 1ns	//仿真单位/仿真精度module key_led #(//参数列表parameter COUNT_WIDTH = 25,				//内部计数器宽度parameter COUNT_PERIOD = 25_000_000		//计数器最大周期,决定LED多久变化依次
)
(input sys_clk,							//时钟input sys_rst_n,						//复位input [3:0] key,						//按键output reg [3:0] led					//led
);//周期计数器,当计数到COUNT_PERIOD-1时LED进行输出状态切换
reg [COUNT_WIDTH-1:0] count;
//LED等控制标志
//流水灯模式时记录当前点亮的是那个LED
//闪烁模式时led_flag[0]用于亮灭控制
reg [1:0] led_flag;//周期计数器,当计数到COUNT_PERIOD-1时LED进行输出状态切换
always @(posedge sys_clk) beginif(!sys_rst_n)count <= 0;else if(count < (COUNT_PERIOD - 1))count <= count+ 1;elsecount <= 0;
end//LED等控制标志
//流水灯模式时记录当前点亮的是那个LED
//闪烁模式时led_flag[0]用于亮灭控制
always @(posedge sys_clk) beginif(!sys_rst_n)led_flag <= 2'h0;else if(count == (COUNT_PERIOD - 1))led_flag <= led_flag + 2'h1;
end//根据按键状态和流水灯控制标志控制LED输出
always @(posedge sys_clk) beginif(!sys_rst_n)led <= 4'b0000;else if(key == 4'b1111)				//全灭led <= 4'b0000;else if(key == 4'b1110) begin		//从led0到led3流水if(led_flag == 2'd0)led <= 4'b0001;else if(led_flag == 2'd1)led <= 4'b0010;else if(led_flag == 2'd2)led <= 4'b0100;elseled <= 4'b1000;endelse if(key == 4'b1101) begin		//从led3到led0流水if(led_flag == 2'd0)led <= 4'b1000;else if(led_flag == 2'd1)led <= 4'b0100;else if(led_flag == 2'd2)led <= 4'b0010;elseled <= 4'b0001;endelse if(key == 4'b1011) begin		//闪烁if(led_flag[0] == 1'b0)led <= 4'b1111;elseled <= 4'b0000;endelse if(key == 4'b0111)				//全亮led <= 4'b1111;
endendmodule

仿真验证激励程序

`timescale 1ns/1ns //仿真的单位/仿真的精度module tb_key_led();reg sys_clk;					//时钟
reg sys_rst_n;					//复位
reg [3:0] key;					//按键wire [3:0] led;					//ledinitial beginsys_clk = 1'b0;sys_rst_n = 1'b0;key <= 4'b1111;#180sys_rst_n = 1'b1;#2000key <= 4'b1110; //按下 KEY0#2000key <= 4'b1111; //释放 KEY0#2000key <= 4'b1101; //按下 KEY1#2000key <= 4'b1111; //释放 KEY1#2000key <= 4'b1011; //按下 KEY2#2000key <= 4'b1111; //释放 KEY2#2000key <= 4'b0111; //按下 KEY3#2000key <= 4'b1111; //释放 KEY3
endalways #10 sys_clk = ~sys_clk;key_led #(//参数列表.COUNT_WIDTH(25),.COUNT_PERIOD(25)
)
tb_key_led_inst(.sys_clk(sys_clk),				//时钟.sys_rst_n(sys_rst_n),			//复位.key(key),						//按键.led(led)						//led
);
endmodule

时序约束

时序约束(Timing Constraints)用来描述设计人员对时序的要求,比如时钟频率,输入输出的延时等,以满足设计的时序要求。对时序约束最简单的理解就是,设计者告诉 EDA 工具设计中所使用的时钟信号的参数(如频率等),然后 EDA 工具按照所要求的时钟参数去优化布局布线,使设计能够在要求的时钟下正常工作
一般情况下对于简单的设计,即使不对工程做时序约束,也不影响最终的功能。但是当设计变得复杂起来,或者输入的时钟频率比较高的时候,如果不添加时序约束,那么就有可能导致功能异常。

添加时序约束

  1. 对时钟进行约束前,需要先对代码进行综合,即点击 Vivado 左侧“Flow Navigator”窗口下“Run Synthesis”按钮来对代码进行综合
    在这里插入图片描述
    在弹出的窗口中我们直接点击“OK”
    在这里插入图片描述

  2. 综合完成后,在弹出的“Synthesis Completed”窗口中我们直接点击“X”即可
    在这里插入图片描述

  3. 点击 Vivado 左侧“Flow Navigator”窗口下的“Edit Timing Constraints”按钮了
    在这里插入图片描述

  4. 点击“Edit Timing Constraints”按钮后,Vivado 就会打开“Timing Constraints”界面,我们点击该界面下的“+”号按键就可以添加时钟约束了
    在这里插入图片描述

  5. 点击“+”号后,弹出的“Create Clock”界面
    在这里插入图片描述
    “Create Clock”界面中各参数定义如下:
    Clock name:时钟名称,用于为所创建的时钟约束命名。为了可以一眼看出该时钟约束的约束源,通常情况下其命名与被约束的时钟信号名相同
    Source objects:源对象,用于指定被约束的时钟对象
    Waveform:波形,用于设置时钟的周期(Period),上升沿(Rise at)、下降沿(Fall at)以及勾选 Add this clock to the existing clock(是否将该时钟添加到现有时钟中)
    Command:命令,即通过我们上述的配置后,vivado 自动生成的约束命令,该命令是可以直接复制粘贴到 XDC 文件中使用的

  6. 点击“Source objects”框后的“…”指定时钟源对象
    在这里插入图片描述

  7. 点击“…”后弹出“Specify Clock Source Objects”,在“Specify Clock Source Objects”界面中“Find”之上的各个选项主要用于设置筛选条件,因为系统时钟来自于 IO 口,所以“Find names of type(寻找名称类型)”选择“I/O Port”,其余选项保持默认。
    在这里插入图片描述

  8. 在找到的信号中,我们选择需要约束的系统时钟信号(sys_clk)然后点击“→”按钮将其添加到右侧窗口。
    在这里插入图片描述

  9. 之后点击“Set”即可将该信号定义为源对象
    在这里插入图片描述

  10. 点击 “Create Clock” 的“OK”即可添加约束并关闭“Create Clock”界面
    在这里插入图片描述

  11. 此时的 “Timing Constraints”界面如下
    在这里插入图片描述

  12. 点击 Vivado 软件左上方的保存图标来将其保存到 XDC 文件中,如果弹出“Out of Date Design”则点击 “OK”
    在这里插入图片描述
    在这里插入图片描述

  13. 在弹出的“Save Constraints”界面中会默认保存到现有的 XDC 文件中,所以直接点击“OK”
    在这里插入图片描述

管脚约束

管脚约束方法1:
直接在约束文件中增加如下内容,用于约束IO引脚

#IO 引脚约束
#------------------------------系统时钟和复位-----------------------------------
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS15} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U7 IOSTANDARD LVCMOS15} [get_ports sys_rst_n]
#----------------------------------按键-----------------------------------------
set_property -dict {PACKAGE_PIN T4 IOSTANDARD LVCMOS15} [get_ports {key[0]}]
set_property -dict {PACKAGE_PIN T3 IOSTANDARD LVCMOS15} [get_ports {key[1]}]
set_property -dict {PACKAGE_PIN R6 IOSTANDARD LVCMOS15} [get_ports {key[2]}]
set_property -dict {PACKAGE_PIN T6 IOSTANDARD LVCMOS15} [get_ports {key[3]}]
#-----------------------------------LED-----------------------------------------
set_property -dict {PACKAGE_PIN V9 IOSTANDARD LVCMOS15} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN Y8 IOSTANDARD LVCMOS15} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN Y7 IOSTANDARD LVCMOS15} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN W7 IOSTANDARD LVCMOS15} [get_ports {led[3]}]

管脚约束方法2:

  1. 需要先对代码进行综合,即点击 Vivado 左侧“Flow Navigator”窗口下“Run Synthesis”按钮来对代码进行综合
    在这里插入图片描述
  2. 综合完成后选择 Vivado 左侧“Flow Navigator”窗口下“SYNTHESIS“
    在这里插入图片描述
  3. 在右上角的窗口布局中选择”I/O Planning“
    在这里插入图片描述
  4. 选中下面的”I/O Ports“页面
    在这里插入图片描述
    Name:工程中顶层端口的名称。
    Direction:说明管脚是输入还是输出。
    Neg Diff Pair:负差分对,差分信号在 I/O Ports 窗口中只显示在一行里(只会显示 P 端信号,N 端信号显示在 Neg Diff Pair 属性栏中)。
    Package Pin:配置管脚封装。
    Fixed:每一个端口都有 Fixed 属性,表明该逻辑端口是由用户赋值的。端口必须保持锁定状态,才能避免生成比特流时不会发生错误。
    Bank:显示管脚所在的 Bank。
    I/O Std:配置管脚的电平标准,常用电平标准有 LVTTL 和 LVCMOS、SSTL、LVDS 与 HSTL 等。
    Vcco:选择的管脚的电压值。
    Vref:在我们的设计中,硬件上 VREF 引脚悬空。
    Drive Strength:驱动强度,默认 12mA。
    Slew Type:指上升下降沿的快慢,设置快功耗会高一点,默认设置慢(slow)。
    Pull Type:管脚上下拉设置,有上拉、下拉、保持与不设置。
    Off-Chip Termination:终端阻抗,默认 50Ω。
    IN-TERM:是用于 input 的串联电阻。
    提示
    如果页面被不小心关掉了可以选择右上角的”Reset Layout“
    在这里插入图片描述
  5. 在I/O Ports中根据原理图完成引脚约束
  6. 点击 Vivado 软件左上方的保存图标来将其保存到 XDC 文件中,如果弹出“Out of Date Design”则点击 “OK”
    在这里插入图片描述
    在这里插入图片描述
  7. 在弹出的“Save Constraints”界面中会默认保存到现有的 XDC 文件中,所以直接点击“OK”
    在这里插入图片描述

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

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

相关文章

git分布式版本控制工具基本操作

Windows操作 1.1 git基本操作 1.设置用户签名 git config user.name xx git config user.email xxb163.com2.初始化本地库 git init3.查看本地库状态 git status4.添加暂存区 git add 文件名称 git add *5.提交本地库 git commit -m "描述信息" 文件6.查看版本…

《富爸爸:巴比伦最富有的人》读书笔记

目录 作者简介 感悟 经典摘录 观点&#xff1a; 支付给自己(理解是投资自己) 观点&#xff1a;源源不断地放入金币 观点&#xff1a; 把收入的一部分留给我自己 观点&#xff1a; 从专业的人士得到建议 观点&#xff1a;一旦为自己规定了任务&#xff0c;就一定要完成 …

微波炉维修笔记

微波主要是靠2.45GHz 左右的微波(12.2cm 波长)加热水分子实现食物加热 所有不要使用金属器皿进行加热&#xff0c;要么因为电磁屏蔽&#xff0c;起不到加热效果&#xff0c;要么火光四射 微波炉基本组成 借鉴姜师傅的视频 碰到不加热其它都正常的问题 1.检查高压电容 使用万…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

【STM32】软件SPI读写W25Q64芯片

目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h main.c 测试 SPI通信&#xff08;W25Q64芯片简介&am…

说说对BOM的理解(常见的BOM对象了解哪些)

文章目录 一、是什么二、window三、location四、navigator五、screen六、history 一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 其作用就是跟浏览器做一些交互效果,比如如何进行页面的后退&…

四川盐亭清代古寨重现,文物建筑保护引关注

近日&#xff0c;在四川盐亭的五台山深处&#xff0c;一处历经160余年风霜的古山寨遗迹重现天日。寨门巍峨&#xff0c;文字斑驳&#xff0c;诉说着清代同治年间的历史沧桑。然而&#xff0c;岁月侵蚀下&#xff0c;文物保护刻不容缓。温湿度波动等自然因素&#xff0c;对这些珍…

森林气象火险监测站

TH-SL10在广袤无垠的森林中&#xff0c;每一片树叶、每一缕风都蕴含着大自然的秘密。而在这片生机勃勃的绿色世界里&#xff0c;森林气象火险监测站就像是守护宝藏的“千里眼”和“顺风耳”&#xff0c;时刻警惕着潜在的危险。 一、森林气象火险监测站&#xff1a;实时监测的“…

生成式 AI - Diffusion 模型的数学原理(3)

来自 论文《 Denoising Diffusion Probabilistic Model》&#xff08;DDPM&#xff09; 论文链接&#xff1a; https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、图像生成模型本质上的共同目标二、最大似然估计三、和VAE的关联四、概率计算 一、图像生成模…

GC9008 12V 全桥驱动芯片,可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装 芯片特点 ● H 桥电机…

计算机服务器中了_locked勒索病毒怎么办?Encrypted勒索病毒解密数据恢复

随着网络技术的不断发展&#xff0c;数字化办公已经成为企业生产运营的根本&#xff0c;对于企业来说&#xff0c;数据至关重要&#xff0c;但网络威胁无处不在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了_locked勒索…

Python 基于 AI 动物识别技术的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

迁移SVN和GIT的云端数据

在新服务器搭建GIT仓库 教程很多&#xff0c;大致的流程是&#xff1a; 1. 新建linux用户密码专用于git操作 2. 新建git库的存放文件夹并在此初始化git 3. 配置git库所在目录权限 *只需要有一个库和有一个用户&#xff0c;与在windows上建库是一样的。不需要搭建类似gitla…

stable diffusion webui学习总结(2):技巧汇总

一、脸部修复&#xff1a;解决在低分辨率下&#xff0c;脸部生成异常的问题 勾选ADetailer&#xff0c;会在生成图片后&#xff0c;用更高的分辨率&#xff0c;对于脸部重新生成一遍 二、高清放大&#xff1a;低分辨率照片提升到高分辨率&#xff0c;并丰富内容细节 1、先通过…

人力资源智能化管理项目(day10:首页开发以及上线部署)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 首页-基本结构和数字滚动 安装插件 npm i vue-count-to <template><div class"dashboard"><div class"container"><!-- 左侧内…

MyBatis--08--分页插件PageHelper

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.分页插件PageHelper1.1 mysql中 limit 关键字含义1.2 PageHelper 官网https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md](ht…

中国社科院与英国斯特灵大学创新与领导力博士—应该怎样选专业

现如今其实有很多人感觉只是平台成就自己&#xff0c;离开平台自己并无一技之长或过人之处。但是又不想如此安稳过日&#xff0c;一直终老。所以现在大多数人都会去想在职读个博士。 基本上都是在职博士专业为那些希望边工作边获得博士学位的在在职人员开设的&#xff0c;那么&…

uni-app使用uView打开弹出层后输入框聚焦时placeholder错位问题

这里就不放效果了&#xff0c;大概意思就是在使用uView的popus时&#xff0c;在底部弹出后&#xff0c;如果弹窗中的输入框会造成一瞬间的placeholder文字错位&#xff0c;这个问题的主要是因为uView安全区适配导致 uView相关文档 https://www.uviewui.com/components/safeAr…

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI &#xff08;1&#xff09;Options API …

UE蓝图 Set节点和源码

文章目录 Set节点说明相关源码 Set节点说明 UE蓝图中的Set节点是用于对变量进行赋值操作的重要组件。它具有多种功能和作用&#xff0c;具体如下&#xff1a; 变量赋值&#xff1a;Set节点可以用于设置不同类型的变量值&#xff0c;包括整数、浮点数、布尔值、字符串等。在游戏…