搜索
bottom↓
回复: 0

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

[复制链接]

出0入234汤圆

发表于 2020-9-16 14:57:57 | 显示全部楼层 |阅读模式
1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
4) 正点原子官方B站:https://space.bilibili.com/394620890
5)对正点原子FPGA感兴趣的同学可以加群讨论:876744900 点击加入:
QQ群头像.png                                                                  
6)关注正点原子公众号,获取最新资料


100846rel79a9p4uelap24.jpg

100846f1ce1fg14zbg0va4.png

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


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


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

图 7.1.1 轻触式按键

阿莫论坛发帖领航者专用2469.png

图 7.1.2 自锁式按键

7.2实验任务
本节实验任务是使用底板上的PL_KEY0和PL_KEY1按键来控制底板上的PL_LED0和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键0按下,则两个LED交替闪烁;如果按键1按下,则两个LED同时闪烁。
7.3硬件设计
底板上按键的原理图如下图所示:
阿莫论坛发帖领航者专用2674.png

图 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实验管脚分配
731.png

对应的XDC约束语句如下所示:
  1. set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
  2. set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
  3. set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS33} [get_ports key[0]]
  4. set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports key[1]]
  5. set_property -dict {PACKAGE_PIN J18 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
  6. set_property -dict {PACKAGE_PIN H18 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
复制代码

7.4程序设计
按键控制LED系统框图如下图所示:
阿莫论坛发帖领航者专用21724.png

图 7.4.1 按键控制LED系统框图

在图 7.4.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 @ (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都保持点亮。
7.5下载验证
连接开发板的电源和下载器,并打开电源开关。在工程编译之后,将生成的bit文件下载到开发板中。下载完成之后,底板上两个PL LED处于点亮状态。然后按下PL_KEY0,可以看到两个PL LED交替闪烁;按下PL_KEY1,可以看到两个PL的LED同时闪烁。如下图所示:
阿莫论坛发帖领航者专用23826.png

图 7.5.1 实验现象

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 15:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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