搜索
bottom↓
回复: 1

【正点原子FPGA连载】第七章LED灯闪烁实验

[复制链接]

出0入234汤圆

发表于 2020-11-9 15:14:25 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2021-1-25 18:38 编辑

1)实验平台:正点原子达芬奇FPGA开发板
2)购买链接:https://detail.tmall.com/item.htm?id=624335496505
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_dafenqi.html
4) 正点原子官方B站:https://space.bilibili.com/394620890
5)对正点原子FPGA感兴趣的同学可以加群讨论:905624739  点击加入:
QQ群头像.png

100846rel79a9p4uelap24.jpg

100846f1ce1fg14zbg0va4.png


第七章LED灯闪烁实验



LED灯闪烁作为一个经典的入门实验,其地位堪比编程界的“Hello,World!”。对于很多电子工程师来说,LED灯闪烁都是他们在硬件上观察到的第一个实验现象。本章我们同样通过LED灯闪烁实验,带你进入FPGA的精彩世界。
本章包括以下几个部分:
77.1简介
7.2实验任务
7.3硬件设计
7.4程序设计
7.5下载验证


7.1简介
LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。
不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图 7.1.1是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的一端是阴极。图 7.1.2是开发板上用的贴片二极管实物图。贴片二极管的正面一般都有颜色标记,有标记的那端就是阴极。
新建DOCX 文档447.png

图 7.1.1 发光二极管实物图

新建DOCX 文档509.png

图 7.1.2 贴片发光二极管实物图

发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。
7.2实验任务
本节实验任务是达芬奇开发版上的LED0和LED1以固定的频率交替闪烁。
7.3硬件设计
发光二极管的原理图如图 7.3.1所示, LED0到LED3这4个发光二极管的阴极都连到地( GND)上, 阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。
新建DOCX 文档846.png

图 7.3.1  LED灯硬件原理图

本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表 7.3.1所示:
表 7.3.1 LED灯实验管脚分配
微信图片_20201109151350.png

对应的XDC约束语句如下:
  1. set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
  2. set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
  3. set_property PACKAGE_PIN R2 [get_ports {led[0]}]
  4. set_property PACKAGE_PIN R3 [get_ports {led[1]}]
  5. set_property PACKAGE_PIN R4 [get_ports sys_clk]
  6. set_property PACKAGE_PIN U2 [get_ports sys_rst_n]
  7. set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
  8. set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
复制代码

7.4程序设计
由于发光二极管的阳极与FPGA的管脚相连,只需要改变与LED灯相连的FPGA管脚的电平,LED灯的亮灭状态就会发生变化。当FPGA管脚为高电平时,LED灯点亮;为低电平时,LED灯熄灭。
本次设计的模块端口及信号连接如下图所示:
新建DOCX 文档1740.png

图 7.4.1 LED灯模块原理图

