正点原子 战舰原理图pcb_【正点原子FPGA连载】第七章流水灯实验-摘自【正点原子】开拓者 FPGA 开发指南...

1)资料下载:

正点原子资料下载中心 - 正点原子资料下载中心 1.0.0 文档​www.openedv.com

2)对正点原子FPGA感兴趣的同学可以加群讨论:876744900

3)关注正点原子公众号,获取最新资料更新

http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)

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

本章包括以下几个部分:

7.1 LED灯简介

7.2 实验任务

7.3 硬件设计

7.4 程序设计

7.5 下载验证

7.1 LED灯简介

LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗 震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶 屏背光源等诸多领域。

不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图 7.1.1 是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的那 端是阴极。图 7.1.2是开发板上用的贴片发光二极管实物图。贴片二极管的正面一般都有颜色 标记,有标记的那端就是阴极。

a4bae03e9876e156e6abf777c055fce4.png
图 7.1.1 发光二极管实物图

74c1de3107d7de32a8d1375c2c15d815.png
图 7.1.2 贴片发光二极管实物图

发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右 的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电 流限定在3~20mA之间,否则电流过大就会烧坏二极管。

7.2 实验任务

本节实验任务是使开拓者开发板上的4个LED灯顺序点亮并熄灭,循环往复产生流水的现 象。

7.3 硬件设计

发光二极管的原理图如图 7.3.1所示,LED0到LED3这4个发光二极管的阴极都连到地(GND) 上,阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。

fcaab74ec211cffe8496eaa4e199c1c5.png
图 7.3.1 LED灯硬件原理图

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

2d44114af5a7dbb486de0d36e4b6b215.png
表 7.3.1 流水灯实验管脚分配

7.4 程序设计

由于二极管的阳极分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电 平,LED灯的亮灭状态就会发生变化。当FPGA管脚为高电平时,LED灯点亮;为低电平时,LED 灯熄灭。

本次设计的模块端口及信号连接如图 7.4.1所示:

3321ea9fa5d2c084509b5b9938e09b40.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行所示。

需要说明的是,led的初始值必须是一位为1,其它位为0,在循环左移的过程中才会呈现 流水灯的效果;而如果led的初始值为0,则左移后led的状态仍然为0。代码中led的初始值是 由复位信号(sys_rst_n)控制的,如代码中第27行和第28行所示。这里的复位信号对应的就 是板载的复位按键,尽管在上电后没有按下复位按键,由于FPGA芯片内部有一个上电检测模块, 一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)送给所有的 寄存器,led的初始值就是在这个时候复位成4’b0001的。

我们在Modelsim中对流水灯程序进行仿真,为了减少仿真过程所需要的时间,将流水灯状 态变化的间隔时间修改为0.1ms。仿真得到的波形图如图 7.4.2所示,led端口寄存器的值按照 0001→0010→0100→1000→0001的顺序变化,对应的各个LED灯的接口电平依次改变。

c2eafb3bee5ee49f63d5e3cafea9d225.png
图 7.4.2 Modelsim仿真波形图

仿真过程用到的测试程序如下所示:

1 `timescale 1ns/1ns // 定义仿真时间单位1ns和仿真时间精度为1ns

2

3 module flow_led_tb(); // 测试模块

4

5 //parameter define

6 parameter T = 20; // 时钟周期为20ns

7

8 //reg define

9 reg sys_clk; // 时钟信号

10 reg sys_rst_n; // 复位信号

11

12 //wire define

13 wire [3:0] led;

14

15 //*****************************************************

16 //** main code

17 //*****************************************************

18

19 //给输入信号初始值

20 initial begin

21 sys_clk = 1'b0;

22 sys_rst_n = 1'b0; // 复位

23 #(T+1) sys_rst_n = 1'b1; // 在第21ns的时候复位信号信号拉高

24 end

25

26 //50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次

27 always #(T/2) sys_clk = ~sys_clk;

28

29 //例化led模块

30 flow_led u0_flow_led (

31 .sys_clk (sys_clk ),

32 .sys_rst_n (sys_rst_n),

33 .led (led )

34 );

35

36 endmodule

7.5 下载验证

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

25456fbf8d79a4cac87f8743be81baf5.png
图 7.5.1 流水灯工程

工程打开后通过点击工具栏中的“Programmer”图标(图中红框位置)打开下载界面。

下载界面如图 7.5.2所示,查看图中红色矩形框中是否已经加载下载文件(sof文件)。 如果没有,则需要通过点击“Add File”按钮添加流水灯工程中flow_led/par/output_files 目录下的“flow_led.sof”文件。

7a15998ccad3e190fe0acef2fdf5703f.png
图 7.5.2 程序下载界面

如下图 7.5.3所示。将USB Blaster下载器一端连接电脑,另一端与开发板上的JTAG下载 口连接,如下图所示。然后连接电源线并打开电源开关。

aa1a6e7423af841a11fe053dbf4bb7fe.png
图 7.5.3 开拓者开发板实物图

接下来我们下载程序,验证流水灯功能。

开发板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当 前的硬件连接为“USB-Blaster”。然后点击“Start”将工程编译完成后得到的sof文件下载 到开发板中,如图 7.5.4所示。

b826ac824895700c71e5a4567aa741e2.png
图 7.5.4 程序下载完成界面

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值