Avalon-MM設計時に注意すること

FPGA

Quartus IIでシステムを作成する場合、Qsysを使うのが一般的です。そして、Qsysに独自のモジュールを追加するときのインターフェース・プロトコルはAvalonです。特に、マスタ・モジュールではAvalon-MM( Avalon Memory Mapped Interface)が多く用いられます。
マスタ・モジュールは、自分自身でバス・リクエストを発生してメモリなどのシステム・リソースをアクセスするモジュールです。例えば、LCDコントローラなどはマスタ・モジュールです。

Avalon-MMのリードアクセス例

Avalon-MMのリードアクセス例

Avalon-MMの仕様はとてもシンプルです。他のバス仕様のように(なぜこんな仕様にしたのだろうと)理解に苦しむ部分がありません。ただ、一つだけ気を付けないといけないことがあります。それはリード時のバイト・イネーブルの扱いです。

Avalon-MMでリード時はバイト・イネーブルをすべて有効にする

「バイト・イネーブルが関係あるのはライトの時だけじゃない?」と思わないでしょうか。僕はそう思いました。しかし、実際にはそうではありませんでした。少なくともQsysではバイト・イネーブルが0になっていると期待したリード・データがアクセス先から戻ってきません。Avalonの仕様というよりも、QsysのAvalonバスインターコネクトの仕様かもしれません。

実際の例

正しいリード・アクセス

バイト・イネーブルが有効

バイト・イネーブルが有効

バイト・イネーブルをすべて1にした時の32ビット・バスのリードアクセスです。期待したデータ(cdcdcdcd)がリードできています。

誤ったリード・アクセス

バイト・イネーブルが無効

バイト・イネーブルが無効

バイト・イネーブルをすべて0にした時の32ビット・バスのリードアクセスです。リードしたデータが正しくありません(fd36fd36)。そもそも、リード・コマンドからリード・データのまでのレイテンシが異常に短いです。メモリ・アクセス自体が行われていないことがわかります。

結論

Avalon-MMでリード時はバイト・イネーブルに注意。すべてイネーブルにしておけば間違いがない。

タイトルとURLをコピーしました