5 |
BSVにおけるコマンドバッファ制御 (4) |
それではダイレクト制御(途中にバッファを置かずに直接2線ハンドシェイクを行う)のサンプルを作成してください。
1. Producer
それではプロデューサのサンプルを提供します。
/* Producer4.bsv : 4bit データを 10 サイクルごとに出すだけ */
package Producer4;
import LFSR :: *;
interface Producer4Ifc;
method ActionValue#(UInt#(4)) produce();
endinterface
module mkProducer4 (Producer4Ifc);
Reg#(UInt#(7)) cnt <- mkReg(0); // 0–
LFSR#(Bit#(4)) lfsr <- mkLFSR_4;
rule tick;
cnt <= (cnt==9)?0:cnt+1;
endrule
rule random (cnt == 4);
lfsr.next(); // ② LFSR を 1-step 進める
endrule
method ActionValue#(UInt#(4)) produce() if (cnt==0);
Bit#(4) v = lfsr.value; // ① 今の値を読む
return unpack(v); // ③ 読み取った値を返す
endmethod
endmodule
endpackage