天天看點

FPGA學習之流水燈的簡單設計

流水燈的簡單設計

設計要求:低位點亮一個led,下一個周期,點亮兩個led,逐次增加led的個數,全部點亮後的下一個周期,又點亮一個led

該實驗需要兩個子產品,計數器子產品和led控制子產品

計數器子產品:就是一個分頻器,頻率為2hz,系統時鐘為50mhz,50_000_000/2=25_000_000,需要25位計數器。

led控制子產品:控制移位,到達全0時,led為全1。不斷循環點亮。

頂層子產品代碼:

module ledwater(clk,rst_n,led);

input clk;

input rst_n;

output [7:0]led;

parameter max_cnt=24_999_999;

reg [24:0]cnt;//計數器

always @(posedge clk or negedge rst_n)

    if(!rst_n)

        cnt <=25'd0;

    else if(cnt==max_cnt)

    else

        cnt <=cnt + 1'b1;

reg [7:0]led_r;

always@(posedge clk or negedge rst_n)

        led_r <= 8'b1111_1111;

    else if(cnt == max_cnt)begin

        led_r <= led_r << 1;

        if(led_r==8'd0)

            led_r <= 8'b1111_1111;

//      else

//          led_r <= led_r;//此處不應該有,邏輯不對

    end

        led_r <= led_r;

assign led = led_r;

endmodule

測試檔案隻需設定clk和rst_n

代碼:

`timescale 1ns/1ns

`define clk_period 20

module ledwater_tb;

reg clk;

reg rst_n;

wire [7:0]led;

ledwater

#(

    .max_cnt(10)

)

ledwater0(

        .clk(clk),

        .rst_n(rst_n),

        .led(led)

        );

initial clk=1;

always #(`clk_period/2)clk= ~clk;

initial begin

    rst_n=0;

    #(`clk_period*30+1);

    rst_n=1;

end

ps:測試檔案采用參數化設計

         .max_cnt(10)

                   .clk(clk),

                   .rst_n(rst_n),

                   .led(led)

                   );

仿真波形:

FPGA學習之流水燈的簡單設計

繼續閱讀