当前位置: 首页 > 编程日记 > 正文

led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

1)实验平台:正点原子开拓者FPGA开发板

2)本实例源码下载:请移步正点原子官网

第八章 按键控制LED灯实验

按键是常用的一种控制器件。生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电、数码产品、玩具等方面有广泛的应用。本章我们将介绍如何使用按键控制多个LED的亮灭。

本章包括以下几个部分:

1

1.1 按键简介

1.2 实验任务

1.3 硬件设计

1.4 程序设计

1.5 下载验证

1.1 按键简介

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

8f4d1cb1e1316dbdd77e574fc764f472.png

图 8.1.1 轻触式按键

24c32d90d8e5be6f21d4c76fd3b36cdd.png

图 8.1.2 自锁式按键

1.2 实验任务

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

1.3 硬件设计

如图 8.3.1所示,本实验使用四个按键开关控制四个LED灯。

babbfac7ee85c44ed6d0a31a0d40d1e1.png

图 8.3.1 按键电路原理图

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

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

表 8.3.1 触摸按键控制LED管脚分配图

信号名

方向

管脚

端口说明

sys_clk

input

E1

系统时钟,50M

sys_rst_n

input

M1

系统复位,低有效

key[0]

input

E16

按键

key[1]

input

E15

按键

key[2]

input

M2

按键

key[3]

input

M16

按键

led[0]

output

D11

LED

led[1]

output

C11

LED

led[2]

output

E10

LED

led[3]

output

F9

LED

1.4 程序设计

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

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

00e494f2264b873651d5901ee9aac956.png

图 8.4.1 系统框图

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

1 modulekey_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 negedgesys_rst_n) begin

14 if(!sys_rst_n)

15 cnt<=24'd 9_999_999;

