【万物基于电灯】FPGA点亮LED做一个流水灯

刚刚入门FPGA,菜鸟一个,新手一个,勿喷**

0、实验目标

使用Quartus II在黑金Alinx301开发板上实现时间间隔为1s的流水灯。

1、 软件安装:Quartus II与ModelSim-Altera 10.1d (Quartus II 13.0)、Notepad++的关联

关于Quartus II、Modeisim、Notepad++的安装在此不做过多赘述(更换路径,一路next)。
链接:https://pan.baidu.com/s/1_heL0osKhZFGUfNHsyXBMQ
提取码:62ck
安装完成后,打开Quartus II,在上方菜单栏中找到“Tools”(如下图所示)
在这里插入图片描述
点击,在下方找到“Options”
在这里插入图片描述
点击,选择“EDA Tool Options”,在下方“Modelsim…”中填入Modelsim(安装路径)
在这里插入图片描述
在“Preferred Text Editor”中下拉选择“Notepad++”并在双引号中填入Notepad++的安装路径
在这里插入图片描述
至此软件关联完毕,下面开始USB-Blaster以及元件库的安装。

2、 USB-Blaster以及元件库的安装

1)USB-Blaster:将开发板、USB-Blaster 和电脑进行正确连接,保证供电正常,打开开发板电源。鼠标右击“此电脑”,选择“管理(G)”在“设备管理器”的“其他设备”中发现未识别的名为“USB-Blaster”的外设,此外设的驱动还未被添加,设备图标显示感叹号。
鼠标右击“USB-Blaster”选择“更新驱动程序§”。
选择“浏览我的计算机以查找驱动程序软件®”。
点 击 “ 浏 览 ®… ” 选 择 驱 动 路 径 , 路 径(安装路径)为
“quartusII13.0\quartus\drivers\usb-blaster”,然后点击“下一步(N)”。
点击“安装(I)”即可。
驱动安装完成,点击“关闭©”退出。
完成 USB-Blaster 驱动安装后,在“通用串行总线控制器”下显示出“Altera USB-Blaster”,表示驱动成功安装。
2)元件库安装:QuartusII 软件安装完成后会同时安装一个名为“Quartus II 13.0sp1 Device Install…”的选项,打开该文件。
在这里插入图片描述
文件打开后,点击“Next”,进入下一步。
选择待元件库存放路径,点击“Next”,进入下一步。
元件库勾选,然后点击“Next”。
等待元件库安装完成。
元件库安装完成,直接点击“Finish”完成安装并退出。(所需的内容链接里都提供了)下面开始:动手!

3、Project_ex

在这里插入图片描述
建这个空工程文件单纯是为了以后建工程直接复制粘贴,顺带讲一下每个文件夹的作用。
doc:用来存放工程说明与电路设计文件
ip_core:存放所调用的ip核文件
quartus_prj:工程文件存在并说明开发所使用的为Quartus软件
src:存放工程源文件
sim:存放TB仿真文件

4、 硬件电路

在这里插入图片描述
根据简单的电路知识,当输出一个高电平时,LED亮,反之则灭。
但这仅仅只是点亮而已,距离“流水”的效果还差一丝,而所谓“流水”也就是LED0123依次亮灭。这里就需要一个简单的时间计时电路。
在数字电路中,通常使用计数器来达到计时的效果。
那么问题来了,怎么计算时间?
此时,关注点给到晶振这边
在这里插入图片描述
开发板使用的时f=50MHz的晶振,那么t=1/f=20ns,那么计时1s需要50000000个时钟周期。
那么计数器从0!从0!从0!(重要的事情说三遍)开始计数到49999999就刚好50000000个数。也就是一秒。(50000000换算成二进制)换算成二进制

5、程序构思

1)输入输出变量:作为时序电路必然有clk时钟信号与rst_n复位信号(这里采用经典的异步复位,关于时钟与复位,以后为大把大把写,因为它真的很重要),其次,我们需要一个变量用来表示led的状态。
2)计数:经过上面的计算,当第一秒到来时即计数到49_999_999时,led的状态发生改变,当又一个1秒到来时,led状态发生改变,以此类推。由于有四个灯,所以需要计数4秒,这样就需要四个常量与一个计数变量。
3)这样,我们能简单设计一个初步的框图来表示我们的想法(在doc文件夹中建立一个Visio文件):
在这里插入图片描述
clk与rst_n不再多说,Led_data用于表述led的状态,下放的波形图是根据我们的想法画一下。

6、程序设计

在src中新建LED_Water.v文件

