はじめに
フィルタやパケットなど、ストリームデータを扱うモジュールを開発するにあたって、インターフェースはなやみどころ。
クロックbyクロックのパラレルインターフェースならラッチするだけで悩みはないのですが、パケットのようなバースト伝送や、非同期サンプリングを行うモジュールでは、有効データが間歇的になります。パケット処理など一旦キューに蓄積しバッチ型の処理を行う場合には、ハンドシェークも必要です。
いろいろ設計してきましたが、個別設計では間違いを起こしやすいので、定番のAXI-Streamを使うためいろいろ試したメモです。
信号構成
フロー制御を行うため、CLOCK,DATA,VALIDに加えて、READY,LASTを追加することにしました。
出力側(Master)の動作
1)データが完成したら、データ出力と共にVALIDをアサート
2)クロックのエッジで、READYを検査しアサートされていれば、(取り込めるといっているので)出力処理完了。(可能なら)データを更新し連続出力。
そうでなければ、データとVALIDをホールド
3)LASTは適宜
受信側(Slave)の動作
Clock by Clockで連続受信したい場合
1)連続受信の準備ができたらReadyをアサート
2)クロックのエッジでvalidであればラッチ
受信途中で停止する場合
1)Readyをデアサートしておく
2)データ取り込んだらReadyをアサート
まとめ
Ready信号を受信確認(ACK)と考えると失敗します。
Valid信号は"Here you are." Ready信号は"Next Data please!"という感じでしょうか。