Xilinx Vivadoをマスターする: 統合ロジック・アナライザ(ILA)とバーチャル入出力(VIO)によるデバッグ
このチュートリアルでは、Xilinx Vivadoの統合ロジック・アナライザ(ILA)とバーチャル入出力(VIO)コアを使用して、VHDL設計をオンチップでデバッグおよび監視する方法を説明します。この記事を読み終える頃には、外部機器を使わずにプローブの挿入、トリガーの設定、正確な信号動作の取得ができるようになります。
概要
この記事ではVivadoのスクリーンショットを参照しています。各画像をクリックすると拡大表示されます。 サイドバーまたはモバイル用のポップアップナビゲーションを使用して、目的のセクションに素早くアクセスできます。
ILAとVIO
ILA IPを使用すると、内部FPGA信号をリアルタイムでプローブできます。一方、VIO IPを使用すると、Vivadoから内部信号を駆動できます。どちらも無料で、高度に設定可能であり、Vivadoワークフローにシームレスに統合されます。
- Xilinx IP: 統合ロジック・アナライザ(ILA)
- Xilinx IP: バーチャル入出力(VIO)
必要なもの
- Xilinx FPGAボード
- Vivado Design Suite(2020.2以降)
- 基本的なVHDLの知識
例ではKintex-7 KC705評価キットを使用していますが、手順は最新のXilinx FPGAであればどれにも適用可能です。
サンプル・プロジェクトのダウンロード
サンプル設計とVHDLファイルを含むZIPファイルをダウンロードしてください。Vivadoでila_tutorial.xprを開いて設計を調べるか、続きを読んでスクラッチから作成してみてください。
Vivadoでプロジェクトを作成する
Vivadoを起動し、ウェルカム画面でCreate Projectをクリックします。
ウィザードに従って進めます。プロジェクト名をila_tutorial(スペースなし)に設定し、RTL Projectを選択、ソースとしてcounter.vhdlとcounter_top.vhdlを追加します。Copy sources into projectを有効にして続行します。
制約ファイルtop.xdcを追加し、プロジェクトにコピーします。クロックとLEDのピンを使用ボードに合わせて調整し、正しいクロック周期を設定します。
リストから使用ボードを選択し、Finishをクリックしてプロジェクトを開きます。
設計例の概要
この例は、連鎖した2つの4ビット・カウンターで構成されます。counter.vhdlは、イネーブル時にインクリメントし、カウント値が12から15の間で1ビットのtrigger出力をアサートするカウンターを実装しています。
エンティティ宣言:
---------------------------------------------------------------------------- -- エンティティ宣言 ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- メイン・クロック reset : IN STD_LOGIC; -- リセット、アクティブ・ハイ enable : IN STD_LOGIC; -- 次のカウンターをイネーブル trigger : OUT STD_LOGIC -- 次のカウンターをトリガー ); END ENTITY;
内部信号:
count- 4ビットのカウンター値trigger_o-trigger出力に接続される中間信号
属性の使用(後で説明):
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
順序ロジック:
seq_proc: PROCESS (reset, clk) BEGIN -- for seq_proc IF (reset = '1') THEN count <= (OTHERS => '0'); trigger_o <= '0'; ELSIF rising_edge(clk) THEN IF (enable = '1') THEN count <= count + 1; IF (count > x"B" AND count <= x"F") THEN trigger_o <= '1'; ELSE trigger_o <= '0'; END IF; END IF; END IF; END PROCESS;
counter_top.vhdlは2つのカウンターをインスタンス化します。counter_1_instは常にイネーブルされ、そのtrigger出力でcounter_2_instをクロックします。したがって、counter_2_instはcounter_1_instの16サイクルごとに4回だけインクリメントされます。
リセット用VIOコアの作成
設計のreset入力を駆動するVIOを生成し、Vivadoから手動でトグルできるようにします。
IP Catalogを開き、VIOで検索し、VIO (Virtual Input/Output)をダブルクリック、vio_resetにリネームします。Input Probe Countを0、Output Probe Countを1に設定します。
出力プローブを設定: 幅=1、初期値=0x1、次にOKとGenerateをクリック。
合成後、counter_top.vhdlでコンポーネントを宣言してインスタンス化します。再合成前にflatten_hierarchyをNoneに設定するのを忘れないでください。
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
デバッグ・プローブの挿入
信号をプローブするには3つの方法があります:
- VHDLソースから(
MARK_DEBUG属性経由) - ネットリストまたは回路図から(右クリックでMark Debug)
- XDC/TCLファイルから(ここでは扱いません)
VHDLソースからの挿入
ファイルごとに1回MARK_DEBUG属性を宣言し、目的の信号に適用します:
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
合成済み設計では、countが虫アイコン付きでUnassigned Debug Netsに表示されます。
ネットリストからの挿入
NetlistまたはSchematicに移動し、triggerネットを見つけて右クリック、両方のカウンターでMark Debugを選択します。
ILAデバッグ・コアの作成
IP CatalogからSet Up Debugを開きます。Vivadoがすべてのデバッグ・ネットとクロック・ドメインをリストアップします。このチュートリアルでは4つすべての信号を保持します。
ILAのFIFO深度を設定(1024で十分)、Capture controlを有効化。ウィザードを完了すると、VivadoがILAコアと制約ファイルを生成します。
制約をila_core.xdcとして保存。このファイルはデバッグ属性を適用し、ILAコアを作成し、各プローブを設定し、コアをVivadoに接続するdbg_hubをインスタンス化します。ハブのクロック周波数を設計に合わせて更新してください。
再合成、実装、ビットストリーム生成を実行。ハードウェア・マネージャーを開き、自動接続してデバイスをプログラミングし、.ltxプローブ・ファイルも一緒に読み込みます。
ILAトリガーの設定
プログラミング後、ILAダッシュボードが表示されます。VIOタブを有効化し、不要なウィンドウを削除。resetプローブをVIOに追加して、取得中にトグルできるようにします。
counter_1_inst/triggerに立上がりエッジ条件、プリトリガー・ウィンドウ32サンプルでトリガーを設定します。
単一トリガーでのILA実行
トリガーをアーム(ステータスがwaiting for triggerに変化)し、resetを0にトグル。トリガーが発火すると、ILAはイベント前の32サンプルを記録し、FIFOが満杯になるまで継続します。
ズームアウトするとcounter_2_instの動作も確認できます。
複数トリガーでのILA実行
複雑なシナリオでは、複数のトリガーを連鎖させます。例: counter_1_inst/count == 9かつcounter_2_inst/count > 2でトリガーし、FIFOを4つのウィンドウに分割。
自動再トリガー・モード
Auto re-triggerを有効化して、散発的または高頻度で発生するイベントを取得。単一トリガーを設定し、FIFO深度を指定してコアをアームします。
キャプチャ・モード
キャプチャ・モードでは、グローバル条件を満たすサンプルのみを記録。例: counter_1_inst/trigger == 1かつcounter_2_inst/trigger == 0が同時に真の場合に取得。
結論
ILAとVIOは、オンチップ・デバッグのための強力かつ無料のツールです。プローブ、複数トリガー、キャプチャ・モードを活用することで、複雑なFPGA設計をVivadoから直接、精密に監視および制御できます。
VHDL
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- RightHand RoboticsとElement Logic、統合ロボットピースピッキングシステムを発表
- 広がるクラウドの地平:新ゾーン、コンテナ、マルチクラウド戦略
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター
- C++入出力完全ガイド:cin/coutの基本から複数入力まで
- C言語入出力(I/O)マスター:scanf()とprintf()徹底解説
- C言語の入出力マスター:標準関数とファイル操作
- VHDLとVerilogのマスター:クリーンな組み合わせ・順序ロジックの書き方
- Dラッチ完全マスター:設計、動作原理、フリップフロップとの違い
- Python I/Oとモジュールインポート完全マスター: 実践ガイド
- Java入出力をマスター:表示、読み取り、データフォーマット