"); //-->
基于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 |
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。