OpenEdv-开源电子网

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

[XILINX] 【正点原子FPGA连载】第八章 流水灯实验--摘自【正点原子】超越者之FPGA开发指南 V1.1

[复制链接]

1333

主题

1349

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5695
金钱
5695
注册时间
2019-5-8
在线时间
1534 小时
跳转到指定楼层
楼主
发表于 2021-1-8 11:30:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 正点原子运营 于 2021-1-18 16:20 编辑

1)实验平台:正点原子超越者FPGA开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=631660290421
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-chaoyuezhe.html
4)本章实例源码下载: 第八章 流水灯实验.zip (179.01 KB, 下载次数: 5)
5)正点原子FPGA交流群:905624739 点击加入:
6)关注正点原子公众号,获取最新资料更新




第八章 流水灯实验

流水灯作为一个经典的入门实验,其地位堪比编程界的“Hello World”。对于很多电子工程师来说,流水灯都是他们在硬件上观察到的第一个实验现象。流水灯是指多个LED灯按照一定的时间间隔,顺序点亮并熄灭,周而复始形成流水效果。本章我们同样通过流水灯实验,带你进入FPGA的精彩世界。
本章包括以下几个部分:
1            
1.1            简介
1.2            实验任务
1.3            硬件设计
1.4            程序设计
1.5            下载验证

简介
LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。
不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图 8.1.1是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的那端是阴极。图8.1.2是开发板上用的贴片发光二极管实物图。贴片二极管的正面一般都有颜色标记,有标记的那端就是阴极。
file:///C:/Users/WCY/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
8.1.1 发光二极管实物图
file:///C:/Users/WCY/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
8.1.2 贴片发光二极管实物图
发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。
               实验任务
本节实验任务是使超越者开发板上的4个LED灯顺序点亮并熄灭,循环往复产生流水的现象。
               硬件设计
发光二极管的原理图如图 8.3.1所示,LED0到LED3这4个发光二极管的阴极都连到地(GND)上,阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。

8.3.1 LED灯硬件原理图
本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表8.3.1所示:
8.3.1 流水灯实验管脚分配
对应的 UCF 约束语句如下:
  1. #PlanAhead Generated physical constraints
  2. NET"sys_clk" LOC = N8 | IOSTANDARD = "LVCMOS33";
  3. NET"sys_rst_n" LOC = G16 | IOSTANDARD = "LVCMOS33";
  4. NET"led[0]" LOC = T5 | IOSTANDARD = "LVCMOS33";
  5. NET"led[1]" LOC = M6 | IOSTANDARD = "LVCMOS33";
  6. NET"led[2]" LOC = M7 | IOSTANDARD = "LVCMOS33";
  7. NET"led[3]" LOC = T3 | IOSTANDARD = "LVCMOS33";
复制代码
               程序设计
由于二极管的阳极分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电平,LED灯的亮灭状态就会发生变化。当FPGA管脚为高电平时,LED灯点亮;为低电平时,LED灯熄灭。
本次设计的模块端口及信号连接如图 8.4.1所示:
file:///C:/Users/WCY/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png
8.4.1 流水灯模块原理图
由于人眼的视觉暂留效应,流水灯状态变换间隔时间最好不要低于0.1s,否则就不能清晰地观察到流水效果。这里我们让流水灯每间隔0.2s变化一次。在程序中需要用一个计数器累加计数来计时,计时达0.2s后计数器清零并重新开始计数,这样就得到了固定的时间间隔。每当计数器计数满0.2s就让led灯发光状态变化一次。
流水灯模块的代码如下:
  1. module flow_led(
  2.      input              sys_clk  ,  //系统时钟
  3.      input              sys_rst_n,  //系统复位,低电平有效
  4.   
  5.      output  reg  [3:0  led         //4个LED灯
  6.      );

  7. //reg define
  8. reg [23:0 counter;

  9. //*****************************************************
  10. //**                   main code
  11. //*****************************************************
  12.                                                                                                                                                                                                                         
  13. //计数器对系统时钟计数,计时0.2秒
  14. always @(posedge sys_clk or negedge sys_rst_n) begin
  15.      if (!sys_rst_n)
  16.          counter <= 24'd0;
  17.      else if (counter < 24'd1000_0000)
  18.          counter <= counter +1'b1;
  19.      else
  20.          counter <= 24'd0;
  21. end

  22. //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
  23. always @(posedge sys_clk or negedge sys_rst_n) begin
  24.      if (!sys_rst_n)
  25.          led <= 4'b0001;
  26.      else if(counter == 24'd1000_0000)
  27.          led[3:0 <= {led[2:0,led[3]};
  28.      else
  29.          led <= led;
  30. end

  31. 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灯的接口电平依次改变。

8.4.2  Modelsim仿真波形图
仿真过程用到的测试程序如下所示:
  1. `timescale  1ns/1ns               // 定义仿真时间单位1ns和仿真时间精度为1ns

  2. module  flow_led_tb;               // 测试模块

  3. //parameter  define
  4. parameter  T =20;                 // 时钟周期为20ns

  5. //reg define
  6. reg  sys_clk;                      //时钟信号
  7. reg sys_rst_n;                    // 复位信号

  8. //wire define
  9. wire  [3:0  led;

  10. //*****************************************************
  11. //**                    main code
  12. //*****************************************************

  13. //给输入信号初始值
  14. initial begin
  15.      sys_clk            = 1'b0;
  16.      sys_rst_n          = 1'b0;     // 复位
  17.      #(T+1)  sys_rst_n = 1'b1;     // 在第21ns的时候复位信号信号拉高
  18. end

  19. //50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次
  20. always #(T/2) sys_clk = ~sys_clk;

  21. //例化led模块
  22. flow_led u0_flow_led (
  23.      .sys_clk     (sys_clk  ),
  24.      .sys_rst_n   (sys_rst_n),
  25.      .led         (led      )
  26. );

  27. endmodule
复制代码
               下载验证
首先我们打开流水灯工程,在工程所在的路径下打开flow_led/prj/flow_led文件夹,在里面找到“flow_led.xise”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。flow_led工程打开后如图8.5.1所示。

8.5.1 流水灯工程
工程打开后双击“ConfigureTarget Device”一栏中的“Manage Configuration Project(iMAPCT)”(上图红框位置),在弹出的界面中双击“BoundaryScan”,下载界面如图8.5.2所示。

8.5.2 程序下载界面
如下图8.5.3所示。将Xilinx下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,然后连接电源线。

8.5.3 超越者开发板实物图
打开电源开关,接下来我们下载程序,验证流水灯功能。
开发板电源打开后,点击工具栏中的“Initializechain”图标(图8.5.4红框位置),添加工程目录下的“flow_led.bit”文件。然后双击“Program”将工程编译完成后得到的bit文件下载到开发板中,如图8.5.5所示。


8.5.4 硬件连接

8.5.5 程序下载完成界面
下载完成后,就能在开发板上看到流水灯的效果如下图所示。

8.5.6 流水灯效果
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

GMT+8, 2026-5-22 07:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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