UART(VHDL)

Logic Home

コードのダウンロード

バージョン1.1:uart.vhd (13.1 KB)
RXスタートビットエラーチェックの修正

バージョン1.0:uart_v1_0.vhd (13.0 KB)
初版パブリックリリース

特長

  • UART(Universal Asynchronous Receiver/Transmitter)コンポーネントのVHDLソースコード
  • 全二重通信
  • ボーレートを設定可能
  • データ幅を設定可能
  • パリティ(偶数/奇数/無し)を設定可能
  • 受信データのオーバーサンプリングレートを設定可能
  • フロー制御無し

はじめに

ここでは、VHDLで記述されたCPLDやFPGAで使用されるUARTコンポーネントについて詳しく説明します。このコンポーネントはQuartus II、バージョン13.1.0を使用して設計されました。図1は、UART をシステムに組み込んだ典型的な例を示しています。

block_diagram

図1. 実装例

背景

UARTは、非同期シリアル通信に使用されるデバイスです。データ伝送用のRXとTXの2本のラインで構成され、各方向に1本ずつあります。また、フロー制御を実装するために、RTS(Ready to Send)とCTS(Clear to Send)のラインを追加することもあります。伝送速度、データ幅、パリティおよびフロー制御はすべて設定可能で、通信する両方のUART対応機器で同じに設定する必要があります。

図2に送信時のデータフレームを示します。通信がない場合、このラインはハイに保たれ、このラインと送信機が損傷していないことを示します。トランザクションはロースタートビットで開始します。データワードがそれに続きます。次にパリティビットがあり、偶数パリティ、奇数パリティあるいはパリティなしを設定することができます。最後にストップビット(ハイ)でトランザクションを終了します。

図2. データフレーム

通信は、単信、半二重あるいは全二重のいずれでも可能です。このコンポーネントでは、送信ラインと受信ラインが独立して動作します。このため、このコンポーネントは本質的に全二重になっていますが、ユーザーロジックで制御すれば、単信または半二重として動作させることも可能です。

動作原理

ボーレートとオーバーサンプリングレートのクロックイネーブルの生成

ボーレートはデータの伝送速度をビット/秒で表したものです。オーバーサンプリングレートは、受信回路がボー期間(すなわちデータビット)あたりの受信入力をサンプリングする回数です。

ボーレートとオーバーサンプリングレートは、これらの周波数でクロックイネーブルパルスを生成することによって実現します。これらの信号は、システムクロックclkの周波数から派生したもので、clk_freqという汎用パラメータで指定する必要があります。

コンポーネント内のカウンタは、ボーレートで発生するボーパルスを生成します。この周期的なパルスにより、システムクロックはそのボーレートで送信回路を動作させることができます。生成されるボーレートはシステムクロックの整数倍でなければならないため、各ボー周期にわずかな誤差が生じます。ただし、この誤差はシステムクロックの1周期を超えることはありません。

同様に、別のカウンタは、周波数 = オーバーサンプリングレート * ボーレートで発生するオーバーサンプリングパルスを生成します。このパルスにより、システムクロックはオーバーサンプリングレートで受信回路を動作させることができます。なお、このカウンタはボーパルス毎にリセットされますので、カウントエラーが1ボー期間を超えて蓄積されることはありません。これにより、受信回路のボーレートと送信回路のボーレートは同一になります。

送信回路

tx_ena入力がアサートされると、tx_dataのデータは内部シフトレジスタにラッチされます。この時、パリティビットもXOR論理で計算され、スタートビット、ストップビットと共に同じシフトレジスタにラッチされます。ボーパルスは、その後、定期的にシステムクロックを有効にし、そのボーレートでレジスタの内容をtxラインにシフトアウトします。tx_busy出力は、送信が完了し、回路が新しい送信データを受け入れる準備ができたことをユーザーロジックに示します。

受信回路

受信回路はオーバーサンプリングパルス毎にrx入力をモニタします。論理値ローを検出するとカウントを開始し、十分な数の連続したロー入力を検出するとスタートビットの入力を認識します。この時、オーバーサンプリングパルスをカウントすることにより、ボーレートでrxラインの値をシフトレジスタにシフトし始めます。

