Avalon-MMスレーブとWISHBONEの変換

OpenCoresではWISHBONEバスというインターフェース・プロトコルの使用が奨励されており、 また、実際にWISHBONEバスが多く使われています。このため、OpenCoresのIPコアをQuartus II(Prime)のQsysにモジュールとして登録するには、WISHBONEバスをAvalon-MMに変換する必要があります。(もちろん、Qsysにモジュールとして登録しないで利用する方法もありますが)。

具体的な例

例えば、OpenCoresのUSBホストIPコア(USB 1.1 Host and Function IP core)をQsysにモジュールとして登録するには、Avalon-MMスレーブの変換回路が必要です。

USB Host IPコアの例

USB Host IPコアの例

Avalon-MMスレーブとWISHBONEバスの変換

次のタイミングチャートは、Avalon-MMスレーブとWISHBONEバスの変換例です。上半分がAvalon MMスレーブ、下半分がWISHBONEバスの信号です。動作としては、Avalon-MMスレーブからシングルのリード・アクセスとライト・アクセスを連続して行っています。バス・プロトコル変換のポイントは、

  • ストローブ信号
  • アドレス
  • データ・バス幅
  • アクノリッジ信号

の4つです。

Avalon-MM SlaveとWISHBONE BUSの変換

Avalon-MM SlaveとWISHBONEバスの変換

1.ストローブ信号の変換

Avalon-MMは、リード時とライト時のストローブ信号が分かれています(i_av_rとi_av_w)。一方、WISHBONE バスはリード/ライトでストローブ信号は共通です(strobe_i)。WISHBONEバスでは、ストローブが共通のため、その種別を表す信号we_iが必要になります。we_iは、Avalon-MMのi_av_wがそのまま利用できます。具体的なVerilogコードは、次のようになります。

2.アドレスの変換

OpenCoresのIPコアは、インターフェースが同じWISHBONEバスであっても、データバス幅やアドレスの扱いは異なります。例えば、データバス幅は、8ビットもあれば、32ビットもあります。アドレスの扱いも統一されていません。例えば、32ビットのデータバス幅では、本来バイト/ハーフワードの信号(アドレスの下位2ビット)は情報としては不要ですが、IPコアによってその扱いはまちまちです。USB ホスト IPコアの場合は、8ビットデータバス幅のWISHBONEバスです。このため、Avalon-MM側のバイトイネーブル信号をWISHBONEバスの下位2ビットに追加する必要があります。具体的なVerilogコードは次のとおりです。

このような変換がわずらわしい場合は、32ビットのデータバスの上位24ビットを無効フィールドとして、Avalon-MMのデータバスの下位8ビットに直接マッピングする方法もあります。

3.データ・バス幅の変換

Avalon-MMスレーブ側が32ビット、WISHBONEバス側が8ビットの場合、バス幅の変換を行う必要があります。ライト・データは、Avalon-MMスレーブ側のアドレスの下位2ビットの値に応じて、32ビットから8ビットを選択してWISHBONEバス側のライトデータとします。一方のリードデータは、WISHBONEバス側の8ビットを単純に4回並べて32ビットに変換します。具体的なVerilogコードは次のとおりです。

4.アクノリッジ信号の変換

Avalon-MMスレーブ側のアクノリッジ信号o_av_waitは、次のような論理になります。

  • 通常状態(IDLE状態)ではLレベル
  • i_av_rまたはi_av_wがHレベルになると、ウェイト状態(Hレベル)になって、WISHBONEバス側の応答を待つ
  • WISHBONEバス側のアクノリッジ信号(ack_o)を認識するとLレベルになる

具体的なVerilogコードは次のとおりです。

全コード

実際には、タイミングに余裕を持たせるために、Avalon-MMからのアクセスを一度サンプリングしています。

スポンサーリンク
広告大
広告大
  • このエントリーをはてなブックマークに追加
スポンサーリンク
広告大