正点原子 发表于 2021-11-6 16:10:00

《领航者ZYNQ之FPGA开发指南_V2》第九章 按键控制LED实验

1)实验平台:正点原子领航者V2 ZYNQ开发板
2)章节摘自【正点原子】《领航者ZYNQ之FPGA开发指南_V2 》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-329957-1-1.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:905624739







第九章 按键控制LED实验
       按键是常用的一种控制器件。生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电、数码产品、玩具等方面有广泛的应用。本章我们将介绍如何使用按键来控制LED闪烁的方式。
       本章包括以下几个部分:
       1.1按键简介
       1.2实验任务
       1.3硬件设计
       1.4程序设计
       1.5下载验证

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

图 7.5.13.1 轻触式按键

图 7.5.13.2 自锁式按键
1.2实验任务
       本节实验任务是使用底板上的PL_KEY0和PL_KEY1按键来控制底板上的PL_LED0和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键0按下,则两个LED交替闪烁;如果按键1按下,则两个LED同时闪烁。
1.3硬件设计
       底板上按键的原理图如下图所示:

图 7.5.13.1 按键电路原理图
       在图 7.5.13.1中,PL_KEY0和PL_KEY1连接到ZYNQ的PL端,PS_KEY0和PS_KEY1连接到ZYNQ的PS端。在《领航者ZYNQ之FPGA开发指南》中,我们只使用PL端的外设。
       PL端的按键没有按下时,对应的IO端口为高电平;当按键按下时,对应的IO端口变为低电平。
      本实验的管脚分配如下表所示:
表 9.3.1 按键控制LED实验管脚分配

对应的XDC约束语句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33}
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33}
set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} ]
set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} ]
set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} }]
set_property -dict {PACKAGE_PIN L15 IOSTANDARD LVCMOS33} }]
1.4程序设计
       按键控制LED系统框图如下图所示:

图 7.5.13.1 按键控制LED系统框图
       在图 7.5.13.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      key ,
6       outputregled
7   );
8   
9   //reg define
10reg cnt;
11reg      led_ctrl;
12
13//*****************************************************
14//**                  main code
15//*****************************************************
16
17//计数器
18always @ (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;
25end
26
27//每隔500ms就更改LED的闪烁状态
28always @ (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;
33end
34
35//根据按键的状态以及LED的闪烁状态来赋值LED
36always @ (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
54end
55
56endmodule
       代码的第18行的always块用于产生计数器,计时500ms。代码的第28行的always块功能是每隔500ms就给出led的闪烁状态控制信号。代码第36行的always块使用了一个case语句,来根据当前按键的输入值和led闪烁状态控制信号,来进行两个led的赋值。如果按键1按下,则两个LED交替闪烁;如果按键0按下,则两个LED同时亮灭交替;如果两个按键都未按下,则两个LED都保持点亮。
1.5下载验证
       连接开发板的电源和下载器,并打开电源开关。在工程编译之后,将生成的bit文件下载到开发板中。下载完成之后,底板上两个PL LED处于点亮状态。然后按下PL_KEY0,可以看到两个PL LED交替闪烁;按下PL_KEY1,可以看到两个PL的LED同时闪烁。如下图所示:

图 7.5.13.1 实验现象


页: [1]
查看完整版本: 《领航者ZYNQ之FPGA开发指南_V2》第九章 按键控制LED实验