データワード全体がレジスタにシフトされると、受信回路はXORロジッ クを使用してデータパリティを検証します。その後、受信データをrx_dataポートに出力し、エラーが検出された場合はrx_errorポートにフラグを立てます。rx_busyポートがハイからローに変化すると、新しい受信データが利用可能になったことをユーザーロジックに通知します。

UARTの構成

UARTは、ENTITYのGENERICパラメータを設定することで構成されます。表1ではパラメータを説明します。

表 1. GENERICパラメータの説明

ポートの説明

表2ではUARTのポートについて説明します。

表 2. ポートの説明

トランザクション

同じコンポーネントの一部ではありますが、送信トランザクションと受信トランザクションは互いに影響しないため、独立して動作します。

送信

図3は送信例のタイミング図です。なお、表示されているbaud_tb信号はUARTの内部信号であり、ここでは説明のためにのみ記載されています。ユーザーがUARTを使用する際に、この信号を考慮する必要はありません。

図3. 送信タイミング図の例

tx_busy出力ポートの論理値がローである場合、そのコンポーネントはデータ送信の準備ができていることを示します。このコンポーネントは、tx_ena入力がアサートされた後のclkの最初の立ち上がりエッジで、tx_dataポートに提示されたデータをラッチします。コンポーネントは次のclktx_busy信号をアサートし、UART送信回路がビジー状態であることを示します。この状態での送信回路への入力はすべて無視されます。次のボー周期パルスbaud_tbがUART内で生成されると、実際の送信が開始されます。この時点で、tx信号は論理値ローのスタートビットを出力し、送信は開始されます。UARTはtx_dataの最下位ビット(LSB)を最初に送信します。図示されているトランザクションでは、偶数パリティビットがデータワードの後に続いています。論理値ハイのストップビットが送信され、送信が完了すると、tx_busy信号がディアサートされ、送信回路が次のトランザクションに備えることができることを示します。

受信

図4は、受信例のタイミング図です。受信トランザクションは、UARTの通信相手からrx入力ポートの論理値ローのスタートビットによって開始されます。UARTは、rx入力ラインがボー期間の半分でローになったことを検出すると 、スタートビットを認識してrx_busy信号をアサートし 、受信トランザクションが進行中であることをユーザーロジックに通知します。そして、あらかじめ設定されたボーレートでビットをシフトし、パリティビットの計算と検証を行い、正しいタイミングで論理値ハイのストップビットが発生していることを確認します。ストップビットを検出すると、受信したデータをrx_dataポートに出力し、受信した最初のビットをLSBとします。また、スタートビット、パリティビットあるいはストップビットのいずれかのエラーが検出されたかを示すrx_error信号も出力します。同時にrx_busy信号をディアサートして、受信トランザクションが完了し、rx_dataおよびrx_errorポートから結果が得られることをユーザーロジックに知らせます。

図4. 受信タイミング図の例

図5は、UARTが受信ライン上の受信ビットを検出する方法を示しています。UARTは、オーバーサンプリングパルスごとにrx入力を監視します。このシミュレーションでは、オーバーサンプリングレート(os_rate)を16に設定しているため、1ボー期間あたり16サンプルを取り込みます。UARTは、rx入力が連続8サンプル(os_rate/2)期間に論理値ローであることを検出すると、スタートビットが存在すると判断します。そして、各受信ビットの中央に相当する16番目のサンプルごとにデータビットをシフトします。オーバーサンプリングレートが高いほど、ビットの中央近くでサンプリングされることが保証されます。

図5. UART 内の受信ビットの受信

リセット

UARTコンポーネントが動作するためには、reset_n入力ポートが論理値ハイである必要があります。このポートにロー信号を入力すると、非同期でコンポーネントをリセットします。リセット中、コンポーネントはtx_busyポートをハイに保持し、データを送信できないことを示しています。現在進行中の送信は中止され、tx出力は論理値ハイの状態になります。rx_busyポートは、ローに保持され受信が進行中でないことを示します。現在進行中の受信は放棄され、rx_datarx_errorの出力ポートはクリアされます。リセットから解放されると、tx_busyポートは次のclkでディアサートされ、UARTが通信可能な状態にあることを示します。

まとめ

このUARTは、シンプルな非同期シリアルインターフェースによる通信に対応した設定可能なプログラマブルロジックコンポーネントです。システムクロック、ボーレート、データ長、パリティ方式およびオーバーサンプリングレートをユーザーが指定することができます。




オリジナル・ソース(English)