e-tipsmemo

ごった煮

AXI Stream from BRAM

VivadoのIPコアはたくさんあって便利だけども
シンプルな機能を求めるときには、
調べるの面倒とか、微妙に思っていたのと違うと感じることが多々あった気がするので、
仕方ないので自分で書いたものをメモ

BRAM IFにつなげて同じ幅のAXI Streamで連続データを出してくれるようなシンプルなもの。
(DACとかを想定している)

BRAMの出力は遅延を最小にしても1クロック遅く出てくるので、
treadyが下がった時にBRAMへのアドレスを一つ戻す必要があるっぽい。
参考
How to make an AXI FIFO in block RAM using the ready/valid handshake - VHDLwhiz

コード

雑に書いたので使ってないwireが残っている上にコードが見にくい。
いつか綺麗にするかもしれない。

Block Diagramに配置

f:id:katakanan:20210121233953p:plain

BRAMを介して、AXIからAXISに変換するついでに幅も変換する
PORTAからはAXI Liteアクセスにしているので32bit幅固定

f:id:katakanan:20210121234432p:plain
遅延するようなオプションは全部オフ。
バッファーが必要そうならAXI4-Stream Register Sliceを使うといい気がする。

テストベンチ

AXI Streamを受信するところ

tready & tvalidがデータ有効の時でこの時クロックが上がればデータをキャプチャしていることになるので、カウンタjをインクリメントし、10個受信したらtreadyが下がる。


treadyが下がった後で最速でも1クロック後に受信可能になった場合のシミュレーション。

f:id:katakanan:20210122135725p:plain
よさそう
こういうのもChiselで簡単に書けるのだろうか?