基于FPGA的LED闪烁灯设计

1. 项目介绍

  在FPGA上最简单的应用就是点亮一盏闪烁的LED。学过软件的朋友一般都写过“Hello world”,因为这个是最简单的程序。

2. 设计要求

  LED灯以2s的周期闪烁,LED灯亮、灭,每1s取反一次,如此循环,不断取反。从而实现LED灯的不断闪烁。

3. 设计分析

  从外部晶振(50M)时钟输入,利用计数器去计数1s,然后每隔1s改变一下LED输出引脚的电平状态。 因为开发板晶振为50M,所以一个时钟周期为20ns(1/50MHz),因此计数器cnt通过对50MHz系统时钟计数,计时到1s,需要累加1s/20ns=5000_0000次。

4.具体设计

4.1 硬件连接示意图

4.2 架构设计

5. 设计实现

 1 module led_flash(
 2     input     wire                 clk,
 3     input     wire                 rst_n,
 4     
 5     output     reg      [3:0]    led    
 6 );
 7 
 8     parameter     T_1S     = 26'd50_000_000;
 9     
10     reg         [25:0]    cnt;
11     
12     always@(posedge clk or negedge rst_n)begin
13         if(rst_n == 1'b0)
14             cnt <= 26'd0;
15         else
16             if(cnt < T_1S - 1'b1)
17                 cnt <= cnt + 1'b1;
18             else
19                 cnt <= 26'd0;
20     end
21 
22     always@(posedge clk or negedge rst_n)begin
23         if(rst_n == 1'b0)
24             led <= 4'b0000;
25         else
26             if(cnt == T_1S - 1'b1)
27                 led <= ~led;
28             else
29                 led <= led;
30     end
31     
32 endmodule 

6. 仿真验证

 1 `timescale 1ns/1ps
 2 
 3 module led_flash_tb();
 4 
 5     reg                     clk;
 6     reg                     rst_n;
 7     
 8     wire          [3:0]    led;    
 9     
10     defparam led_flash_inst.T_1S = 7'd100;
11 
12     led_flash led_flash_inst (
13         .clk                (clk),
14         .rst_n            (rst_n),
15 
16         .led                (led)    
17     );
18 
19     initial begin
20         while(2)begin
21             clk = 1'b0;     #10;
22             clk = 1'b1;        #10;        
23         end
24     end
25     
26     initial begin
27         rst_n = 1'b0;
28         #21;
29         rst_n = 1'b1;
30         #(2000*10);    //必须加括号,
31         $stop;
32     end
33     
34 endmodule 

7 参考资料

  (1)陪您一起学习FPGA-郝旭帅团队_哔哩哔哩_bilibili

posted @ 2021-07-31 11:07  豌豆茶  阅读(1647)  评论(0编辑  收藏  举报