• 本当は、田舎に庵を建てて隠遁生活したいけど、先立つものも無いので自宅で..。

FPGA UART RX

UARTの受信から実装しました。

ソースです。


module UART_RX(
input rxRST,
input rxCLK,
input rxRXD,
output reg rxDATAREADY,
output reg [7:0] rxDATA
);

endmodule


一つ目のループは、cntで100MHzのクロックをカウントし、受信信号のビット幅を4分の1にするタイミング信号を作成します。 シミュレーションの時間を短くするためにBaud rateは、5MHzにしました。 bitcntは、受信信号を何ビット目かをカウントし、sampcntは、4分割したビットのどの位置かをカウントするカウンタです。

sampcntが1の時、shiftがhighになるのでそのタイミングでRXDをshiftregisterに取り込みます。

スタートビットが検知されると、smpcntとbitcntが有効になり、smpcntは、ビット幅4分の1で毎回カウントされ、bitcntはsmpcntが3になった時にカウントされます。

2つ目のループは、ステートマシンで、stat=0でアイドリング、stat=1で、sampcntの判定、bitcntの判定を行っています。

テストベンチです。


module sim_uart_rx;

endmodule


シミュレーション結果です。

UART_RX_sim1

rxdがlowになった時に、ステートが1に代わって、sampcntがスタートし、sampcntが3になるとbitcntがスタートしています。

UART_RX_sim2

bitcntが9になったところで、dataが”a9″になって、datareadyがhighになりました。

論理合成はしていませんが、送信側を作ってからまとめて論理合成したいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA