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