VHDL記述例 - UARTによるシリアル通信

はじめに

本ページでは,調歩同期方式シリアル通信を行うためのUART (Universal Asynchronous Receiver Transmitter)のVHDL記述例を紹介します. UARTをFPGAに実装することにより,D-sub9ピンのシリアルケーブルやUSB-シリアル変換モジュールを経由して,PCとFPGAなどの間でRS-232C準拠のシリアル通信が実現できます.

下記の環境で動作を確認しておりますが,動作を保証するものではありません. ソースコードは自己責任の上でご利用ください.

OS Microsoft Windows 7 Professional x64 Service Pack 1
Quartus II Altera Quartus II 12.0sp2 Web Edition
ModelSim Mentor Graphics ModelSim-Altera Starter Edition v10.0d Service Pack 2
FPGA Board Terasic DE0 (Altera Cyclone III EP3C16F484C6N)

調歩同期方式シリアル通信とUART(準備中)

調歩同期方式シリアル通信とUARTについて簡単に解説する予定です.

VHDL記述例

はじめに

今回紹介するUARTのVHDL記述例(以降では,UARTモジュールと呼びます)は,下図に示すような構成になっています. 最上位モジュール「UART」は,その下にクロック生成モジュール「clk_generator」, シリアル送信モジュール「tx」およびシリアル受信モジュール「rx」を内包しています. UARTモジュールは,これら下位モジュールの入出力信号を結線しています.

下表に各外部入出力信号の名称と機能をまとめました.入力クロックの周波数は50MHzです.

Node Name Direction Description
CLK Input クロック入力.周波数は50MHzを想定
RST Input リセット動作: 1,通常動作: 0
TXD Output シリアル通信(送信)
RXD Input シリアル通信(受信)
DIN Input 送信データ入力
DOUT Output 受信データ出力
EN_TX Input 送信有効: 1,送信無効: 0
EN_RX Input 受信有効: 1,受信無効: 0
STBY_TX Output 待機中(初期状態): 1,送信中: 0
STBY_RX Output 待機中(初期状態): 1,受信中または受信待機中: 0

下表に通信仕様をまとめました.

ビットレート 115200bps
データビット 8bit
パリティビット なし
ストップビット 1bit
フロー制御 なし

最上位モジュール「UART」(UART.vhd)

最上位モジュール「UART」は,その下にクロック生成モジュール「clk_generator」, シリアル送信モジュール「tx」およびシリアル受信モジュール「rx」を内包しています. UARTモジュールは,これら下位モジュールの入出力信号を結線しています.

クロック生成モジュール「clk_generator」(clk_generator.vhd)

クロック生成モジュール「clk_generator」は,シリアル通信に必要なクロックを生成し,シリアル送信モジュールおよびシリアル受信モジュールに供給します.

シリアル送信モジュール「tx」(tx.vhd)

シリアル送信モジュール「tx」は,シリアル通信における送信機能を提供します.

シリアル受信モジュール「rx」(rx.vhd)

シリアル受信モジュール「rx」は,シリアル通信における受信機能を提供します.

テストベンチとRTLシミュレーション

テストベンチ記述例

以下は,UARTモジュール用のテストベンチ記述例(tb_UART.vhd)です. テストベンチ記述,Quartus IIおよびModelSimを用いたRTLシミュレーションの方法については,加算器のRTLシミュレーションが参考になると思います.

RTLシミュレーション結果

下図に,上記のテストベンチ記述例を使用したRTLシミュレーションの結果を示します.

Terasic DE0に,UARTによるシリアル通信を実装するためには

Terasic DE0にはD-sub9端子が実装されておらず,シリアル通信を行うためには, シリアルケーブルの作成やUSB-シリアル変換モジュールの購入などが必要となります. 下記にこれらの実装例をまとめましたので,ご一読ください.

blog 渓鉄: FPGA入門 - Terasic DE0+FTDI FT232RLでシリアル通信(UART)

blog 渓鉄: FPGA入門 - Terasic DE0でシリアル通信(UART)