19 |
BSVによるUARTの再設計 |
UARTの改良点
過去記事においてUARTを設計しましたが、見直したところ改良点が見つかりました。 改良点はdoneフラグの生成です。実はハンドシェークは自動的にenableとreadyの2線で行われるので、doneが無くても良いのですが、test benchで終了を知りたい場合には必要です。
Uart.bsv
import StmtFSM::*;
interface Uart_ifc;
method Bit#(1) read();
method Action load(Bit#(8) newdata);
method Bool done();
endinterface
(* synthesize, always_ready="read, done" *)
module mkUart(Uart_ifc);
Reg#(Bit#(8)) data <- mkRegU;
Reg#(Bit#(1)) odata <- mkReg(1'h1); // stop bit
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 Bool done();
return fsm.done();
endmethod
method Action load(Bit#(8) newdata);
action
data <= newdata;
fsm.start();
endaction
endmethod
endmodule
この記述のように、従来設けてあったレジスタのdoneフラグを削除し、ステートマシンのdoneを上位に返すことで実現します。さらに、インタフェースのreadとdoneは常にreadyであるため、それらのready信号は不要なので削除しています。