1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. 【FPGA検証ノウハウ】Vivado™ロジックアナライザーを便利に使ってみる(Advanced triggerの使い方)~実践編~

TECHブログ

【FPGA検証ノウハウ】Vivado™ロジックアナライザーを便利に使ってみる(Advanced triggerの使い方)~実践編~

【FPGA検証ノウハウ】Vivado™ロジックアナライザーを便利に使ってみる(Advanced triggerの使い方)~実践編~

皆さん、こんにちは。
実機でFPGAの動作確認を行う場合、Vivado™に搭載されているロジックアナライザーを使うことが多いかと思います。
信号を選んで、値を設定して単純にトリガーをかけるだけならよいのですが、複雑な条件を設定してトリガーをかけたくなることはありませんか?

本ブログでは、ロジックアナライザーを便利にする「Advanced trigger」の使い方を紹介したいと思います。今回は実践編です。

それでは、はじめましょう。

目次

前提条件

3つのカウンタと1つのフラグ信号があり、次のような動作をします。

カウンタ「い」 u_ex_top/u_sub/count_i[3:0]( 0x0 から始まり、0x0~0x2を繰り返す。)
カウンタ「ろ」 u_ex_top/u_sub/count_ro[3:0]( 0x3 から始まり、0x3~0x7を繰り返す。)
カウンタ「は」 u_ex_top/u_sub/count_ha[3:0]( 0x8 から始まり、0x8~0xEを繰り返す。)
フラグ「に」 u_ex_top/u_sub/flag_ni( Low から始まり、途中でHighになる。)

出典:Vivado™ 2020.2.2 Hardware Manager hw_ila_1画面(参照 2023/09/22)

以降、波形に描かれた黄色枠はAdvanced triggerに設定した条件、赤色枠は設定条件且つトリガーが行われた箇所になります。

例① 3つの値が一致

条件

同じタイミングで3つのカウンタの値が一致したらトリガーを実行します。

トリガー設定内容

左右にスクロールしてご覧ください
state ex1_seq1:
    if ((u_ex_top/u_sub/count_i  == 4'h1) &&
        (u_ex_top/u_sub/count_ro == 4'h7) &&
        (u_ex_top/u_sub/count_ha == 4'hc)) then
        trigger;
    else
        goto ex1_seq1;
    endif

実動作

出典:Vivado™ 2020.2.2 Hardware Manager hw_ila_1画面(参照 2023/09/22)

例② 5つの値を順番に待つ

条件

3つのカウンタの値が次の順番で一致したらトリガーを実行します。

トリガー設定内容

左右にスクロールしてご覧ください
state ex2_seq1:
    if ((u_ex_top/u_sub/count_i == 4'h2) && ($counter0 == 16'h0002)) then
        goto ex2_seq2;
    elseif (u_ex_top/u_sub/count_i == 4'h2) then
        increment_counter $counter0;
        goto ex2_seq1;
    else
        goto ex2_seq1;
    endif

state ex2_seq2:
    if (u_ex_top/u_sub/count_ro == 4'h6) then
        goto ex2_seq3;
    else
        goto ex2_seq2;
    endif

state ex2_seq3:
    if (u_ex_top/u_sub/count_ha == 4'hd) then
        trigger;
    else
        goto ex2_seq3;
    endif

実動作

出典:Vivado™ 2020.2.2 Hardware Manager hw_ila_1画面(参照 2023/09/22)

例③ 3つの値を順番に待つが、指定の値があったらやり直し

条件

3つのカウンタの値が次の順番で一致したらトリガーを実行します。
ただし、特定の値が途中にあったら初めからやり直しをします。

トリガー設定内容

左右にスクロールしてご覧ください
state ex3_seq1:
    if (u_ex_top/u_sub/count_i == 4'h1) then
        goto ex3_seq2;
    else
        goto ex3_seq1;
    endif

state ex3_seq2:
    if (u_ex_top/u_sub/count_ro == 4'h7) then
        goto ex3_seq3;
    elseif (u_ex_top/u_sub/count_ro == 4'h4) then
        goto ex3_seq1;
    else
        goto ex3_seq2;
    endif

state ex3_seq3:
    if (u_ex_top/u_sub/count_ha == 4'ha) then
        trigger;
    elseif (u_ex_top/u_sub/count_ha == 4'h8) then
        goto ex3_seq1;
    else
        goto ex3_seq3;
    endif

実動作

出典:Vivado™ 2020.2.2 Hardware Manager hw_ila_1画面(参照 2023/09/22)

例④ 遅延トリガー

条件

flag_ni = High に遷移してから4サイクル後にトリガーを実行します。

トリガー設定内容

左右にスクロールしてご覧ください
state ex4_seq1:
    if (u_ex_top/u_sub/flag_ni == 1'br) then
        increment_counter $counter0;
        goto ex4_seq2;
    else
        goto ex4_seq1;
    endif

state ex4_seq2:
    if ($counter0 == 16'h00_04) then
        trigger;
    else
        increment_counter $counter0;
        goto ex4_seq2;
    endif

実動作

出典:Vivado™ 2020.2.2 Hardware Manager hw_ila_1画面(参照 2023/09/22)

いかがでしたでしょうか。
Advanced trigger を使うと複雑な条件でのトリガーが実行できることをご確認いただけたと思います。

最後までご覧いただきましてありがとうございました!
これからもTECHブログを通じて、皆様の設計にお役立てできればと思います。
次回のブログもどうぞよろしくお願いいたします。


弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。

設計受託・ODMの概要については
こちら

FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。

FPGAの活用・設計検討の
お問い合わせはこちら

このブログのシリーズ

関連ブログ