module  LED_Water 
#(
    parameter      COUNT_1S=28'd49_999_999,
    parameter      COUNT_2S=28'd99_999_999,
    parameter      COUNT_3S=28'd149_999_999,
    parameter      COUNT_4S=28'd199_999_999
)
(
    input                            clk,
    input                            rst_n,
    output  reg     [3:0]          led_data
);

//计数模块
reg     [27:0]  counter;

always@(posedge clk or negedge rst_n)
    begin
            if(!rst_n)
                counter<=0;
            else    if(counter==COUNT_4S)
                counter<=0;
            else
                counter<=counter+1'b1;
    end
    
//led控制

always@(posedge clk or negedge rst_n)
    begin
            if(!rst_n)
                led_data<=4'b0;
            else if(counter==COUNT_1S)
                led_data<=4'b1000;
            else if(counter==COUNT_2S)
                led_data<=4'b0100;
            else if(counter==COUNT_3S)
                led_data<=4'b0010;
            else if(counter==COUNT_4S)
                led_data<=4'b0001;
    end

endmodule

计数到最大4秒时对应的十进制数为199_999_999换算成二进制数为1011 1110 1011 1100 0001 1111 1111一共28位,所以声明一个28位的变量,并且使用always语句进行赋值,所以声明为reg变量。

7、仿真验证

1)新建工程,打开Quartus,File->New->New Quartus II Project
把工程路径改到quartus_prj文件下,并命名位LED_Water,在Add_File选择Next,然后选择芯片,最后来到这个界面,切记切记在这个地方选择verilog
在这里插入图片描述
在这里插入图片描述
然后完成工程文件的建立
2)点击Files在这里插入图片描述
并在上方右击
在这里插入图片描述
将刚刚在src文件下建立的LED_Water.v文件添加到工程下,仿真(快捷键CTRL+L)在这里插入图片描述
暂时不去管这些warning,这些东西后面都会解决
3)在sim文件夹下新建TB_LED_Water.v文件

`timescale  1ns/1ns

module TB_LED_Water();

reg clk;
reg rst_n;

wire [3:0]  led_data;

initial
    begin
        clk=1'b1;
        rst_n=1'b0;
        #20
        rst_n=1'b1;
    end

always #10  clk=~clk;

LED_Water
#(
    .COUNT_1S(10'd100),
    .COUNT_2S(10'd200),
    .COUNT_3S(10'd300),
    .COUNT_4S(10'd400)
)
LED_Water_inst
(
    .clk(clk),
    .rst_n(rst_n),
    .led_data(led_data)
);

endmodule

TB文件的编写是个很有意思的过程。
(1)·timescale 定义仿真时间单位与精度,1ns(前)是时间单位,即在仿真中用#10表示延迟10ns。1ns(后)表示时间精度。
(2)声明module,因为是仿真文件,所以没有输入输出信号。
(3)声明变量clk,rst_n,使用always语句和initial语句所以声明为reg型变量
(4)声明wire型变量led_data
(5)initial语句与always仿真时钟
(6)例化module LED_Water(可以修改常量的值,尽量修改的小一点,这样方便在Modelsim观察)
4)同添加LED_Water一样讲TB文件一样添加到工程下,CTRL+L仿真
5)仿真设置:在菜单栏中Assignments下的setting中找到Simulation选项卡在这里插入图片描述
在Compile test bench选项上点击Test Benches……跳出如下界面(这是我已经设置好了,刚开始应该是空白的)在这里插入图片描述点击New…跳出如下界面,在Test bench name中输入TB_LED_Water然后点击下面File name后的…,涨到找到刚刚编写的TB文件,一路ok,再次CTRL+L在这里插入图片描述
6)不再报错后点击,菜单栏上的这个图标进行仿真在这里插入图片描述
在这里插入图片描述
关于Modelsim仿真后面会也会写,这边先浅交待一下

8、上板验证

同样是在Assignments下选择Pin Planner在这里插入图片描述
当然也可以快捷键ALT+L输入TCL脚本
最后,开发板上电,点击Programmer在这里插入图片描述
点击左上角Hardware Setpup…在这里插入图片描述
在这里插入图片描述
选择USB-Blaster
然后点击左侧Add File在Output_file中选择.sof文件
点击Start,并观察右上角Progress
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9、小总结

第一篇关于FPGA的文,后面还会写很多,一些基础的时序电路和组合逻辑电路,Modelsim仿真还有MATLAB以及FPGA的应用,谢谢大家,如有意见,评论区见

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值