当前位置:首页 > 新闻资讯 > FPGA之家动态 >

「正点原子FPGA连载」第七章按键控制LED闪烁实验

时间:2024-07-29      来源:网络搜集 关于我们 0

1)摘自【正点原子】领航者 ZYNQ 之FPGA开发指南

2)实验平台:正点原子领航者ZYNQ开发板

3)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761

4)全套实验源码+手册+视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html

5)对正点原子FPGA感兴趣的同学可以加群讨论:876744900

6)正点原子资料更新和新品发布,请加正点原子公众号:正点原子

关注方法:微信→添加好友→公众号→输入:正点原子

第七章按键控制LED闪烁实验

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

本章包括以下几个部分:

77.1按键简介

7.2实验任务

7.3硬件设计

7.4程序设计

7.5下载验证

7.1按键简介

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

图 7.1.1 轻触式按键

图 7.1.2 自锁式按键

7.2实验任务

本节实验任务是使用底板上的PL_KEY0和PL_KEY1按键来控制底板上的PL_LED0和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键0按下,则两个LED交替闪烁;如果按键1按下,则两个LED同时闪烁。

7.3硬件设计

底板上按键的原理图如下图所示:

图 7.3.1 按键电路原理图

在图 7.3.1中,PL_KEY0和PL_KEY1连接到ZYNQ的PL端,PS_KEY0和PS_KEY1连接到ZYNQ的PS端。在《领航者ZYNQ之FPGA开发指南》中,我们只使用PL端的外设。

PL端的按键没有按下时,对应的IO端口为高电平;当按键按下时,对应的IO端口变为低电平。

本实验的管脚分配如下表所示:

表 7.3.1 按键控制LED实验管脚分配

对应的XDC约束语句如下所示:

set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS33} [get_ports key[0]]set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports key[1]]set_property -dict {PACKAGE_PIN J18 IOSTANDARD LVCMOS33} [get_ports {led[0]}]set_property -dict {PACKAGE_PIN H18 IOSTANDARD LVCMOS33} [get_ports {led[1]}]

复制代码

7.4程序设计

按键控制LED系统框图如下图所示:

图 7.4.1 按键控制LED系统框图

在图 7.4.1中,计数器对50MHz时钟进行计数,从而达到计时的目的。计数器在每次计时到0.5秒的时候,就改变LED的显示状态,然后清零并重新开始计数。

然后根据两个按键(KEY0和KEY1)的状态,在不同的LED状态下,分别设置LED的显示模式(是同时闪烁,或者交替闪烁)。

顶层模块代码如下:1 module key_led(2 input sys_clk ,3 input sys_rst_n ,45 input [1:0] key ,6 output reg [1:0] led7 );89 //reg define10 reg [24:0] cnt;11 reg led_ctrl;1213 //*****************************************************14 //** main code15 //*****************************************************1617 //计数器18 always @ (posedge sys_clk or negedge sys_rst_n) begin19 if(!sys_rst_n)20 cnt <= 25d0;21 else if(cnt < 25d2500_0000) //计数500ms22 cnt <= cnt + 1b1;23 else24 cnt <= 25d0;25 end2627 //每隔500ms就更改LED的闪烁状态28 always @ (posedge sys_clk or negedge sys_rst_n) begin29 if(!sys_rst_n)30 led_ctrl <= 1b0;31 else if(cnt == 25d2500_0000)32 led_ctrl <= ~led_ctrl;33 end3435 //根据按键的状态以及LED的闪烁状态来赋值LED36 always @ (posedge sys_clk or negedge sys_rst_n) begin37 if(!sys_rst_n)38 led <= 2b11;39 else case(key)40 2b10 : //如果按键0按下,则两个LED交替闪烁41 if(led_ctrl == 1b0)42 led <= 2b01;43 else44 led <= 2b10;45 2b01 : //如果按键1按下,则两个LED同时闪烁46 if(led_ctrl == 1b0)47 led <= 2b11;48 else49 led <= 2b00;50 2b11 : //如果两个按键都未按下,则两个LED都保持点亮51 led <= 2b11;52 default: ;53 endcase54 end5556 endmodule

代码的第18行的always块用于产生计数器,计时500ms。代码的第28行的always块功能是每隔500ms就给出led的闪烁状态控制信号。代码第36行的always块使用了一个case语句,来根据当前按键的输入值和led闪烁状态控制信号,来进行两个led的赋值。如果按键1按下,则两个LED交替闪烁;如果按键0按下,则两个LED同时亮灭交替;如果两个按键都未按下,则两个LED都保持点亮。

7.5下载验证

连接开发板的电源和下载器,并打开电源开关。在工程编译之后,将生成的bit文件下载到开发板中。下载完成之后,底板上两个PL LED处于点亮状态。然后按下PL_KEY0,可以看到两个PL LED交替闪烁;按下PL_KEY1,可以看到两个PL的LED同时闪烁。如下图所示:

图 7.5.1 实验现象


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言