新闻  |   论坛  |   博客  |   在线研讨会
基于Verilog FPGA 流水灯设计_流水灯源码_明德扬资料
billow兔 | 2017-08-03 09:15:52    阅读:443   发布文章

 

 

 

 

 

 

 

 

 

 

基于Verilog FPGA 流水灯设计_流水灯源码_明德扬资料

明德扬科技教育有限公司

 

 

 

 

官  网:www.mdy-edu.com

淘  宝:mdy-edu.taobao.com

QQ  群:544453837

QQ咨询:158063679


 

LED流水广告灯

1 功能概述

流水广告灯主要应用于LED灯光控制。通过程序控制LED的亮和灭, 多个LED灯组成一个阵列,依次逐个点亮的时候像流水一样,所以叫流水灯。由于其形成美观大方的视觉效果,因此广泛应用于店铺招牌、广告、大型建筑夜间装饰、景观装饰等。

在FPGA电路设计中,尽管流水灯的设计属于比较简单的入门级应用,但是其运用到的方法,是FPGA设计中最核心和最常用部分之一,是FPGA设计必须牢固掌握的基础知识。从这一步开始,形成良好的设计习惯,写出整洁简洁的代码,对于FPGA设计师来说至关重要。

在本案例中,使用常用的verilog语言完成该程序,设计并控制8个灯的花式或循环点亮。具体功能要求如下:

上电后,实现左移和右移交替的流水灯。

右移流水灯:八个灯最左边第一个灯灭,其他灯亮;隔1s后,第二个灯灭,其他灯亮;隔1s后,第三个灯灭,其他灯亮;如此类推,直到第八个灯灭1s后进行左移流水灯操作。

左移流水灯:八个灯最右边第一个灯灭,其他灯亮;隔1s后第二个灯灭,其他灯亮;再隔1s后,第三个灯灭,其他灯亮;如此类推,直到第八个灯灭1s后进行右移流水灯操作。

2 设计思路

按照项目的功能要求,我们用8比特的LED信号表示8个灯,led[0]~led[7]分别代表第1个至第8个灯,值为0时亮,0时亮。下面我们来看看硬件电路图以及制定出项目所需的信号列表。

 

图1  流水灯硬件电路

 

信号列表:

 

信号名

I/O

位宽

说明

clk

I

1

系统工作时钟100MHz。

rst_n

I

1

系统复位信号,低电平有效。

led

O

8

八位流水灯,高电平灭,低电平亮。

 

3   程序设计

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

module led_l2(

                clk      ,

                rst_n    ,

                led

      );

      parameter     LED_TIME =   50_000_000    ;

 

      input                       clk           ;

      input                       rst_n         ;

      output[7:0]                  led           ;

 

      reg   [7:0]                 led           ;

      reg   [26-1:0]              cnt           ;

      reg   [3-1:0]               cnt2        ;

      reg   [3-1:0]               cnt3          ;

 

      wire                         add_cnt     ;

      wire                         end_cnt     ;

      wire                       add_cnt2    ;

      wire                         end_cnt2    ;

      wire                         add_cnt3    ;

      wire                         end_cnt3    ;

 

      always @(posedge clk or negedge rst_n)begin

        if(!rst_n)begin

            cnt <= 0;

        end

        else if(add_cnt)begin

            if(end_cnt)

                cnt <= 0;

            else

                cnt <= cnt + 1;

        end

      end

      assign add_cnt = 1 ;      

      assign end_cnt = add_cnt && cnt==LED_TIME-1 ;

 

      always @(posedge clk or negedge rst_n)begin

        if(!rst_n)begin

            cnt2 <= 0;

        end

        else if(add_cnt2)begin

            if(end_cnt2)

                cnt2 <= 0;

            else

                cnt2 <= cnt2 + 1;

        end

      end

      assign add_cnt2 = end_cnt ;        

      assign end_cnt2 = add_cnt2 && cnt2==8-1 ;

 

      always @(posedge clk or negedge rst_n)begin

        if(!rst_n)begin

            cnt3 <= 0;

        end

        else if(add_cnt3)begin

            if(end_cnt3)

                  cnt3 <= 0;

            else

                cnt3 <= cnt3 + 1;

        end

      end

      assign add_cnt3 = end_cnt2 ;        

      assign end_cnt3 = add_cnt3 && cnt3==2-1 ;  

 

      always  @(posedge clk or negedge   rst_n)begin

        if(rst_n==1'b0)begin

            led <= 8'b00000001;

        end

        else   if(end_cnt&&cnt3==1-1&&cnt2!=8-1)begin

            led <= {led[6:0],led[7]};

        end

        else   if(end_cnt&&cnt3==2-1&&cnt2!=8-1)begin

            led <= {led[0],led[7:1]};

        end

      end

endmodule

 


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客