OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4039|回复: 0

[XILINX] 《领航者ZYNQ之FPGA开发指南 V2.0》 第九章 按键控制LED实验

[复制链接]

1107

主题

1118

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4615
金钱
4615
注册时间
2019-5-8
在线时间
1218 小时
发表于 2021-11-9 14:49:25 | 显示全部楼层 |阅读模式
1)实验平台:正点原子领航者V2FPGA开发板
2)  章节摘自【正点原子】《领航者ZYNQ之FPGA开发指南 V2.0》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz(V2).html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:712557122 QQ群.png

原子哥.jpg

微信公众号.png



第九章 按键控制LED实验






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

9.1按键简介
按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关:第一种是本实验所使用的轻触式按键开关(如图 7.5.13.1),简称轻触开关。使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键(如图 7.5.13.2),自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来,开发板上的电源键就是这种开关。
第九章 按键控制LED实验415.png
图 7.5.13.1 轻触式按键
第九章 按键控制LED实验477.png
图 7.5.13.2 自锁式按键
9.2实验任务
本节实验任务是使用底板上的PL_KEY0和PL_KEY1按键来控制底板上的PL_LED0和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键0按下,则两个LED交替闪烁;如果按键1按下,则两个LED同时闪烁。
9.3硬件设计
底板上按键的原理图如下图所示:
第九章 按键控制LED实验685.png
图 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实验管脚分配
表1.png
对应的XDC约束语句如下所示:
  1. set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
  2. set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
  3. set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports key[0]]
  4. set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports key[1]]
  5. set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
  6. set_property -dict {PACKAGE_PIN L15 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
复制代码


9.4程序设计
按键控制LED系统框图如下图所示:
第九章 按键控制LED实验1741.png
图 7.5.13.1 按键控制LED系统框图
在图 7.5.13.1中,计数器对50MHz时钟进行计数,从而达到计时的目的。计数器在每次计时到0.5秒的时候,就改变LED的显示状态,然后清零并重新开始计数。
然后根据两个按键(KEY0和KEY1)的状态,在不同的LED状态下,分别设置LED的显示模式(是同时闪烁,或者交替闪烁)。

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


代码的第18行的always块用于产生计数器,计时500ms。代码的第28行的always块功能是每隔500ms就给出led的闪烁状态控制信号。代码第36行的always块使用了一个case语句,来根据当前按键的输入值和led闪烁状态控制信号,来进行两个led的赋值。如果按键1按下,则两个LED交替闪烁;如果按键0按下,则两个LED同时亮灭交替;如果两个按键都未按下,则两个LED都保持点亮。
9.5下载验证
连接开发板的电源和下载器,并打开电源开关。在工程编译之后,将生成的bit文件下载到开发板中。下载完成之后,底板上两个PL LED处于点亮状态。然后按下PL_KEY0,可以看到两个PL LED交替闪烁;按下PL_KEY1,可以看到两个PL的LED同时闪烁。如下图所示:
第九章 按键控制LED实验3849.png
图 7.5.13.1 实验现象
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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