发 帖  
原厂入驻New
[资料]

【正点原子FPGA连载】第七章按键控制LED闪烁实验-领航者ZYNQ之FPGA开发指南

2020-9-21 16:57:52  87 正点原子FPGA
分享
1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/FPGA/zdyz_linhanz.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:876744900
5)关注正点原子公众号,获取最新资料


第七章按键控制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 ,
  • 4
  • 5 input [1:0] key ,
  • 6 output reg [1:0] led
  • 7 );
  • 8
  • 9 //reg define
  • 10 reg [24:0] cnt;
  • 11 reg led_ctrl;
  • 12
  • 13 //*****************************************************
  • 14 //** main code
  • 15 //*****************************************************
  • 16
  • 17 //计数器
  • 18 always @ (posedge sys_clk or negedge sys_rst_n) begin
  • 19 if(!sys_rst_n)
  • 20 cnt <= 25'd0;
  • 21 else if(cnt < 25'd2500_0000) //计数500ms
  • 22 cnt <= cnt + 1'b1;
  • 23 else
  • 24 cnt <= 25'd0;
  • 25 end
  • 26
  • 27 //每隔500ms就更改LED的闪烁状态
  • 28 always @ (posedge sys_clk or negedge sys_rst_n) begin
  • 29 if(!sys_rst_n)
  • 30 led_ctrl <= 1'b0;
  • 31 else if(cnt == 25'd2500_0000)
  • 32 led_ctrl <= ~led_ctrl;
  • 33 end
  • 34
  • 35 //根据按键的状态以及LED的闪烁状态来赋值LED
  • 36 always @ (posedge sys_clk or negedge sys_rst_n) begin
  • 37 if(!sys_rst_n)
  • 38 led <= 2'b11;
  • 39 else case(key)
  • 40 2'b10 : //如果按键0按下,则两个LED交替闪烁
  • 41 if(led_ctrl == 1'b0)
  • 42 led <= 2'b01;
  • 43 else
  • 44 led <= 2'b10;
  • 45 2'b01 : //如果按键1按下,则两个LED同时闪烁
  • 46 if(led_ctrl == 1'b0)
  • 47 led <= 2'b11;
  • 48 else
  • 49 led <= 2'b00;
  • 50 2'b11 : //如果两个按键都未按下,则两个LED都保持点亮
  • 51 led <= 2'b11;
  • 52 default: ;
  • 53 endcase
  • 54 end
  • 55
  • 56 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 实验现象


0
分享淘帖 显示全部楼层

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表