ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Wishbone のバスサイクル

Wishbone のバスサイクルをまとめました。一次資料はここからダウンロードできます。翻訳じゃないので、実際に使うときは規格書読んでください。
http://opencores.org/opencores,wishbone
現在の最新版は、 Revision B4 です。

転送サイクルの開始

  • MASTERは、[CYC_O]をアサートして転送サイクルを開始する。
  • SLAVEは[CYC_O]がアサートされている時のみレスポンスを返す。

ハンドシェイクプロトコル

  • MASTERは、転送を開始するときに[CYC_O]STB_Oをアサートする。
  • SLAVEは、[ACK_O]をアサートしてレスポンスを返す。
  • SLAVEの回路は、[CYC_I]STB_IのANDを取れば良い。(PERMISSION 3.10)
  • [ACK_O][ERR_O][RTY_O]の信号は、[CLK_I]に対して非同期で良い。(PERMISSION 3.30)

Verilogで書くとこう。(ただし、ウェイト無しの場合)

	assign ACK_O = CYC_I && STB_I;	

READサイクル

ウェイト無しのREADサイクル

[CYC_O]は書かれていませんが、アサートしっぱなしです。
クロックの立ち上がり毎の信号の動きです。

CLOCK EDGE 0
  • MASTERは[ADR_O()][TGA_O()][SEL_O()][CYC_O][TGC_O()]を出力する。
  • MASTERは[WE_O]をネゲートする。(READサイクルなので)
  • MASTERは[STB_O]をアサートして転送サイクルを開始する。
CLOCK EDGE 1
  • SLAVEは入力をデコードし、[ACK_I]をアサートしてレスポンスをかえす。(ACKをアサートしないとウエィトステートになる)
  • SLAVEは[ACK_I]のアサートに合わせて[DAT_I()][TGD_I()]に有効なデータを出力する。
  • MASTERは[ACK_I]をモニターし、[DAT_I()][TGD_I()]をラッチする準備をする。
CLOCK EDGE 2
  • MASTERは[DAT_I()][TGD_I()]をラッチする。
  • MASTERは[STB_O][CYC_O]をネゲートして、サイクルを終了させる。
  • SLAVEは[STB_O]ネゲートのレスポンスとして、[ACK_I]をネゲートする。

WRITEサイクル

ウェイト無しのWRITEサイクル

[CYC_O]は書かれていませんが、アサートしっぱなしです。
クロックの立ち上がり毎の信号の動きです。

CLOCK EDGE 0
  • MASTERは[ADR_O()][TGA_O()][SEL_O()][CYC_O][TGC_O()]を出力する。
  • MASTERは有効な[DAT_O()][TGD_O()]を出力する。
  • MASTERは[WE_O] をアサートする。
  • MASTERは[STB_O]をアサートして転送サイクルを開始する。
CLOCK EDGE 1
  • SLAVEは入力をデコードし、[ACK_I]をアサートしてレスポンスをかえす。(ACKをアサートしないとウエィトステートになる)
  • SLAVEは[ACK_I]のアサートに合わせて、[DAT_O()][TGD_O()]をラッチする準備をする。
  • MASTERは[ACK_I]をモニターし、サイクル終了のの準備をする。
CLOCK EDGE 2
  • SLAVEは[DAT_O()][TGD_O()]をラッチする。
  • MASTERは[STB_O][CYC_O]ネゲートし、サイクルを終了させる。
  • SLAVEは[STB_O]ネゲートのレスポンスとして、[ACK_I]をネゲートする。