9 |
BSVによるサウンドFSMの再設計 (9) |
OneStageソース
前稿で述べたルールの前後にインタフェース、レジスタ宣言、メソッド宣言を加えてソースが完成しました。
// OneStageのインタフェース定義
interface Fifo_ifc;
(* prefix="" *)
// GameFSMからの書き込み有効信号
method Action if_write_enable((* port="wr_en" *)Bool wen);
(* prefix="rd" *)
// 各SoundFSMからの読み取り有効信号 (0~3)
method Action if_read_enable0(Bool en0);
(* prefix="rd" *)
method Action if_read_enable1(Bool en1);
(* prefix="rd" *)
method Action if_read_enable2(Bool en2);
(* prefix="rd" *)
method Action if_read_enable3(Bool en3);
(* result="empty" *)
// キューが空かどうかを返すメソッド
method Bool if_empty();
endinterface
// OneStageの実装
(* synthesize, always_ready, always_enabled *)
module mkOneStage(Fifo_ifc);
// 入力信号のレジスタ
Reg#(Bool) in_wen <- mkReg(False); // 書き込み有効
Reg#(Bool) in_ren0 <- mkReg(False); // 読み取り有効 (SoundFSM0)
Reg#(Bool) in_ren1 <- mkReg(False); // 読み取り有効 (SoundFSM1)
Reg#(Bool) in_ren2 <- mkReg(False); // 読み取り有効 (SoundFSM2)
Reg#(Bool) in_ren3 <- mkReg(False); // 読み取り有効 (SoundFSM3)
// キューが空かどうかの状態
Reg#(Bool) in_empty <- mkReg(True);
// キューへの書き込みルール
rule rule_write (in_wen && in_empty);
in_empty <= False; // キューを!emptyにする
endrule
// キューからの読み取りルール
rule rule_read ((in_ren0 || in_ren1 || in_ren2 || in_ren3) && !in_empty);
in_empty <= True; // キューをemptyにする
endrule
// 各メソッドの実装
method Action if_write_enable(Bool wen);
in_wen <= wen;
endmethod
method Action if_read_enable0(Bool en0);
in_ren0 <= en0;
endmethod
method Action if_read_enable1(Bool en1);
in_ren1 <= en1;
endmethod
method Action if_read_enable2(Bool en2);
in_ren2 <= en2;
endmethod
method Action if_read_enable3(Bool en3);
in_ren3 <= en3;
endmethod
method Bool if_empty();
return in_empty; // キューが空かどうかを返す
endmethod
endmodule: mkOneStage
Leave a Comment