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

TECHブログ

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

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

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

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

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

目次

はじめに

いろいろ探したのですが、前回お伝えしたLanguage TemplatesやUG908以外に詳しい資料などは公開されていないようです。
そのため、これらの資料から筆者が調査した範囲での説明となりますので、あらかじめご了承ください。

また、条件はあまり複雑なものには対応できないようです。
記述した条件が有効なのかはコンパイルを行いエラーが無ければOK、
エラーメッセージが表示された場合にはその内容をご確認いただき、修正してください。

記述前提

Language TemplatesやUG908に記載されている説明内容を簡単にまとめると、次のようになります。

  • 条件をステートとして設定し、16段まで設定可能
  • ひとつのステートに設定できる条件分岐は、「if ~ elseif ~ else ~」の最大3つまで
  • 条件には観測している信号の他に16bitのアップカウンタが4つまで使用可能
  • 状態監視用に4つのフラグが使用可能 ※フラグは条件には使用できない
  • 大文字・小文字の区別はない

演算子

論理演算で使用できるのは次の2つ

&&
||

値の比較で使用できるのは次の6つ

==
!=
>
>=
<
<=

カウンタの比較で使用できるのは次の2つ

==
!=

表現できる進数は次の3つ

'h <hex>
'b <binary>
'u <integer>

数値は、0~Fの数と、X(Don't care)、R(立ち上がり)、F(立ち下がり)、B(両エッジ)、N(変化なし)。
数字の区切りとして _(アンダースコア)が使えるようです。

B、N はhexとbinaryの両方で使用できます。
X、R、F はbinaryで使用できます。

カウンタとフラグ

カウンタとフラグは名称が決まっているので、そのまま使用します。

$COUNTER0
$COUNTER1
$COUNTER2
$COUNTER3
$FLAG0
$FLAG1
$FLAG2
$FLAG3

カウンタの制御には次の2つがあります。

INCREMENT_COUNTER <インクリメント>
RESET_COUNTER <クリア>

フラグの制御には次の2つがあります。

SET_FLAG <セット>
CLEAR_FLAG <クリア>

記述例

記述例を示します。

左右にスクロールしてご覧ください
# #はコメント文
# ステートに条件を書いていきます
# ラベル hogeという1つめのステート。ラベルの最後には:(コロン)
state hoge:
    # 信号名 u_top/u_sub/boo が立ち上がったら
    if (u_top/u_sub/boo == 1'bR) then
        # フラグ0番のセット
        SET_FLAG $FLAG0;
        # mogeという名前のステートに移動
        # 動作の最後には;(セミコロン)
        goto moge;
    else
        # フラグ0番とカウンタ0番のクリア
        # 実際はRun triggerを行った際にクリアされるようなので、
        # 条件の最初方にこのようなクリア記述は不要です
        CLEAR_FLAG $FLAG0;
        RESET_COUNTER $COUNTER0;
        # 条件不成立の場合も行き先を記述する必要があるようです
        goto hoge;
    endif

# ラベル mogeという2つめのステート
state moge:
    # 信号名 u_top/u_sub/foo が立ち下がって且つ、カウンタ0番が0x4ならば
    if ((u_top/u_sub/foo == 1'bF) && ($COUNTER0 == 16'h0004)) then
        CLEAR_FLAG $FLAG0;
        RESET_COUNTER $COUNTER0;
        # トリガー実行
        trigger;
    # 信号名 u_top/u_sub/foo が立ち下がったら
    elseif (u_top/u_sub/foo == 1'bF) then
        # カウンタ0番をインクリメント
        INCREMENT_COUNTER $COUNTER0;
        goto moge;
    else
        goto moge;
    endif

いかがでしたでしょうか。
記述に関してはHDLに似ているため、さほど難しくはないと思います。
次回は記述した内容でトリガーがかかるか実践してみたいと思います。

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


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

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

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

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

このブログのシリーズ

関連ブログ