verilog学习笔记- 10)按键控制 LED 灯实验

news2025/1/19 17:19:50

目录

简介:

实验任务:

硬件设计:

程序设计:

下载验证 :

总结与反思:


简介:

按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关:第一种是本实验所使用的轻触式按键开关,使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的

第二种是自锁按键,自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来,开发板上的电源键就是这种开关


实验任务:

使用新起点开发板上的四个按键控制四个 LED 灯。不同按键按下时,四个 LED 灯显示不同效果。


硬件设计:

如上图所示,开发板上的 5 个按键未按下时,输出高电平,按下后,输出低电平。

本实验中,系统时钟、复位按键、按键和 LED 灯的管脚如下表所示。

对应的 TCL 约束文件如下:

set_location_assignment PIN_M2 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_E16 -to key[0]
set_location_assignment PIN_E15 -to key[1]
set_location_assignment PIN_M15 -to key[2]
set_location_assignment PIN_M16 -to key[3]
set_location_assignment PIN_D11 -to led[0]
set_location_assignment PIN_C11 -to led[1]
set_location_assignment PIN_E10 -to led[2]
set_location_assignment PIN_F9 -to led[3]

程序设计:

我们程序设计最终实现的效果为:无按键按下时,LED 灯全灭;按键 1 按下时,LED 灯显示自右向左的流水效果;按键 2 按下时,LED 灯显示自左向右的流水效果;按键 3 按下时,四个 LED 灯同时闪烁;按键 4 按下时,LED 灯全亮。

LED 在流水效果和闪烁效果在时间间隔均为 0.2 秒,因此需要在程序中定义一个 0.2s 的计数器,即每隔 0.2s,状态计数器加一。根据当前按键的状态选择不同的显示模式,不同的显示模式下四个 led 灯的亮灭随状态计数器的值改变,从而呈现出不同的显示效果。

 按键控制 led 模块的代码如下所示:

