搜索
bottom↓
回复: 0

《新起点V2之FPGA开发指南》第八章 LED灯流水实验

[复制链接]

出0入234汤圆

发表于 2021-9-28 17:09:12 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2021-10-30 10:22 编辑

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

2.jpg


3.png


第八章 LED灯流水实验

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

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

图 8.1.1 发光二极管实物图

第八章 LED灯流水实验512.png

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

       发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。
1.2实验任务
       本节实验任务是使新起点开发板上的4个LED灯顺序点亮并熄灭,循环往复产生流水的现象。
1.3硬件设计
       发光二极管的原理图如图 8.3.1所示, LED0到LED3这4个发光二极管的阴极都连到地( GND)上, 阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。
第八章 LED灯流水实验856.png

图 8.3.1  LED灯硬件原理图

本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表 8.3.1所示:
1.png

表 8.3.1 LED灯实验管脚分配

对应的TCL约束语句如下:
  1. set_location_assignment PIN_M2 -to sys_clk
  2. set_location_assignment PIN_M1 -to sys_rst_n
  3. set_location_assignment PIN_D11 -to led[0]
  4. set_location_assignment PIN_C11 -to led[1]
  5. set_location_assignment PIN_E10 -to led[2]
  6. set_location_assignment PIN_F9 -to led[3]
复制代码

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

图 8.4.1 LED灯模块原理图

       由于人眼的视觉暂留效应,流水灯状态变换间隔时间最好不要低于0.1s,否则就不能清晰地观察到流水效果。这里我们让流水灯每间隔0.2s变化一次。在程序中需要用一个计数器累加计数来计时,计时达0.2s后计数器清零并重新开始计数,这样就得到了固定的时间间隔。每当计数器计数满0.2s就让led灯发光状态变化一次。
       流水灯模块的代码如下:
  1. 1   module flow_led(
  2. 2       input               sys_clk  ,  //系统时钟
  3. 3       input               sys_rst_n,  //系统复位,低电平有效
  4. 4      
  5. 5       output  reg  [3:0]  led         //4个LED灯
  6. 6       );
  7. 7   
  8. 8   //reg define
  9. 9   reg [23:0] counter;
  10. 10  
  11. 11  //*****************************************************
  12. 12  //**                    main code
  13. 13  //*****************************************************
  14. 14                                                                                                                                                                                                                          
  15. 15  //计数器对系统时钟计数,计时0.2秒
  16. 16  always @(posedge sys_clk or negedge sys_rst_n) begin
  17. 17      if (!sys_rst_n)
  18. 18          counter <= 24'd0;
  19. 19      else if (counter < 24'd1000_0000)
  20. 20          counter <= counter + 1'b1;
  21. 21      else
  22. 22          counter <= 24'd0;
  23. 23  end
  24. 24  
  25. 25  //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
  26. 26  always @(posedge sys_clk or negedge sys_rst_n) begin
  27. 27      if (!sys_rst_n)
  28. 28          led <= 4'b0001;
  29. 29      else if(counter == 24'd1000_0000)
  30. 30          led[3:0] <= {led[2:0],led[3]};
  31. 31      else
  32. 32          led <= led;
  33. 33  end
  34. 34  
  35. 35  endmodule
复制代码

       本程序中输入时钟为50MHz,所以一个时钟周期为20ns(1/50MHz)。因此计数器counter通过对50MHz系统时钟计数,计时到0.2s,需要累加0.2s/20ns=10000000次。在代码第22行,每当计时到0.2s计数器清零一次。
       同时,每当计数器计数到10000000时,将各个LED灯的状态左移一位,并将最高位的值移动到最低位,循环往复。其他时间,LED灯的状态不变。如代码中第29至32行所示。
       需要说明的是,led的初始值必须是一位为1,其它位为0,在循环左移的过程中才会呈现流水灯的效果;而如果led的初始值为0,则左移后led的状态仍然为0。代码中led的初始值是由复位信号(sys_rst_n)控制的,如代码中第27行和第28行所示。这里的复位信号对应的就是板载的复位按键,尽管在上电后没有按下复位按键,由于FPGA芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)送给所有的寄存器,led的初始值就是在这个时候复位成4’b0001的。
       我们在Modelsim中对流水灯程序进行仿真,为了减少仿真过程所需要的时间,将流水灯状态变化的间隔时间修改为0.1ms。仿真得到的波形图如图 8.4.2所示,led端口寄存器的值按照0001→0010→0100→1000→0001的顺序变化,对应的各个LED灯的接口电平依次改变。
第八章 LED灯流水实验3688.png

图 8.4.2  Modelsim仿真波形图

仿真过程用到的测试程序如下所示:
  1. 1   `timescale  1ns/1ns                // 定义仿真时间单位1ns和仿真时间精度为1ns
  2. 2   
  3. 3   module  flow_led_tb;               // 测试模块
  4. 4   
  5. 5   //parameter  define
  6. 6   parameter  T = 20;                 // 时钟周期为20ns
  7. 7   
  8. 8   //reg define
  9. 9   reg  sys_clk;                      // 时钟信号
  10. 10  reg  sys_rst_n;                    // 复位信号
  11. 11  
  12. 12  //wire define
  13. 13  wire  [3:0]  led;
  14. 14  
  15. 15  //*****************************************************
  16. 16  //**                    main code
  17. 17  //*****************************************************
  18. 18  
  19. 19  //给输入信号初始值
  20. 20  initial begin
  21. 21      sys_clk            = 1'b0;
  22. 22      sys_rst_n          = 1'b0;     // 复位
  23. 23      #(T+1)  sys_rst_n  = 1'b1;     // 在第21ns的时候复位信号信号拉高
  24. 24  end
  25. 25  
  26. 26  //50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次
  27. 27  always #(T/2) sys_clk = ~sys_clk;
  28. 28  
  29. 29  //例化led模块
  30. 30  flow_led  u0_flow_led (
  31. 31      .sys_clk     (sys_clk  ),
  32. 32      .sys_rst_n   (sys_rst_n),
  33. 33      .led         (led      )
  34. 34  );
  35. 35  
  36. 36  endmodule
复制代码

1.5下载验证
       首先我们打开流水灯工程,在工程所在的路径下打开flow_led/par文件夹,在里面找到“flow_led.qpf”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。flow_led工程打开后如图 8.5.1所示。
第八章 LED灯流水实验4924.png

图 8.5.1 流水灯工程

       工程打开后通过点击工具栏中的“Programmer”图标(图中红框位置)打开下载界面。
       下载界面如图 8.5.2所示,查看图中红色矩形框中是否已经加载下载文件(sof文件)。如果没有,则需要通过点击“Add File”按钮添加流水灯工程中flow_led/par/output_files目录下的“flow_led.sof”文件。
第八章 LED灯流水实验5190.png

图 8.5.2 程序下载界面

       如下图 8.5.3所示。将USB Blaster下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,如下图所示。然后连接电源线并打开电源开关。
第八章 LED灯流水实验5366.png

图 8.5.3 新起点开发板实物图

       接下来我们下载程序,验证流水灯功能。
       开发板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当前的硬件连接为“USB-Blaster”。然后点击“Start”将工程编译完成后得到的sof文件下载到开发板中,如图 8.5.4所示。
第八章 LED灯流水实验5604.png

图 8.5.4 程序下载完成界面

下载完成后,就能在开发板上看到流水灯的效果了。


阿莫论坛20周年了!感谢大家的支持与爱护!!

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

本版积分规则

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

GMT+8, 2024-4-26 21:53

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

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