verilog~UART通信受信機(RX)編~

初めに

お久しぶりです、Keymaleです。先週はUARTの送信機について紹介しました。結構検索して見ていただいたみたいなので、今回は受信機のほうを紹介していきます。受信機のコード内に分周器が出てきますが、詳細は過去記事を見てください。

UART規格

規格についても詳細はこちらを見てください。

通信レート(ボーレート)は9600, 19200, 38400, 76800, 115200 bpsなどがあります。今回は前回の送信機の レートと合わせて 9600 bpsとします。メインクロックは50 MHzとして、9600 bpsにするには5208で分周しますが、受信機側は送信側クロックの4倍のクロックで受信データをたたきます。受信方法を二つ紹介します。一つ目はスタートビットを検出したら、4回クロックをずらして、次のデータを取得します。スタートビットでクロックの同期を簡易的にと取る方法です。通信レートが低ければ送受信間でクロック周波数がよほど差がない限りこれで通信できます。もう一つの方法は4回たたいて、3回以上HIGHなら1、LOWなら0と多数決論理にて、受信ビットを決定していきます。此方のほうがロバスト性が高いですが、少しだけコードが増えます。どちらにせよ受信クロックは4倍のクロックになるように、50 MHzで1302で分周します。

UART_RX module

それでは早速UARTのRXモジュールを見ていきましょう。まずは簡易クロック同期による方法を以下に記載します。

以上になります。CASE文で書く方法もあるのですが、重複が多くなり無駄に行数が多くなってしまうので、多少深くなってしまいますが、IF文でごり押しで書いてみました。

次に多数決論理を入れたものを以下に記載します

bit_sumで過去4回分のbitの合計値を計算し、1以下ならばbit_valueを0に、3以上ならば1にしています。簡易同期とは違いデータを確定するために4クロック分見てから判断するので受信データが数クロック分遅延します。

ModelSimでの検証結果

一応modelsimで動作を確認しましたので、以下に結果を載せておきます。まずは簡易同期の方法です。

00111011のデータを前回作った送信機から送信して、今回作った受信機側で同じで00111011を受信できていることが確認できるかと思います。

次に多数決論理の方法も検証してみます。

こちらも00111011がきちんと受信できていますね。

最後まで見てくださってありがとうございます。最近は育児ブログも書いているのでそちらのほうもよかったら見てください。verilog記事はいろいろ書いてきましたが、次はsystem-verilogで実装されたenumlateの使い方について説明していこうかと思います。後はwordpressでのTeX,LaTexの使い方とか、pythonでのグラフ描画(Pyplot)などを掲載してく予定です。

お手すきでしたらコメントもよろしくお願いします。

それでは次回も見てくださいね。