16 elseif(cnt<24'd 9_999_999)

17 cnt<=cnt+1;

18 else

19 cnt<=0;

20 end

21

22 //用于led灯状态的选择

23 always @(posedge sys_clk ornegedge sys_rst_n) begin

24 if (!sys_rst_n)

25 led_control <= 2'b00;

26 elseif(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 ornegedge sys_rst_n) begin

34 if(!sys_rst_n) begin

35 led<=4'b 0000;

36 end

37 elseif(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 elseif (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 elseif (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 elseif (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时,计数器清零,同时使led_control在四个状态(00,01,10,11)内依次变化。第33至65行利用case语句实现对按键状态的检测,当不同的按键按下时,led随着led_control的变化,被赋予不同的值。

大家可以发现,本次实验和流水灯实验计数时间都是0.2s,本次实验的计数器最大可以计数到9_999_999,而流水灯实验中计数器的值最大可以计数到10_000_000。事实上,这两个实验计数器都是从0开始计数的,本次实验从0计数到9_999_999,需要10_000_000个时钟周期,而系统时钟为20ns,所以计数的时间为0.2s,而流水灯实验从0计数到10_000_000需要10_000_001个时钟周期,因此其计数时间实际上比0.2s要多出20ns。

为了验证我们的程序,我们在modelsim内对代码进行仿真。

Testbench模块代码如下:

1 `timescale1 ns/1 ns

2 moduletb_key_led();

3

4 parameterT = 20;

5

6 reg [3:0] key ;

7 reg sys_clk ;

8 reg sys_rst_n;

9 reg key_value;

10

11 wire [3:0] led;

12

13 initial begin

14 key <=4'b1111;//按键初始状态为全断开

15 sys_clk <=1'b0; //初始时钟为低电平

16 sys_rst_n <=1'b0; //复位信号初始为低电平

17 #T sys_rst_n <=1'b1; //一个时钟周期后复位信号拉高

18

19 #600_000_020key[0] <=0; //0.6s时按下按键1

20 #800_000_000key[0] <=1;

21key[1] <=0; //0.8s后松开按键1,按下按键2

22 #800_000_000key[1] <=1;

23key[2] <=0; //0.8s后松开按键2,按下按键3

24 #800_000_000key[2] <=1;

25key[3] <=0; //0.8s后松开按键3,按下按键4

26 #800_000_000key[3] <=1; //0.8s后松开按键4

27

28 end

29

30 always # (T/2) sys_clk <= ~sys_clk;

31key_led u_key_led(

32 .sys_clk(sys_clk),

33 .sys_rst_n(sys_rst_n),

34 .key(key),

35 .led(led)

36 );

37

38 endmodule

8522440dac2fce06837ab53186bdcf79.png

图 8.4.2 仿真图像

观察代码,结合波形分析可知。14至16行代码为对时钟信号、复位信号、按键信号赋初始值,默认为按键全断开。第0.6s时按下按键key0(kye[0]由高电平变为低电平),可观察到led3至led0依次点亮,呈现自右向左的流水效果;按键key1断开的同时按下按键key2,可观察到led0至led3依次点亮,呈现自左向右的流水效果;按键key2断开的同时按下按键key3s,可观察到led0至led3呈现闪烁效果;按键key3断开的同时按下按键key4,可观察到led0至led3保持全亮。

1.5 下载验证

首先我们打开按键控制LED工程,在工程所在的路径下打开key_led/par文件夹,在里面找到“key_led.qpf”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。key_led工程打开后如图 8.5.1所示。

fd296c7b70f18777cdadcea07d00d9de.png

图 8.5.1 打开工程

工程打开后通过点击工具栏中的“Programmer”图标(图中红框位置)打开下载界面。

下载界面如图 8.5.2所示,查看图中是否已经加载下载文件(sof文件)。如果没有,则需要通过点击“Add File”按钮添加流水灯工程中key_led/par/output_files目录下的“key_led.sof”文件。

745b5dfd2054259e79f420312aad61f8.png

图 8.5.2 下载界面

如下图 8.5.3所示。将下载器一端连接电脑,另一端与开发板上的JTAG下载口相连接,如下图所示。然后连接电源线并打开电源开关。

3ee8c77008849354b5c1da7609957c00.png

图 8.5.3 开发板实物图

开发板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当前的硬件连接为“USB-Blaster”。然后点击“Start”将工程编译完成后得到的sof文件下载到开发板中。

下载完成后,就可以利用按键来控制LED了,如图 8.5.3所示。

相关文章:

svn官方备份hot-backup.py强烈推荐

Author:牛班图 Date:2016/05/18 Address:suzhou --- centos 6.7默认安装的python是2.6.6&#xff0c;大家可以先查看一下自己操作系统的python版本&#xff0c;python -v&#xff1b; hot-backup.py是基于python2写的&#xff0c;python3的语法有些地方不一样&#xff0c;所以在…

用js方法做提交表单的校验

基础知识&#xff1a; 原始提交如下&#xff1a; <form action"<%basePath %>puser/register" method"post"><input placeholder"Name" name"realname"> <input type"email" placeholder"Email…

tree类型题目需要用到的头文件tree.h

下面是树类型题目需要用到的头文件tree.h,请包含在cpp文件中编译,而不是放在c文件中编译,比如查找树中两个节点的最低公共父结点的题common_parent_in_tree.cpp,编译它的方法是: g -g common_parent_in_tree.cpp -o common_parent_in_tree 下面是tree.h的内容: #include <…

用easyui动态创建一个对话框

function randomString(len) { len len || 32; var $chars ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/ var maxPos $chars.length; var pwd ; for (i 0; i < len; i) { pwd $…

网站收录工具(php导航自动收录源码)_网站如何快速收录,网站不收录怎么办?...

经常有朋友说怎么快速收录&#xff0c;网站不收录怎么收录&#xff1f;&#xff1f;其实&#xff0c;网站不包括一般的新网站数量&#xff0c;没有SEO基础&#xff0c;SEO了解合作伙伴经常会遇到问题&#xff0c;甚至很多人会告诉你&#xff0c;不包括网站引流&#xff0c;导致…

JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法

最近在写ajax的时候&#xff0c;调用js方法&#xff0c;遇到了Uncaught SyntaxError:Unexpected identifier异常报错&#xff0c;开始搞不清原因&#xff0c;很苦恼。 以为是js方法参数个数和长度的问题&#xff0c;后来发现原来是这样~ 以下是 浏览器窗口的报错 以及 按钮处…

python 打印皮卡丘_Python到底是什么?学姐靠它拿了5个offer

你ZAO吗&#xff1f;最近陌陌发布了一款很有意思的产品——ZAO&#xff0c;这款AI换脸的产品刷爆朋友圈&#xff01;这款产品火爆到什么程度呢&#xff1f;正在使用ZAO的用户会发现&#xff0c;想要生成一段新的AI换脸视频&#xff0c;已经不是等待几秒、排队第几位的问题&…

有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!

对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结点的值都大,那么最低的公共祖先一定在当前结点的左子树中,下一步遍历当前…

数据库SQL优化大总结之百万级数据库优化方案

1.对查询进行优化&#xff0c;要尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t w…

js定时执行函数

方法一: //直接现定义函数 var time window.setInterval(function(){ $(’.lingdao_right’).click(); },5000); 方法二: //执行已经有的函数 var time window.setInterval(‘abc()’,5000); 清除js自动执行 clearInterval(time); //time就是定义时的名称&#xff0c;如上

BST(binary search tree)类型题目需要用到的头文件binary_tree.h

下面是二叉搜索树需要用到的头文件binary_tree.h #include <stdio.h>struct BinaryTreeNode{int value;BinaryTreeNode* pLeft;BinaryTreeNode* pRight; };BinaryTreeNode* CreateBinaryTreeNode(int value){BinaryTreeNode* pNode new BinaryTreeNode();pNode->valu…

终止js程序执行的方法

js终止程序执行的方法共有三种 (一)在function里面&#xff08;普通js方法&#xff09; &#xff08;1&#xff09;return; &#xff08;2&#xff09;return false; (二)非function方法里面&#xff08;如ajax方法&#xff09; alert(“发生异常”); throw SyntaxError(); ale…

将BST转换为有序的双向链表!

在二叉树中,每个结点都有两个指向子结点的指针. 在双向链表中, 每个结点也有两个指针,它们分别指向前一个结点和后一个结点.由于这两种结构的相似性, 同时二叉搜索树也是一种排过序的数据结构, 因此在理论上有可能实现二叉搜索树和排序的双向链表之间的转换. 下面的文件BST_to_…

计算机病毒实践汇总五:搭建虚拟网络环境

在尝试学习分析的过程中&#xff0c;判断结论不一定准确&#xff0c;只是一些我自己的思考和探索。敬请批评指正&#xff01; 涉及内容&#xff1a; INetSim安装及使用 ApateDNS安装及使用 1. 搭建病毒分析网络环境原因 使用虚拟机作为沙箱能把病毒与外界完全隔离开&#xff0c…

form表单提交前进行ajax或js验证,校验不通过不提交

在使用form表单进行提交数据前&#xff0c;需要进行数据的校验->表单的校验&#xff08;如&#xff1a;两次密码输入是否相同&#xff09;后台数据的校验&#xff08;如&#xff1a;账号是否存在&#xff09;&#xff0c;这个时候&#xff0c;如果哪步校验不通过&#xff0c…

中体骏彩C++面试题

下面是我凭记忆想到的几个题目,有需要的同学就拿去吧,我也算做了点善事. 中体骏彩C笔试题 2013-11-18 1.指针的含义是:B A.名字 B.地址 C.名称 D.符号 2.给出下面的程序输出: #include <iostream> #include <cstdlib> #include <cstring> #include <l…

Fibonacci数列的java实现

关于Fibonacci应该都比较熟悉&#xff0c;0,1,1,2,3.。。。。 基本公式为f(n) f(n-1) f(n-2); f(0) 0; f(1) 1; 方法1&#xff1a;可以运用迭代的方法实现&#xff1a; public static int f1(int n){if(n<1)return n;return f1(n-1) f1(n-2); }实现方法简单。 方法2&am…

stream流对象的理解及使用

我的理解&#xff1a;用stream流式处理数据&#xff0c;将数据用一个一个方法去 . &#xff08;点&#xff0c;即调用&#xff09; 得到新的数据结果&#xff0c;可以一步达成。 有多种方式生成 Stream Source&#xff1a; 从 Collection 和数组 Collection.stream()Collecti…

永成科技C++笔试题

最后几个题有点难度,在这里说一下: 永成科技C笔试题 2013-11-19 1.将1亿以内的质数存到一个超级大的数组中,用算法如何实现? 使用"筛法"求解1亿以内的质数的程序的思路: 先动态分配1亿个bit(总计12500000字节),用字节中的每一位代表每一个整数,首先将代表奇数的那…

事务库事务隔离级别

为了快速同步数据的需要&#xff0c;我分段执行了两次python脚本&#xff0c;即开启了两个进程同步数据&#xff0c;结果服务器不时报出数据库死锁异常&#xff0c;通过排查代码和数据库日志发现&#xff0c;是由长事务并发引起的。代码中有入账和出账两个方法&#xff0c;里面…

十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

十大算法 1.冒泡排序 ​ &#xff08;1&#xff09;算法描述 ​ 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是…

webkit入门准备

《webkit入门准备》1. Ca) Webkit代码风格b) Inlinec) Constd) 构造与析构e) 重载f) 继承2. 泛式编程a) Vector/List/HashTableb) Iteratorc) 智能指针3. 面向对象编程a) 对象概念b) …

oracle操作

一、导入dmp文件&#xff1a; 1.创建表空间create tablespace 表空间 datafile 路径\文件名.dbf size 1500M autoextend on next 5M maxsize 3000M;注&#xff1a;路径必须为已创建2.创建用户create user 用户名 identified by 密码 default tablespace 表空间;3.更改用户的表空…

一个form表单,多个提交按钮(实现不同功能和地址的提交)

直接上代码 表单部分&#xff1a; <form action"" name"find" method"post" enctype"multipart/form-data"><input type"text" name"name"/><br/><button οnclick"f1()"/>找…

chrome 硬件渲染(GPU Accelerated Compositing in Chrome)

原文链接 http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome chrome 中集成了webkit,这篇文章对webkit 硬件渲染过程有详细的介绍&#xff0c;很好。 简介 这篇文档讲解chrome硬件加速合成的实现细节和背景。 介绍 通常来讲&#…

CCS Font 知识整理总结

总是搞不懂 CCS 中如何正确的使用字体&#xff0c;这下明白了。 1、什么是 font-face font-face 顾名思义&#xff0c;就是文字的脸。字体是文字的外在形式&#xff0c;就是文字的风格&#xff0c;是文字的外衣。比如行书、楷书、草书&#xff0c;都是一种字体。同样一个字每个…

Maven安装与配置(最实用!!!)eclipse中配置maven

Maven安装与配置 一、需要准备的东西 JDKEclipse&#xff08;本章主要是在eclipse中进行配置maven&#xff09;Maven程序包 二、下载与安装 1. 前往maven下载最新版的Maven程序&#xff1a; 2. 将文件解压到D:\Program Files\Apache\maven目录下&#xff08;这样子放目录结…

在Ubuntu 12.04 64bit上配置,安装和运行go程序

注意:下面的安装配置均遵从官网或是教材《Go语言程序设计》中的部分内容. 顺便说下&#xff0c;这是一本很难得的Go语言的入门教程&#xff0c;非常基础和全面。起初我因为这本书的封面比较讨厌它&#xff0c;闲置几年之后&#xff0c;一次偶尔要用时静心翻阅之后&#xff0c;发…

Linux下三个密码生成工具

http://code.csdn.net/news/2820879 想出一个难破解且容易记的密码对不是一件简单的事情。在我为电脑设定一个新密码&#xff0c;或者在线注册了一个新的账号&#xff0c;需要输入密码的时候&#xff0c;脑袋就一片空白。不过&#xff0c;Linux下有几个密码生成工具可以使用&am…

javabean实体类与实体类之间的快速转换

一、Dozer是什么&#xff1f; dozer是一个能把实体和实体之间进行转换的工具.只要建立好映射关系.就像是ORM的数据库和实体映射一样. 使用方法示例如下: // article(PO) -> articleVOArticleVO articleVO dozerMapper.map(article, ArticleVO.class);这段示例代码。将从数…