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
CLOCK EDGE 1
- SLAVEは入力をデコードし、[ACK_I]をアサートしてレスポンスをかえす。(ACKをアサートしないとウエィトステートになる)
- SLAVEは[ACK_I]のアサートに合わせて[DAT_I()]、[TGD_I()]に有効なデータを出力する。
- MASTERは[ACK_I]をモニターし、[DAT_I()]と[TGD_I()]をラッチする準備をする。
WRITEサイクル
[CYC_O]は書かれていませんが、アサートしっぱなしです。
クロックの立ち上がり毎の信号の動きです。
CLOCK EDGE 0
CLOCK EDGE 1
- SLAVEは入力をデコードし、[ACK_I]をアサートしてレスポンスをかえす。(ACKをアサートしないとウエィトステートになる)
- SLAVEは[ACK_I]のアサートに合わせて、[DAT_O()]、[TGD_O()]をラッチする準備をする。
- MASTERは[ACK_I]をモニターし、サイクル終了のの準備をする。