AXI4-Stream

最も一般的に使われているAXI4バスは、AXI4-Streamです。これは、3種類ある中で最も実装が簡単なAXIバスです。

本記事では、AXI4-Streamについて解説していきます。

目次

AXI4-Stream概要

AXI4-Streamはストリームマスターからストリームスレーブにストリーム(連続的な)データを転送するために使用します。ストリーミングプロトコルのため、データストリームに関連したアドレス指定はありません。そのため、データは連続的なデータであることが想定されます。音声や画像、AD変換値などのデータ転送によく使われます。

AXI4-Streamはマスターがデータが有効であることを示す信号Valid、スレーブが受信準備が完了していることを示すReady信号の2つで、実際のデータ信号であるDataをやり取りするという単純な制御です。

AXI4-Streamプロトコルでは、フレームのやり取りも可能で、そのフレームの終端であることを示す信号を使用して、データをひとまとまりとしてのフレームとして扱うことが可能です。

実際には下図のような、信号名で定義されています。データが有効であることを示すTVALID, データ信号を表すTDATA, スレーブが受信準備完了を示すTREADY信号を表します。

AXI4-Stream インタフェース

AMBAで規定されている、信号リストは以下です。AMBAで示されているものの日本語訳を乗せています。

信号名ソース説明
ACLKClock Sourceグローバルクロック信号
すべての信号はACLKの立ち上がりでサンプリングされる
ARESETnReset Sourceグローバルリセット信号
ARESETnはアクティブLOW
TVALIDMasterMasterからの転送が有効であることを示す
転送は、TVALIDとTREADYの両方がアサートされたときに行われる
TREADYSlaveTREADYは、Slaveが現在のクロックサイクルで転送を受信可能状態を示す
TDATAMasterTDATAは、データを提供するために使用される主要なペイロード
ペイロードデータの幅は、整数バイト数
TSTRBMasterTSTRB は、TDATA の関連バイトの内容がデータバイトとして処理されるか、位置バイトとして処理されるかを示すバイト修飾子である
TKEEPMasterTKEEP は、TDATA の関連バイトの内容がデータ ストリームの一部として処理されるかどうかを示すバイト修飾子
TKEEP バイト修飾子がアサート解除された関連バイトは null バイトであり、データ ストリームから削除できる
TLASTMasterTLAST はパケットの境界を示す
TIDMasterTID は、異なるデータ ストリームを示すデータ ストリーム識別子
TDESTMasterTDEST はデータ ストリームのルーティング情報を提供する
TUSERMasterTUSER は、データ ストリームと一緒に送信できるユーザー定義のサイドバンド情報

分かりづらいものもあるかもしれませんので、もう少し噛み砕いたものが下記のリストです。

信号名ソース役割
ACLKClock Sourceクロック信号
ARESETnReset Sourceリセット信号
TVALIDMasterTDATAが有効であることを示す
TREADYSlaveSlaveが受信可能であることを示す
TDATAMaster転送されるデータそのもの
TSTRBMaster各バイトの有効かを示す
TKEEPMaster有効なバイトを示す
TLASTMasterパケットの終了を示す
TIDMasterパケットの識別子(ID)を示す
TDESTMasterデータの送信先
TUSERMasterユーザ定義

この中で、TID, TDEST, TUSERはほとんどのアプリケーションで使われることがないので、省略することができます。

TSTRBとTKEEP

TSTRBとTKEEPは、データワードのどのバイトが有効であるかをスレーブに知らせるための信号です。

どちらもバイトの有効性を示すことで使われますが、用途が異なります。

信号役割ビット幅ビット設定用途
TSTRB転送するバイトが有効かどうかを示す通常、データバスのビット幅に依存し、
データバスが32ビット(4バイト)の場合、TKEEPは4ビット
1: 有効
0: 無効
パケットの最後のデータ転送(EoP: End of Packet)で、部分的なバイトのみが有効な場合に使用
TKEEPメモリマップドインタフェース(AXI4など)において、
どのバイトが実際に書き込まれるべきかを示す
データバスのビット幅に依存1: 有効で書き込み対象
0: 無効
部分的なバイトアクセスや、特定のバイトのみを書き込みたい場合に使用

例:TKEEP

データバスが32ビット(4バイト)の場合、TKEEP = 4'b1100 のとき、上位2バイトが有効で下位2バイトが無効となります。

例:TSTRB

データバスが32ビット(4バイト)の場合、TSTRB = 4'b0011 のとき、下位2バイトのみが書き込み対象となります。

ハンドシェーク

マスター・スレーブ間がどのように信号のやり取りを行うのかを見ていきます。

このやりとりは、マスターから送信するValid, スレーブから送信するReadyでハンドシェークすることで実現します。このハンドシェークは3つの種類があり、それぞれを順に見ていきます。

Valid/Ready 同時

マスター, スレーブの両方が同時にデータ転送の準備をできる場合を考えます。TVALIDは、マスターが転送する有効なデータがあることを示す信号で、TREADYは、スレーブがデータを受信する準備ができていることを示す信号です。

Valid/Ready 同時型のハンドシェークでは、マスターがTVALIDをアサートして、有効なデータをバスに転送し、同時にスレーブがTREADYをアサートします。TVALIDとTREADYの両方がアサートされている限り、データはバス上で転送されています。

Valid先行

2つ目は、スレーブのデータ受信準備ができる前に、マスターの準備が整う場合です。これをValid先行型と呼び、この場合、マスターはデータ転送と同時にTVALIDをアサートします。しかし、このタイミングではまだスレーブの準備はできていないため、データは保持され、スレーブがTREADYをアサートしたタイミングでデータ転送が開始されます。

スレーブは必要に応じて、TREADYをディアサートできます。スレーブが受信可能な状態でない限り、マスターは次のデータを送ることはできません。

Ready先行

3つ目は、マスターがデータ送信の準備が整う前に、スレーブの準備が整うような場合、Ready信号が先にアサートされるため、Ready先行型と呼びます。

この場合、スレーブ側は、データ受信可能である限り、TREADYをアサートし続けます。スレーブが受信可能でない場合、TREADYをディアサートします。

ハンドシェーク実装の注意点

ハンドシェークを実装する場合、2つのことに注意します。

  1. スレーブがREADYをアサートしているかどうかに関わらず、マスターはデータが有効である場合はTVALIDをアサートする
  2. スレーブはマスターがTVALIDをアサートしているかどうかに関わらず、データ受信可能なら、TREADYをアサートする

これを念頭に置いて、マスター側、スレーブ側は実装を進める必要があります。

例えば、スレーブはマスターがTVALIDがアサートするまでは待機、マスターもスレーブがTREADYをアサートまで待機するような実装をしていたとします。この場合、どちらも待ち状態になり、バスが止まってしまいます。

したがって、マスターもスレーブもデータ送信・受信の準備が可能なら、TVALID, TREADYをアサートするという設計をすることです。通信側を待つような処理は入れる必要はないということです。

TLAST

TLASTは、TDATAによって、送信されるデータのフレームあるいはパケットの最後であることを示します。

これは、例えば4バイトのデータをひとまとまりとして扱いたいときに使用します。4バイト目を送信するときに、TLASTをアサートし、最後のデータであることを示します。

まとめ

本記事では、AXI4バスの中の1つの、AXI4-Streamバスについて解説しました。

このバスは主に音声・画像、AD変換値などのストリーミングデータに使用します。

マスター・スレーブ側で送受信可能であることを示す、TREADY, TVALIDを使いハンドシェークしデータ通信を行います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次