Lovewen1314

LED灯闪烁模块设计

1
阅读(2397)

LED灯闪烁模块设计

1.       设计要求。

LED1s翻转一次

2.       模块分析

设计要求是1s翻转一次,那么顾名思义,可以将工程分成两个部分,首先需要一个延时模块,还需要一个LED控制模块。

当计时时间到时,LED就翻转一次,那么延时模块就需要输出给LED闪烁模块一个使能信号,表示计时时间到,LED闪烁模块就需要一直检测输使能模块,当检测到使能信号有效时LED灯就翻转一次。整个工程就像是两个“小人”,一个“小人”以时钟为基准单元数数,当计时到1s时就告诉另外一个“小人”,另外一个“小人”就翻转一下。

设计框图.png

图1 工程模块

综合后的RTL视图

rtl视图.png

延时模块设计

module delay(clk,rst_n,delay_done);

    input clk;

    input rst_n;

    output delay_done;

   

    reg [25:0] cnt;

   

    localparam Delay1s=26'd49_999_999;

   

   

    always@(posedge clk or negedge rst_n)

        if(!rst_n)

            begin

                cnt<=26'b0;

            end

        else if(cnt<Delay1s)

            cnt<=cnt+1'b1;

       

        else

            cnt<=26'b0;

 

    assign delay_done=(cnt==Delay1s)?1'b1:1'b0;

   

    endmodule

   

led控制模块设计

module led_ctrl(clk,rst_n,delay_done,ledout);

    input clk;

    input rst_n;

    input delay_done;

    output [7:0] ledout;

   

    reg [7:0] ledout;

   

    always@(posedge clk or negedge rst_n)

        if(!rst_n)

            ledout<=0;

        else if(delay_done)

            ledout<=~ledout;

   

    endmodule

 

顶层模块设计

module led_flow(clk,rst_n,led_data);

    input clk;

    input rst_n;

    output led_data;

   

    wire delay_done;

   

    delay u_delay

    (

    .clk(clk),

    .rst_n(rst_n),

    .delay_done(delay_done)

    );

   

    led_ctrl u_led_ctrl

    (

    .clk(clk),

    .rst_n(rst_n),

    .delay_done(delay_done),

    .ledout(led_data)

    );

    endmodule