OpenEdv-开源电子网

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

[XILINX] 【正点原子FPGA连载】第六章 LED灯闪烁实验--摘自【正点原子】领航者ZYNQ之FPGA开发指南_V1.2

[复制链接]

1424

主题

1440

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
6075
金钱
6075
注册时间
2019-5-8
在线时间
1740 小时
跳转到指定楼层
楼主
发表于 2020-6-3 11:20:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 正点原子01 于 2020-6-9 10:50 编辑

1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html
4)本章实例源码下载: LED灯闪烁实验.zip (843.66 KB, 下载次数: 12)
5)对正点原子FPGA感兴趣的同学可以加群讨论:712557122
6)关注正点原子公众号,获取最新资料更新




第六章LED灯闪烁实验

    LED灯闪烁作为一个经典的入门实验,其地位堪比编程界的“Hello,World!”。对于很多电子工程师来说,LED灯闪烁都是他们在硬件上观察到的第一个实验现象。本章我们同样通过LED灯闪烁实验,带你进入ZYNQ的精彩世界。
本章包括以下几个部分:
1.1    LED灯简介
1.2    实验任务
1.3    硬件设计
1.4    程序设计
1.5    下载验证
1.1 LED灯简介
    LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。
    不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图6.1.1是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的一端是阴极。图6.1.2是开发板上用的贴片二极管实物图。贴片二极管的正面一般都有颜色标记,有标记的那端就是阴极。
图6.1.1发光二极管实物图
图6.1.2贴片发光二极管实物图
    发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。
1.2 实验任务
    本节实验任务是使领航者底板上的PLLED0和PL LED1以固定的频率交替闪烁。
1.3 硬件设计
    底板上LED的原理图如下图所示:
图6.3.1 LED灯硬件原理图
    在图6.3.1中,PL_LED0和PL_LED1连接到ZYNQ的PL端,PS_LED0和PS_LED1连接到ZYNQ的PS端。在《领航者ZYNQ之FPGA开发指南》中,我们只使用PL端的外设。
    PL_LED0和PL_LED1的阴极通过 470 欧姆的电阻连到地(GND)上,阳极由ZYNQ PL的IO管脚控制,LED与地之间的电阻起到限流作用。
    本实验中,系统时钟、按键复位以及两个LED端口的管脚分配如下表所示,其中复位按键和两个LED位于底板上,时钟位于核心板上:
表6.3.1 LED闪烁实验管脚分配
对应的XDC约束语句如下所示:
  1. set_property -dict {PACKAGE_PIN U18 IOSTANDARDLVCMOS33} [get_ports sys_clk]
  2. set_property -dict {PACKAGE_PIN J15 IOSTANDARDLVCMOS33} [get_ports sys_rst_n]
  3. set_property -dict {PACKAGE_PIN J18 IOSTANDARDLVCMOS33} [get_ports {led[0]}]
  4. set_property -dict {PACKAGE_PIN H18 IOSTANDARDLVCMOS33} [get_ports {led[1]}]
复制代码
1.4 程序设计
    由于发光二极管的阳极与ZYNQ的管脚相连,只需要改变与LED灯相连的ZYNQ管脚的电平,LED灯的亮灭状态就会发生变化。当ZYNQ管脚为高电平时,LED灯点亮;为低电平时,LED灯熄灭。
    本次设计的模块端口及信号连接如下图所示:
图6.4.1LED灯模块原理图
    其中,计数器对50MHz时钟进行计数,从而达到计时的目的。计数器在每次计时到1秒之后清零,然后重新开始计数,计数的值用于控制LED的显示状态。当计数器的值小于0.5s时,就把LED0点亮并把LED1熄灭;每当计数器的值大于0.5s时,就把LED0熄灭并把LED1点亮,以此实现两个LED的交替闪烁。
LED闪烁模块的代码如下:
  1. module  led_twinkle(
  2. input          sys_clk  ,//系统时钟
  3. input          sys_rst_n,//系统复位,低电平有效

  4. output[1:0  led         //LED灯
  5. );

  6. //reg define
  7. reg[25:0  cnt ;

  8. //*****************************************************
  9. //**                   main code
  10. //*****************************************************

  11. //对计数器的值进行判断,以输出LED的状态
  12. assign led =(cnt <26'd2500_0000)?2'b01:2'b10;

  13. //计数器在0~5000_000之间进行计数
  14. always@(posedge sys_clk ornegedge sys_rst_n)begin
  15. if(!sys_rst_n)
  16.           cnt <=26'd0;
  17. elseif(cnt <26'd5000_0000)
  18.           cnt <=cnt +1'b1;
  19. else
  20.           cnt <=26'd0;
  21. end

  22. 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,然后再仿真,如下图所示:
图6.4.2仅用于仿真的代码
Testbench模块代码如下:
  1. `timescale1ns/1ps

  2. moduletb_led_twinkle();

  3. //输入
  4. reg           sys_clk;
  5. reg           sys_rst_n;

  6. //输出
  7. wire[1:0   led;

  8. //信号初始化
  9. initialbegin
  10.       sys_clk =1'b0;
  11.       sys_rst_n =1'b0;
  12. #200
  13.       sys_rst_n =1'b1;
  14. end

  15. //生成时钟
  16. always#10sys_clk =~sys_clk;

  17. //例化待测设计
  18.   led_twinkle  u_led_twinkle(
  19. .sys_clk         (sys_clk),
  20. .sys_rst_n       (sys_rst_n),
  21. .led             (led)
  22. );

  23. endmodule
复制代码
仿真得到的波形图如下图所示:

图6.4.3仿真波形图
    从图6.4.3中可以看到,计数器cnt的值在0到10之间循环计数。当cnt的值小于5时,led0为高电平;大于5时led0为高电平。两个LED的状态随着计数器的计数循环翻转,实现LED闪烁的效果。
1.5 下载验证
    编译工程并生成比特流.bit文件后,点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”按钮如下图所示。
图6.5.1Hardware Manager界面
此时将Xilinx下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,开发板连接电源线,如下图所示:
图6.5.2领航者开发板连接实物图
    注意!一定要先把下载器的一端连接到了电脑、另一端连接了JTAG接口之后,再给开发板上电!否则,对开发板的JTAG接口进行带电热插拔,有一定概率会损坏JTAG接口!
    开发板连接好电源线和下载器后,打开开发板电源开关,点击“Hardware”窗口中的“Auto Connect”图标,如下图所示:
图6.5.3 “Auto Connect”图标
    在“Hardware”子窗口中出现如下界面就表示Vivado就已经和下载器连接成功了,如下图所示:
图6.5.4与下载器连接成功
    我们点击上图中的“ProgramDevice”,弹出的界面如下图所示:
图6.5.5下载比特流界面
    此时Bitstream File一栏会自动识别到工程的比特流文件,我们直接点击“Program”按钮下载程序,程序下载完成后,PL配置完成灯会点亮(LED3),此时我们可以看到位于底板上的两个LED灯在不断地闪烁,如下图所示:
图6.5.6两个PL LED灯交替闪烁





回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-10-21 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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