(3)計數器&時序邏輯

数字ic新人發表於2024-04-02

設計思路:

設計程式碼:

RTL:

module led_flash(
    clk,rst_n,led
    );
    input clk,rst_n;
    output reg led=0;
    parameter max=24999999;  //(計數的最大值)
    reg [24:0] cnt=0;
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            cnt <= 0;
        else if (cnt == max)
            cnt <= 0;
        else
            cnt <= cnt+1;
    //燈的閃爍
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            led <= 0;
        else if (cnt == max)
            led <= ~led;
        else
            led <= led;     
endmodule

tb:

`timescale 1ns / 1ps

module led_flash_tb();
    
    reg clk,rst_n;
    wire led;
    
    led_flash u_led_flash(
        .clk(clk),
        .rst_n(rst_n),
        .led(led)
    );
    
    initial 
        clk = 1;
        always #10 clk = ~clk;  //每10ns翻轉一次,因此clk週期為20ns
    initial begin
        rst_n = 0;
        #200;
        rst_n = 1;
        #3000000000;
        $stop;
    end
    
endmodule

模擬波形:

  在上面我設定的是3s結束,但是模擬時間太長了,也就沒有繼續,看到led翻轉就暫停了。

  在波形的邊緣處右鍵,選擇Mark,可以打一個標記,點一下標記底下就會出現刻度尺。

  可以看到,led的半個週期為500ms,滿足我們的設計要求。

電路結構圖:

上班驗證:

  

  這裡發現什麼都看不到,點一下上面這個group按鈕就好了

  上板後發現led以1s頻率閃爍,如果按住按鈕0的話led將不閃爍(復位),本實驗設計得到成功驗證。

  

相關文章