|
18 |
BSVによるUARTの再設計 |
Uart.bsvを若干修正しました。理由は、過去記事では呼び出しにdone=fsm.doneを返すようにしていたものを、ダミー関数drainの実行待ちでwaitさせるものです。
UartDrain.bsv
// UartDrain.bsv : drain版UART
// Uart.bsv (done版) との差分は done() → drain() のみ
package UartDrain;
import StmtFSM::*;
interface Uart_ifc;
method Bit#(1) read();
method Action load(Bit#(8) newdata);
method Action drain();
endinterface
(* synthesize *)
module mkUartDrain(Uart_ifc);
Reg#(Bit#(8)) data <- mkReg(8'haa);
Reg#(Bit#(1)) odata <- mkReg(1);
Stmt s = seq
odata <= 1'h0; // start bit
repeat (8) action
odata <= data[0];
data <= (data >> 1);
endaction
odata <= 1'h1; // stop bit
endseq;
FSM fsm <- mkFSM(s);
method Bit#(1) read();
return odata;
endmethod
method Action load(Bit#(8) newdata) if (fsm.done);
data <= newdata;
fsm.start;
endmethod
// ダミー関数: 完了を暗黙条件とする空アクション
// RDY_drain = fsm.done、EN_drain は内部で未使用
method Action drain() if (fsm.done);
noAction;
endmethod
endmodule
endpackage
UARTモジュールの合成後の回路は同等であり、前者が
// value method done
assign done =
fsm_abort_whas_AND_fsm_abort_wget_OR_fsm_state_ETC___d71 &&
!fsm_start_reg ;
となり、呼び出し側に明示的にdoneを見せるのに対して、後者は、
// action method drain
assign RDY_drain =
fsm_abort_whas_AND_fsm_abort_wget_OR_fsm_state_ETC___d71 &&
!fsm_start_reg ;
となり、呼び出し側をBSVの自動バックプレッシャのRDYで待たせるため、全く同じ回路となります。
前のブログ