FPGA入门————LED流水灯(超详细教程)

本文使用软件为vivado,其实用哪个软件都是一样的,主要是掌握核心编程思想。

如有需要下载vivado软件下载可以参考:

vivado及ISE各版本软件下载方法、链接及详细步骤,官方网页下载_ise软件下载_千寻xun的博客-CSDN博客

目录

一、新建工程及设计文件

二、编写LED流水灯程序

一、新建工程及设计文件

1、双击打开软件(我使用的是2021版本,使用其他版本也一样)

2、新建工程

点击创建工程:

 点下一步:

 选择工程存放路径以及生成的工程名字:

 可以选择先不定义源文件,后面进行添加即可,点下一步:

 选择器件型号,如果有FPGA开发板,在这里选择自己FPGA对应的型号即可,如果没有开发板,可以随便选择一个,选好点击下一步:

 点击完成即可:

 2、添加工程文件

点击添加文件:

先添加设计文件,点击下一步:

点击新建:

定义新建的设计文件名字,建议和工程名字相同。点ok。

 点击完成

点击ok。选择yes.。

 

在设计文件中可以看到我们新建的工程文件。

 到这里,新建工程和设计文件以经完成了。

二、编写LED流水灯程序

 1、定义端口

LED流水灯主要需要定义时钟clk,和led。

我这里led灯有8个,定义信号名为【7:0】led。


module LED(
    input clk,//输入信号定义为input
    output [7:0]led//输出信号定义为output
    );    
endmodule

 如果添加一个输入复位信号rst,知道该怎么定义了吗

2、计数器设计。

流水灯如果频率太快看起来就和全部常亮一样。我这里设计一个1s周期的流水灯,频率f=1/T;频率为1hz。我这个板上时钟频率为25mhz,根据自己实际的时钟来。

   reg [31:0]cnt=0;//计数
   reg clk1hz=0;//1hz时钟
   always@(posedge clk)
   begin
        if(cnt==32'd12500000-1)
            begin
               cnt<=0;
               clk1hz<=!clk1hz; 
            end
        else
            cnt<=cnt+1;
   end

cnt计数到12500000-1;这个值怎么算的?

时钟25Mhz,即25000000;

要得到的时钟为1hz,

及一个1hz的时钟周期需要25mhz时钟计数25000000/1次。

一个时钟包括高电平和低电平。一般时钟的占空比都为百分之50,

所以1hz时钟的高电平和低电平都需要25mhz时钟计数12500000次。

计数器是从0开始计数的,所以计数到12500000-1就相当于计数了12500000次;

给时钟定义一个初值0,计数到12500000-1就翻转一次,变为1。一直循环即可得到一个1hz的时钟。

3、led灯赋值

首先需要确定led灯是低电平点亮还是高电平点亮。

我这里是高电平点亮。

流水灯的设计有很多方法,我这里介绍一个代码相对简短的。

  reg[7:0]c1=8'd1;
    always@(posedge clk1hz)
    begin
        if(c1[7]==1)
            c1<=8'd1;
        else
            c1<=c1<<1'b1;
    end
    assign led=c1;

<<为移位符号。

原理为:c1信号赋初值为1,及8’b00000001;

在时钟clk1hz下进行移位,<<1’b1表示一次移1位;

当c1【7】==0,即=8‘b10000000时让它又回到8’b00000001。

重复循环就实现了一个简单的流水灯。

4、整体代码

module LED(
    input clk,//25M
    output [7:0]led
    );
    reg [31:0]cnt=0;
   reg clk1hz=0;
   always@(posedge clk)
   begin
        if(cnt==32'd12500000-1)
            begin
               cnt<=0;
               clk1hz<=!clk1hz; 
            end
        else
            cnt<=cnt+1;
   end
    reg[7:0]c1=8'd1;
    always@(posedge clk1hz)
    begin
        if(c1[7]==1)
            c1<=8'd1;
        else
            c1<=c1<<1'b1;
    end
    assign led=c1;
endmodule

三、代码仿真

新建仿真文件

 

2、编写仿真代码

打开新建的文件

 2、编写仿真的测试代码

 代码如下:

module tb_led();
reg clk=0;
wire [7:0]led;

    LED u1(
    .clk(clk),
    .led(led)   
    );
    
always #10 clk<=~clk;
endmodule

 3、运行仿真

 用vivado自带的仿真比较慢。

 可以看出led在按位变为1,即点亮。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