当前位置:   article > 正文

FPGA入门————LED流水灯(超详细教程)_led代码 fpga

led代码 fpga

本文使用软件为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。

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

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

2、计数器设计。

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

  1. reg [31:0]cnt=0;//计数
  2. reg clk1hz=0;//1hz时钟
  3. always@(posedge clk)
  4. begin
  5. if(cnt==32'd12500000-1)
  6. begin
  7. cnt<=0;
  8. clk1hz<=!clk1hz;
  9. end
  10. else
  11. cnt<=cnt+1;
  12. 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灯是低电平点亮还是高电平点亮。

我这里是高电平点亮。

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

  1. reg[7:0]c1=8'd1;
  2. always@(posedge clk1hz)
  3. begin
  4. if(c1[7]==1)
  5. c1<=8'd1;
  6. else
  7. c1<=c1<<1'b1;
  8. end
  9. assign led=c1;

<<为移位符号。

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

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

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

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

4、整体代码

  1. module LED(
  2. input clk,//25M
  3. output [7:0]led
  4. );
  5. reg [31:0]cnt=0;
  6. reg clk1hz=0;
  7. always@(posedge clk)
  8. begin
  9. if(cnt==32'd12500000-1)
  10. begin
  11. cnt<=0;
  12. clk1hz<=!clk1hz;
  13. end
  14. else
  15. cnt<=cnt+1;
  16. end
  17. reg[7:0]c1=8'd1;
  18. always@(posedge clk1hz)
  19. begin
  20. if(c1[7]==1)
  21. c1<=8'd1;
  22. else
  23. c1<=c1<<1'b1;
  24. end
  25. assign led=c1;
  26. endmodule

三、代码仿真

新建仿真文件

 

2、编写仿真代码

打开新建的文件

 2、编写仿真的测试代码

 代码如下:

  1. module tb_led();
  2. reg clk=0;
  3. wire [7:0]led;
  4. LED u1(
  5. .clk(clk),
  6. .led(led)
  7. );
  8. always #10 clk<=~clk;
  9. endmodule

 3、运行仿真

 用vivado自带的仿真比较慢。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/763678
推荐阅读
相关标签
  

闽ICP备14008679号