FC2カウンター FPGAの部屋 Watchdog timer を Vitis HLS 2020.1 で実装する2(Vivado 2020.1)
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Watchdog timer を Vitis HLS 2020.1 で実装する2(Vivado 2020.1)

Watchdog timer を Vitis HLS 2020.1 で実装する1(Vitis HLS 2020.1)”の続き。

GPS と 3軸加速度センサーを使ったシステム5(Vivado 2020.1 のプロジェクトを作成中)”(現在は、3軸加速度センサーが 9 個付くようになっている)に Watchdog Timer を実装することにした。そこで、Vitis HLS 2020.1 で Watchdog Timer を作成することにしたということで、前回は、Vitis HLS 2020.1 でウォッチドックタイマの Verilog HDL コード(WDTimer.v)を合成した。今回は、Vivado 2020.1 を使用して、 WDTimer.v のシミュレーションを行う。

(2020/12/26:追記)
実機で動作しなかったため enable ポートを追加しました。詳しくは、”Watchdog timer を Vitis HLS 2020.1 で実装する3(デバック修正)”を参照してください。


Vivado 2020.1 の WDTimer プロジェクトを作成した。
WDTimer_4_201225.png

テストベンチの WDTimer_tb.v を示す。

`default_nettype none
`timescale 100ps / 1ps

// WDTimer_tb.v
// 2020/12/24 by marsee
//

module WDTimer_tb;
    parameter DELAY    = 10;

    wire ap_clk;
    wire ap_rst;
    reg  rst_in;
    wire rst_out;
    wire ap_rst_0;
    wire ap_rst_1;
    
    assign ap_rst = ap_rst_0 | ap_rst_1;

    WDTimer WDTimer_i(
        .ap_clk(ap_clk),
        .ap_rst(ap_rst),
        .rst_in(rst_in),
        .rst_out(rst_out),
        .ap_return()
    );

    // clk_gen のインスタンス(ap_clk)
    clk_gen #(
        .CLK_PERIOD(100),    // 10 nsec, 100 MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ap_clk)
    );

    // reset_gen のインスタンス
    reset_gen #(
        .RESET_STATE(1'b1),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(ap_rst_0),
        .init_done()
    );
    
    assign ap_rst_1 = rst_out;

    initial begin
        rst_in = 1'b0;
        #1000 // wait reset

        #30000000 // 3 ms wait
        @(posedge ap_clk);    // 次のクロックへ
        #DELAY;
        rst_in = 1'b1;
        @(posedge ap_clk);    // 次のクロックへ
        #DELAY;
        rst_in = 1'b0;

        #70000000 // 7 ms wait
        
        $stop;
    end

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out,
    output    reg        init_done
);
    begin
        initial begin
            reset_out = RESET_STATE;
            init_done = 1'b0;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
            init_done = 1'b1;
        end
    end
endmodule

`default_nettype wire


PROJECT MANAGER から SIMULATION -> Run Simulation をクリックして、シミュレーションをスタートした。
WDTimer_4_201225.png

波形ウインドウにカウンタの empty_reg_67 を入れた。
WDTimer_5_201225.png

ピンクの四角が rst_in に 1 を入れたところで、黄色の四角がウォッチドックタイマがタイムアウトして、 rst_out が 1 になった部分を示す。

最初に rst_in に 1 を入れた部分を拡大する。
WDTimer_6_201225.png

rst_in が 1 になったクロックの立ち上がりで、 empty_reg_67 カウンタが 1 になっているのが分かる。これで正常だ。

次に、ウォッチドックタイマがタイムアウトして、 rst_out が 1 になった部分を拡大する。
rst_in が 1 になったクロックの立ち上がりで、 empty_reg_67 カウンタが 1 になるが、そこから約 5.24 ms 経過すると rst_out が 1 になる。その時に、 ap_rst を 1 にすれば、 empty_reg_67 カウンタが 0 からリスタートする。これで正常だ。
WDTimer_7_201225.png

これで正常なので、Vitis HLS 2020.1 に戻って Export RTL を行った。
WDTimer_9_201225.png

IP が作成できた。
WDTimer_10_201225.png
  1. 2020年12月25日 04:47 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/5099-bba602f7
この記事にトラックバックする(FC2ブログユーザー)