【正点原子FPGA连载】第七章 流水灯实验

2020-01-27 13:47发布

本帖最后由 正点原子 于 2019-5-22 22:14 编辑

1)实验平台:正点原子开拓者FPGA开发板2)平台购买地址:https://item.taobao.com/item.htm?id=5797492098203)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-281143-1-1.html4)对正点原子FPGA感兴趣的同学可以加群讨论:712557122  点击加入: O1CN01abYcZO23XsL4ETed4_!!230947266.png 5)关注正点原子公众号,获取最新资料更新:
ee298312ae8a969bccb9017f82538666_154144hw0pv7uvwjje1ryy.png.thumb.jpg
第七章 流水灯实验
流水灯作为一个经典的入门实验, 其地位堪比编程界的“Hello,World”。对于很多电子工程师来说, 流水灯都是他们在硬件上观察到的第一个实验现象。 流水灯是指多个LED灯按照一定的时间间隔, 顺序点亮并熄灭, 周而复始形成流水效果。本章我们同样通过流水灯实验,带你进入FPGA的精彩世界。
本章包括以下几个部分:
7.1 LED灯简介
7.2 实验任务
7.3 硬件设计
7.4 程序设计
7.5 下载验证
7.1 LED灯简介
LED,又名发光二极管。 LED灯工作电流很小(有的仅零点几毫安即可发光) , 抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点, LED灯被广泛用在仪器仪表中作指示灯、 液晶屏背光源等诸多领域。不同材料的发光二极管可以发出红、 橙、 黄、 绿、 青、 蓝、 紫、白这八种颜 {MOD}的光。
图 7.1.1是可以发出黄、红、蓝三种颜 {MOD}的直插型二极管实物图, 这种二极管长的一端是阳极,短的那端是阴极。 图 7.1.2是开发板上用的贴片发光二极管实物图。 贴片二极管的正面一般都有颜 {MOD}标记,有标记的那端就是阴极。 image208.jpg
图 7.1.1 发光二极管实物图
image209.jpg
图 7.1.2 贴片发光二极管实物图
发光二极管与普通二极管一样具有单向导电性。 给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。 通过二极管的电流越大, 发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会坏二极管。
7.2 实验任务
本节实验任务是使开拓者开发板上的4LED灯顺序点亮并熄灭,循环往复产生流水的现
象。

7.3 硬件设计
发光二极管的原理图如图 7.3.1所示, LED0到LED3这4个发光二极管的阴极都连到地(GND)上, 阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。
image210.png
图 7.3.1 LED灯硬件原理图
本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表 7.3.1所示:
表 7.3.1 流水灯实验管脚分配
562ca2e08adeb35d7ee96501fb1df60.png
7.4 程序设计
由于二极管的阳极分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电平, LED灯的亮灭状态就会发生变化。 当FPGA管脚为高电平时, LED灯点亮; 为低电平时, LED灯熄灭。
本次设计的模块端口及信号连接如图 7.4.1所示:

图7.4.1.png
图 7.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 8
//reg define
9 reg [23:0] counter;
10
11
//*****************************************************
12 //** main code
13 //*****************************************************
14
15
//计数器对系统时钟计数,计时0.2秒
16 always @(posedge sys_clk or negedge sys_rst_n) begin
17 if (!sys_rst_n)
18 counter <= 24'd0;
19 else if (counter < 24'd1000_0000)
20 counter <= counter + 1'b1;
21 else
22 counter <= 24'd0;
23 end
24
25
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
26 always @(posedge sys_clk or negedge sys_rst_n) begin
27 if (!sys_rst_n)
28 led <= 4'b0001;
29 else if(counter == 24'd1000_0000)
30 led[3:0] <= {led[2:0],led[3]};
31 else
32 led <= led;
33 end
34
35
endmodule
本程序中输入时钟为50MHz,所以一个时钟周期为20ns(1/50MHz)。因此计数器counter通过对50MHz系统时钟计数, 计时到0.2s, 需要累加0.2s/20ns=10000000次。 在代码第22行,每当计时到0.2s计数器清零一次。
同时, 每当计数器计数到10000000时, 将各个LED灯的状态左移一位,并将最高位的值移动到最低位, 循环往复。 其他时间, LED灯的状态不变。 如代码中第29至32行所示。我们在Modelsim中对流水灯程序进行仿真,为了减少仿真过程所需要的时间, 将流水灯状态变化的间隔时间修改为0.1ms。 仿真得到的波形图如图 7.4.2所示, led端口寄存器的值按照0001→0010→0100→1000→0001的顺序变化,对应的各个LED灯的接口电平依次改变。
image212.png
图 7.4.2 Modelsim仿真波形图
仿真过程用到的测试程序如下所示:
1 `timescale 1ns/1ns
2
module tb_flow_led();
3
4 //parameter define
5 parameter T = 20;
6 7
//reg define
8 reg sys_clk; //时钟信号
9 reg sys_rst_n; //复位信号
10
11
//wire define
12 wire [3:0] led;
13
14
//*****************************************************
15 //** main code
16 //*****************************************************
17
18
//给输入信号初始值
19 initial begin
20 sys_clk <= 1'b0;
21 sys_rst_n <= 1'b0; //复位
22 # T sys_rst_n <= 1'b1; //在第20ns的时候复位信号信号拉高
23 end
24
25
//50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次
26 always # (T/2) sys_clk <= ~sys_clk;
27
28
//例化led模块
29 flow_led u0_flow_led (
30 .sys_clk (sys_clk ),
31 .sys_rst_n (sys_rst_n),
32 .led (led )
33 );
34
35
endmodule
7.5 下载验证
首先我们打开流水灯工程, 在工程所在的路径下打开flow_led/par文件夹, 在里面找到“flow_led.qpf” 并双击打开。注意工程所在的路径名只能由字母、 数字以及下划线组成, 不能出现中文、空格以及特殊字符等。 flow_led工程打开后如图 7.5.1所示。
image213.png
图 7.5.1 流水灯工程
工程打开后通过点击工具栏中的“Programmer” 图标(图中红框位置)打开下载界面。下载界面如图 7.5.2所示,查看图中红 {MOD}矩形框中是否已经加载下载文件(sof文件) 。如果没有,则需要通过点击“Add File” 按钮添加流水灯工程中flow_led/par/output_files目录下的“flow_led.sof” 文件。
image214.png
图 7.5.2 程序下载界面
如下图 7.5.3所示。 将USB Blaster下载器一端连接电脑, 另一端与开发板上的JTAG下载口连接,如下图所示。然后连接电源线并打开电源开关。
QQ截图20190522221411.png
图 7.5.3 开拓者开发板实物图
接下来我们下载程序,验证流水灯功能。开发板电源打开后,在程序下载界面点击“Hardware Setup” ,在弹出的对话框中选择当前的硬件连接为“USB-Blaster” 。 然后点击“Start” 将工程编译完成后得到的sof文件下载
到开发板中,如图 7.5.4所示。


image216.png
图 7.5.4 程序下载完成界面
下载完成后,就能在开发板上看到流水灯的效果了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zhangmangui
1楼-- · 2020-01-27 14:00
 精彩回答 2  元偷偷看……
springvirus
2楼-- · 2020-01-27 17:21
顶下原子哥,正在学习FPGA
springvirus
3楼-- · 2020-01-27 21:26
本帖最后由 springvirus 于 2019-7-1 14:44 编辑

.....

一周热门 更多>