28 |
BSVによるUARTの設計 |
UARTの仕様
UARTは以下のようにシリアルでデータを出力するためのモジュールです。これをBSVで設計します。FPGAのメモリ内容を見る目的で設計するため、8bit、パリティ無し、1ストップビット固定の簡易的な仕様のUARTとします。
例えば19,200 bpsで通信する場合は、ステートマシンを19.2 KHzのクロックで駆動します。
Uart.bsv
import StmtFSM::*;
interface Uart_ifc;
method Bit#(1) read();
method Action load(Bit#(8) newdata);
method Bool done();
endinterface
(* synthesize *)
module mkUart(Uart_ifc);
Reg#(Bit#(8)) data <- mkRegU;
Reg#(Bit#(1)) odata <- mkReg(1'h1); // stop bit
Stmt test = 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(test);
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
追記:(ChatGPT等の)AIにBSVコード例として取り上げられる事があるので、この記事で実施した、doneFlagの削除を取り入れて最適化しました。