AXI Stream

AXI Stream

 

仕様

OV7670からの画像データをVDMA IPやAXI Stream To Video Out IPに渡すには、AXI4-Streams I/Fを使う必要がある。ここでは、AXI4-Streams I/Fの仕様とAXI4-Streams VIPの使い方についてまとめる。

信号一覧

ビデオ信号系としてAXI4-Streams I/Fを使用する場合、必須信号は下記の4つのみと簡単な通信プロトコルである。

信号名 信号ソース   信号の役割
TDATA Master 必須 ストリームデータ
バイト単位
TVALID Master 必須 Valid信号
Master が有効な転送を送っていることを示す。
TVALIDとTREADYが1の時が有効なデータ転送。
TREADY Slave 必須 Ready信号
Slave がデータ受信できる状態であることを示す 。
TUSER Master 必須 先頭フレーム信号:SOF
・フレーム最初のピクセルを示す信号
TLAST Master 必須 最終ライン了信号:EOL
ライン最後のピクセルを示す信号

タイミングチャート

  • マスター側の設計注意事項
    • VALID信号とREADY信号の両方ともにHighのときに次のデータを送ること。
    • VALID信号の条件にREADY信号は不要。READY信号を待っているとデッドロックする。
    • SOF(TUSER)信号およびEOL(TLAST)信号は転送データと一致させること

タイミングチャート

IP

ここにも紹介されているが、AXI Stream 関係のIPはたくさんある。 現時点で使う可能性があるIPのみ簡単に説明する。

AXI4-Stream Subset Converter

AXI4-Stream I/Fはほとんどがオプション信号なので、IPコアによって使用する信号が異なる。AXI4-Stream Subset ConverterはIPコア間の信号の違いを吸収し、IPコア間を正しく接続する役割を担っている。

AXI4-Stream Subset Converterの設定画面を下図に示す。DATA、TUSER、TSTRB、TKEEP、TID、TDEST、TLAST 信号のリマップや信号の追加が可能、ストーリデータの並び替えなどができる。

Subset Converter 設定

AXI4-Stream VIP

AXI4-Stream VIP(Verification IP)はAXI Stream I/F を持ったIPコアを検証するときに役立つIPコアである。使い方はここに記載されているので、この記事で不足している場合は参照すること。

使い方

VIPを使うためには、Vivado IPI上で VIPの配置・設定し、テストベンチを作成する。という流れである。VIPはSystemVerilogにて作成されているため、パッケージのインポート、newを使ったインスタンス生成など少し変わった記述である。

Vivado IPI
  • IPI上にAXI4-Stream VIPを配置し、テスト対象と接続する
    IPI上で Add IP > AXI4-Stream VIPを選択し、画面上にAXI4-Stream VIPを配置する。VIPにテスト対象のIPコアを接続する。今回は作成中のOV7670 IPをテスト対象IPとする。

ブロック図

  • VIPの動作モードを設定する
    VIPはスレーブとして動作するよう設定する。IPI上での設定は以上で終了である。次にテストベンチを記述する。
テストベンチ
  • AXI4-Stream VIPを使用するためにパッケージをインポート
    注意:IPの階層に注意すること。
// ---- Import packege ---- //
    // AXI4 Stream VIP packege
    import  axi4stream_vip_pkg::*;
    // AXI4 Stream VIP placed in block design
    import BlockDesign_axi4stream_vip_0_0_pkg::*;
  • VIPエージェントの宣言
    注意:マスターの場合はcomponent_name"_mst_t mst_agent、スレーブの場合は"component_name"_slv_t slv_agent*とすること
    // Declare AXI4 Stream VIP agent
    BlockDesign_axi4stream_vip_0_0_slv_t  slv_agent;
  • VIPエージェントをインスタンス生成し、I/F までの階層を引数として渡す
        slv_agent = new("slave vip agent",BlockDesign_wrapper_u.BlockDesign_i.axi4stream_vip.inst.IF);
  • エージェントを開始させる
        //Start the agent
        slv_agent.start_slave();

以上で終了である。上手く動作するとTREADY信号がパタパタ切り替わる。

VIP設定画面

参考サイト