其中,计数器对50MHz时钟进行计数,从而达到计时的目的。计数器在每次计时到1秒之后清零,然后重新开始计数,计数的值用于控制LED的显示状态。当计数器的值小于0.5s时,就把LED0点亮并把LED1熄灭;每当计数器的值大于0.5s时,就把LED0熄灭并把LED1点亮,以此实现两个LED的交替闪烁。
LED闪烁模块的代码如下:
  1. 1   module  led_twinkle(
  2. 2       input          sys_clk  ,  //系统时钟
  3. 3       input          sys_rst_n,  //系统复位,低电平有效
  4. 4   
  5. 5       output  [1:0]  led         //LED灯
  6. 6   );
  7. 7   
  8. 8   //reg define
  9. 9   reg  [25:0]  cnt ;
  10. 10  
  11. 11  //*****************************************************
  12. 12  //**                    main code
  13. 13  //*****************************************************
  14. 14  
  15. 15  //对计数器的值进行判断,以输出LED的状态
  16. 16  assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
  17. 17  
  18. 18  //计数器在0~5000_000之间进行计数
  19. 19  always @ (posedge sys_clk or negedge sys_rst_n) begin
  20. 20      if(!sys_rst_n)
  21. 21          cnt <= 26'd0;
  22. 22      else if(cnt < 26'd5000_0000)
  23. 23          cnt <= cnt + 1'b1;
  24. 24      else
  25. 25          cnt <= 26'd0;
  26. 26  end
  27. 27  
  28. 28  endmodule
复制代码

本程序中输入时钟为50MHz,所以一个时钟周期为20ns(1/50MHz)。因此计数器cnt通过对50MHz系统时钟计数,计时到1s,需要累加1s/20ns=5000_0000次。在代码第23行,每当计时到1s计数器清零一次。
同时,在代码的第16行,对根据计数器的计数值来赋值两个LED的状态。当计数值小于26'd2500_000即计时到1s中的前500ms时,LED0点亮LED1熄灭;当计数值大于等于26'd2500_000,即计时到1s中的后500ms时,LED0熄灭LED1点亮。当计数到1s时,计数器又会回0,重复此过程。以此实现两个LED的交替闪烁。
为了验证我们的程序,我们在Vivado内对代码进行仿真。为了更容易地看到仿真现象,我们将源代码中的计数器的最大计数值修改为5,然后再仿真,如下图所示:
新建DOCX 文档3065.png

图 7.4.2 仅用于仿真的代码

Testbench模块代码如下:
  1. 1   `timescale 1ns / 1ps
  2. 2   
  3. 3   module tb_led_twinkle();
  4. 4   
  5. 5   //输入
  6. 6   reg           sys_clk;
  7. 7   reg           sys_rst_n;
  8. 8   
  9. 9   //输出
  10. 10  wire  [1:0]   led;
  11. 11  
  12. 12  //信号初始化
  13. 13  initial begin
  14. 14      sys_clk = 1'b0;
  15. 15      sys_rst_n = 1'b0;
  16. 16      #200
  17. 17      sys_rst_n = 1'b1;
  18. 18  end
  19. 19  
  20. 20  //生成时钟
  21. 21  always #10 sys_clk = ~sys_clk;
  22. 22  
  23. 23  //例化待测设计
  24. 24  led_twinkle  u_led_twinkle(
  25. 25      .sys_clk         (sys_clk),
  26. 26      .sys_rst_n       (sys_rst_n),
  27. 27      .led             (led)
  28. 28      );
  29. 29  
  30. 30  endmodule
复制代码

仿真得到的波形图如下图所示:
新建DOCX 文档3693.png

图 7.4.3 仿真波形图

从图 7.4.3中可以看到,计数器cnt的值在0到10之间循环计数。当cnt的值小于5时,led0为高电平;大于5时led0为高电平。两个LED的状态随着计数器的计数循环翻转,实现LED闪烁的效果。
7.5下载验证
编译工程并生成比特流.bit文件后,点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”按钮如下图所示。
新建DOCX 文档3963.png

图 7.5.1 Hardware Manager界面

此时将Xilinx下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,开发板连接电源线,如下图所示:
新建DOCX 文档4089.png

图 7.5.2 达芬奇开发板连接实物图

注意!一定要先把下载器的一端连接到了电脑、另一端连接了JTAG接口之后,再给开发板上电!否则,对开发板的JTAG接口进行带电热插拔,有一定概率会损坏JTAG接口!
开发板连接好电源线和下载器后,打开开发板电源开关,点击“Hardware”窗口中的“Auto Connect”图标,如下图所示:
新建DOCX 文档4301.png

图 7.5.3 “Auto Connect”图标

在“Hardware”子窗口中出现如下界面就表示Vivado就已经和下载器连接成功了,如下图所示:
新建DOCX 文档4421.png

图 7.5.4 与下载器连接成功

我们点击上图中的“Program Device”,弹出的界面如下图所示:
新建DOCX 文档4520.png

图 7.5.5 下载比特流界面

此时Bitstream File一栏会自动识别到工程的比特流文件,我们直接点击“Program”按钮下载程序,程序下载完成后,此时我们可以看到位于达芬奇开发板上的两个LED灯在不断地闪烁,如下图所示:
新建DOCX 文档4682.png

图 7.5.6 两个LED灯交替闪烁


出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-19 17:45

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

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