1 module key_led(
2 input sys_clk , //50Mhz 系统时钟
3 input sys_rst_n, //系统复位,低有效
4 input [3:0] key, //按键输入信号
5 output reg [3:0] led //LED 输出信号
6 );
7 
8 //reg define 
9 reg [23:0] cnt;
10 reg [1:0] led_control;
11 
12 //用于计数 0.2s 的计数器
13 always @ (posedge sys_clk or negedge sys_rst_n) begin
14 if(!sys_rst_n)
15 cnt<=24'd9_999_999;
16 else if(cnt<24'd9_999_999)
17 cnt<=cnt+1;
18 else
19 cnt<=0;
20 end
21 
22 //用于 led 灯状态的选择
23 always @(posedge sys_clk or negedge sys_rst_n) begin
24 if (!sys_rst_n)
25 led_control <= 2'b00;
26 else if(cnt == 24'd9_999_999)
27 led_control <= led_control + 1'b1;
28 else
29 led_control <= led_control;
30 end
31 
32 //识别按键,切换显示模式
33 always @(posedge sys_clk or negedge sys_rst_n) begin
34 if(!sys_rst_n) begin
35 led<=4'b 0000;
36 end
37 else if(key[0]== 0) //按键 1 按下时,从右向左的流水灯效果
38 case (led_control)
39 2'b00 : led<=4'b1000;
40 2'b01 : led<=4'b0100;
41 2'b10 : led<=4'b0010;
42 2'b11 : led<=4'b0001;
43 default : led<=4'b0000;
44 endcase
45 else if (key[1]==0) //按键 2 按下时,从左向右的流水灯效果
46 case (led_control)
47 2'b00 : led<=4'b0001;
48 2'b01 : led<=4'b0010;
49 2'b10 : led<=4'b0100;
50 2'b11 : led<=4'b1000;
51 default : led<=4'b0000;
52 endcase
53 else if (key[2]==0) //按键 3 按下时,LED 闪烁
54 case (led_control)
55 2'b00 : led<=4'b1111;
56 2'b01 : led<=4'b0000;
57 2'b10 : led<=4'b1111;
58 2'b11 : led<=4'b0000;
59 default : led<=4'b0000;
60 endcase
61 else if (key[3]==0) //按键 4 按下时,LED 全亮
62 led=4'b1111;
63 else
64 led<=4'b0000; //无按键按下时,LED 熄灭 
65 end
66 
67 endmodule

该代码分为三个模块:

第 12 至 20 行对系统时钟计数,当计数时间达 0.2s 时,计数器清零,是一个产生0.2s模块

第 22 至 30 行对LED灯的状态四个状态(00,01,10,11)内依次变化

第 32 至 64 行对每种情况下LED的闪烁模式进行了四种不同的定义,并且按下按键切换模式

Testbench 模块代码如下:

1 `timescale 1 ns/ 1 ns
2 module tb_key_led();
3 
4 parameter T = 20;
5 
6 reg [3:0] key ;
7 reg sys_clk ;
8 reg sys_rst_n;
9 
10 wire [3:0] led;
11 
12 initial begin 
13 key <=4'b1111;//按键初始状态为全断开
14 sys_clk <=1'b0; //初始时钟为低电平
15 sys_rst_n <=1'b0; //复位信号初始为低电平
16 #T sys_rst_n <=1'b1; //一个时钟周期后复位信号拉高
17 
18 #600_000_020 key[0] <=0; //0.6s 时按下按键 1
19 #800_000_000 key[0] <=1; 
20 key[1] <=0; //0.8s 后松开按键 1,按下按键 2
21 #800_000_000 key[1] <=1; 
22 key[2] <=0; //0.8s 后松开按键 2,按下按键 3
23 #800_000_000 key[2] <=1; 
24 key[3] <=0; //0.8s 后松开按键 3,按下按键 4 
25 #800_000_000 key[3] <=1; //0.8s 后松开按键 4
26 
27 end
28 
29 always # (T/2) sys_clk <= ~sys_clk;
30 key_led u_key_led(
31 .sys_clk(sys_clk), 
32 .sys_rst_n(sys_rst_n), 
33 .key(key), 
34 .led(led) 
35 );
36 
37 endmodule


下载验证 :

 功能正常

总结与反思:

本次LED实验学到了KEY按键的使用,本次实验的缺点在于需要一直按下按键才能有正常的功能,应该设置一个标志位进行状态的切换比较好

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

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

相关文章

NeRF制作数据集最后的踩坑

之前对数据集渲染的时候一直出现模糊的问题&#xff1a; 学长说可能是摄像机和poses没有对应。但是为什么会这样呢 后来我发现&#xff0c;确实在制作的过程中&#xff0c;某一步出了问题&#xff0c;导致下标的数字&#xff0c;跟理想的不一样&#xff1a; 原来的12&#xf…

基于yolov5-v7.0开发构建工业机械齿轮瑕疵实例分割检测识别分析系统

在之前的文章中我们已经做了很多基于yolov5完成实例分割的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《基于YOLOv5-v7.0的药片污染、缺损裂痕实例分割检测识别分析系统》《基于yolov5-v7.0开发构建裸土实例分割检测识别模型》《基于yolov5-v7.0开发实践实例分割模…

深度学习PyTorch 之 DNN-回归(多变量)

深度学习&PyTorch 之 DNN-回归中使用HR数据集进行了实现&#xff0c;但是HR数据集中只有一个变量&#xff0c;这里我们使用多变量在进行模拟一下 流程还是跟前面一样 #mermaid-svg-LN8ayy7UjtqZ6dSj {font-family:"trebuchet ms",verdana,arial,sans-serif;font…

计算机原理三_进程管理

目录儿四、进程管理4.1 什么是进程4.1.1 进程的结构4.1.2 进程的特征4.1.3 进程与线程4.1.4 线程的实现方式用户级线程内核支持线程组合线程的调度4.2 进程是怎么运行的4.2.1 进程状态4.2.2 进程控制4.2.2.1 原语的概念4.2.2.2 挂起与激活4.2.3 进程调度4.2.3.1 调度层次4.2.3.…

CSS入门一、初识

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

【BP靶场portswigger-服务端9】服务端请求伪造SSRF漏洞-7个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

Episode 02 对称密码基础

一、从文字密码到比特序列密码 1、使用对称密钥进行加密 为了使原来的明文无法被推测出来&#xff0c;就要尽可能地打乱密文&#xff0c;这样才能达到加密的目的。密文打乱的是比特序列&#xff0c;无论是文本&#xff0c;图片还是音乐&#xff0c;只要能够将数据转换比特序列…

MSF后渗透持续后门

持续后门 ○ 利用漏洞取得的meterpreter shell运行于内存中&#xff0c;重启失效 ○ 重复exploit漏洞可能造成服务崩溃 ○ 持久后门保证漏洞修复后仍可远程控制 Meterpreter后门 run metsvc -A #删除-r use exploit/multi/handler set PAYLOAD windows/metsvc_bind_tcp se…

[22]. 括号生成

[22]. 括号生成题目算法设计&#xff1a;回溯算法设计&#xff1a;空间换时间题目 传送门&#xff1a;https://leetcode.cn/problems/generate-parentheses/ 算法设计&#xff1a;回溯 括号问题可以分成俩类&#xff1a; 括号的合法性判断&#xff0c;主要是用栈括号的合法生…

【自然语言处理】Word2Vec 词向量模型详解 + Python代码实战

文章目录一、词向量引入二、词向量模型三、训练数据构建四、不同模型对比4.1 CBOW4.2 Skip-gram 模型4.3 CBOW 和 Skip-gram 对比五、词向量训练过程5.1 初始化词向量矩阵5.2 训练模型六、Python 代码实战6.1 Model6.2 DataSet6.3 Main6.4 运行输出一、词向量引入 先来考虑一个…

IDEA远程快速部署SpringBoot项目到Docker环境

1.LInux上先安装docker环境 https://blog.csdn.net/YXWik/article/details/128643662 2.配置Docker远程连接端口 1. vim /usr/lib/systemd/system/docker.service 2. 找到ExecStar 在后面添加 -H tcp://0.0.0.0:2375 3. 退出编辑界面&#xff1a;先按esc&#xff0c;然后"…

【JAVA程序设计】(C00100)基于Springboot+html的前后端分离停车场管理系统

基于Springboothtml的前后端分离停车场管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于SpringBoothtml的前后端分离的停车场管理系统&#xff0c;本系统分为二种角色&#xff1a;管理员和收银员。 1&#xff0e;登录&#xff1a;管理员可以通过系统分配的账号…

Android 系统框架结构

目录 1.应用层(System Apps)&#xff1a; 2.应用框架层(Java API Framework)&#xff1a; 3.系统运行库层(Native)&#xff1a; 4.硬件抽象层(HAL)&#xff1a; 5.Linux内核层&#xff08;Linux Kernel&#xff09;&#xff1a; 大部分开发的同学是不太清楚Android的系统的…

解决企业微信启动报错:0x0000142无法打开

解决企业微信启动报错&#xff1a;0x0000142无法打开1.问题描述2.问题查找3.问题解决4.事后感悟系统&#xff1a;Win10 WXWork&#xff1a;4.0.20.6020 1.问题描述 不知道从啥时候开始&#xff0c;打开企业微信会报错&#xff08;见下图&#xff09;&#xff0c;报错代码是&am…

【Redis】缓存穿透问题及其解决方案

【Redis】缓存穿透问题及其解决方案 文章目录【Redis】缓存穿透问题及其解决方案1. 缓存穿透概念及原因2. 解决方案2.1 缓存空对象2.1.1 缓存空对象的优缺点2.1.2 改进代码2.2 布隆过滤2.2.1 布隆过滤的优缺点1. 缓存穿透概念及原因 缓存穿透&#xff1a;客户端请求的数据在 缓…

HTML与CSS基础(十)—— 综合项目

应用前面技术知识 完成小兔鲜儿项目设计图素材下载&#xff1a;链接: https://pan.baidu.com/s/1o5mWkgEfaTAA5spxMLuXEQ?pwdex7e 提取码: ex7e 一、Header 部分开发 布局分析&#xff1a;header布局分析&#xff1a;xtx-shortcut ①布局分析&#xff1a;xtx-shortcut ②布局分…

Hudi系列3:Hudi核心概念

文章目录Hudi架构一. 时间轴(TimeLine)1.1 时间轴(TimeLine)概念1.2 Hudi的时间线由组成1.3 时间线上的Instant action操作类型1.4 时间线上State状态类型1.5 时间线官网实例二. 文件布局三. 索引3.1 简介3.2 对比Hive没有索引的区别3.3 Hudi索引类型3.4 全局索引与非全局索引四…

数学建模-回归分析(Stata)

注意&#xff1a;代码文件仅供参考&#xff0c;一定不要直接用于自己的数模论文中国赛对于论文的查重要求非常严格&#xff0c;代码雷同也算作抄袭 如何修改代码避免查重的方法&#xff1a;https://www.bilibili.com/video/av59423231 //清风数学建模 一、基础知识 1.简介 …

不得不面对的随机MAC问题

一、现状 为了完善安全机制、保护用户隐私&#xff0c;各个设备厂商开发了 MAC 地址随机功能&#xff0c;防止用户信息泄露。随机 MAC 地址&#xff0c;就是一个随机生成的伪 MAC 地址&#xff0c;一个假 MAC 地址&#xff0c;使用随机 MAC 地址进行网络通信&#xff0c;而不是…

全网圣诞树最全完整源码下载合集【可下载】

文章目录一、全部源码打包下载&#xff1a;二、效果预览001-html版本 豪华动态圣诞树 抖音同款002-圣诞树灯光跟随音乐节拍一起呼吸点亮下雪动画效果代码003-圣诞树彩带飘动节日快乐效果代码004-圣诞树带音乐旋转拉伸动画效果005-python版本python取消延迟秒出图版 【全网最强无…