« 2019年5月 | トップページ | 2019年7月 »

2019.06.11

AXI Stream to MMで画像生成

AXI Stream to DDR3 SDRAMの最終的な構造はこのようになりました。

Axi_dma_system

DDR3メモリに書き込んだテスト画像をUSB3.0でPCに取り込みます。

まずは水平グラデーション。

Yoko

それから垂直グラデーション

Tate

斜めのグラデーション。

Naname

すべてうまくいきました。

| | コメント (0)

2019.06.10

AXI Stream to MMにFIFOを入れた

昨日の記事では、AXI DataMoverでAXI StreamをDDR3メモリに転送することはできましたが、MIG(と、その手前にあるInterConnect)がTREADYを下げてくるので、データを出すだけの単純なAXI4 Streamだと対処できませんでした。

そこで、Streamのソースと、AXI DataMoverの間にAXI FIFOを入れることにしました。

VivadoのIP IntegratorでAXI FIFOを探すと3種類くらい出てきますが、使用したのは「AXI4-Stream Data FIFO」です。

出来上がったデータパスの全体構成はこんな感じです。

Axi_fifo_dm

FIFOの設定は以下のとおりです。

Fifo_2

Fifo_1

 

これで動かしてみると、TREADYは相変わらず下がっていますが・・・

Axi_dmin

 

AXI Streamのソースは、データを止めることなく出し続けることができるようになりました。

FIFOの残数を見ると_/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\__という動きをしているのがわかります。

Axis_src

 

次の図は、AXI DataMoverの後ろのAXI Interconnectの部分です。綺麗にトランザクションが発行されています。

Burst

ステータスも正常に返ってきています。15とか出ているので一瞬驚きましたが、TVALIDのときには85なので大丈夫でした。

Axi_sts

転送の全体です。DDR3が相手なので最初や最後の部分で少し乱れていますが、問題なく転送できました。

Axi_mm

このように、AXI DataMoverの前にFIFOを入れると、AXI Streamのソースは単純に出すだけのタイプで良くなるので楽に作れるようになります。

| | コメント (0)

2019.06.09

XILINXのAXI DataMoverを使う

XILINXのAXI DataMoverというのを使うと、AXI StreamからDDR3メモリへのデータ転送が簡単にできるようです。

今回はStreamからMemory Mapへの書き込みをしたいのでS2MMというモードで作ってみます。

Axi_datamover

S_AXIS_S2MMにAXI Streamを入れるとM_AXI_S2MMからFull AXIが出てきてDDR3メモリなどに接続できるという優れもののコアのようです。

S_AXIS_S2MM_CMDというのがコマンドを与えるポートで、これ自体もAXI Streamでできています。

下の図ような72bitのコマンドを与えて、tvalidを1にします。

Command_layout

  • BTTが転送したいバイトサイズ(1~8388607)
  • Typeは0だとアドレス固定、1だとアドレスが増えていく
  • DRRとDSAはMM2Sで使うらしく、今回は調べていない
  • EOFはMM2Sで最後の転送のときに1にしておくとTLASTを立ててくれる
  • SADDRは転送先アドレス
  • TAGはAXIのパケットに付ける目印のタグ
  • RSVDは0
  • xUSERとxCACHEはとりあえず存在しない

となっています。

実際に下の図のようなデザインを作り、XILINXのIPであるVIOを使ってトリガやパラメータを与え、ILAで波形を取ってみました。

Design

TAGが5、SADDRは0、BTT(転送バイト数)が0x20のコマンドを与えました。下の波形はコマンド用AXI Streamの波形です。

Axis_wrcmd_16byte

その後、データポートのAXI Streamに8ワード(32バイト)のデータを与えます。

Axis_wr_16byte

AXI MMのポートからは以下のような信号が出てきました。これはごく普通のAXIの転送です。

Axis_wraxi_16byte

最後にSTSというAXI Streamのポートに返ってきたステータスを確認しますが、今回はIBTTモード(転送サイズを途中で打ち切ることができるモード)を使っているので、ステータスは32bitの幅があります。

Ibttstatus

波形は以下のとおりです。1クロック分しか出てこないのでロジアナで読みにくいですね。

Axis_wrsts_16byte

値は0x80002085で、EOP(End of Packe)とOkayフラグが立ち、転送したバイトサイズは0x20のようです。

確かにAXI StreamからAXI MMへのデータ転送は簡単にできそうです。

が、大事なことを見落としていました。それは、AXI DataMoverがTREADYを0に下げることがあるということです。S2MMの先が詰まっているときや、転送の始まりの部分ではTREADYがいったん0に下がります。

そうすると、AXI Streamのデータソースはデータの送信をいったん中止しなければなりません。データソースは普通、ADCや画像だったりするので止められないですね。

だから、ADCや画像データをそのままAXI S2MMにつないでDDR3に格納するのは無理がありそうです。間にFIFOを一回挟まなければならなさそうです。

<追記>

 

続きを読む "XILINXのAXI DataMoverを使う"

| | コメント (0)

« 2019年5月 | トップページ | 2019年7月 »