FC2カウンター FPGAの部屋 シリアルインターフェース(RS-232C)の説明
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

シリアルインターフェース(RS-232C)の説明

人知れずにあった私のホームページの内容を移しています。
今度はシリアルインターフェース(RS-232C)の説明です。本当はHDLコードを示して説明しようと思っていたのですが、そのためには書き直さないといけないようなので、とりあえずあきらめました。

シリアルインターフェースの(RS-232C)説明をします。パソコンについているシリアルインターフェースの規格はRS-232Cという規格で、調歩同期方式になっています。調歩同期はスタートビット、データビット、ストップビットを持っています。ここでは、データ8ビット、1ストップビットの場合について説明します。この後、シリアルインターフェースはRS- 232C用のシリアルインターフェースの規格とします。
 RS-232Cの信号規格はTTLレベルではありません。そこで、レベル変換のICが必要になります。評価基板ではSP3222EHがレベル変換のIC です。レベル変換ICはTTLレベルをRS-232Cの信号レベルに相互変換します。図1がTTLレベルでのシリアルインターフェースの信号です。

serial_signal1_060218.jpg

図1 シリアルインターフェースの信号

1ビット分の長さは、ビットレートによって変わります。スタートビットの長さ(1ビットの長さ)は、(1/ビットレート)になります。例えば9600bps(bit par second)の1ビット分の長さは、約104usecです。データ8ビットを送信する場合は、スタート1ビット、データ8ビット、ストップ1ビットの合計10ビットなので、1ビットが約104usecとすると、約 1.04ms必要です。つまり、2ビット分(スタート、ストップビット)が余計に必要なので、実際のスループットは最大9600X0.8=7680 (bps)になります。これらのオーバヘッドは、大体の通信手順にはつき物です。カタログ値と実際の値のようなもので、通信スピードを比べるときには、オーバーヘッドを除いた値を比べなくては正確ではありません。
図1を元にシリアルインターフェースの通信手順を説明します。通常の状態では信号は1に固定されています。データを送信する場合に、送信側が1から0にドライブし、スタートビットを送出します。スタートビットの長さは1ビット分の長さ(1/ビットレート、9600bpsだと104usec)です。その後にデータビットが続きます。データビットは下位桁から送出します。例えばAというキャラクタはアスキーコードで0x41です。ビット列にすると01000001になります。このビット列を下位桁から送出するので、送り出す順番は10000010になります。(図1参照)当然、1ビット分の長さは、9600bpsですと 104usecです。その後に、1ビット分のストップビットを送出します。ストップビットは1ビット分の1の信号です。これで1つのデータ単位の出力が終わりました。もっと、送り出すデータがある場合には、ストップビットの次に次のデータのスタートビットが来ても大丈夫です。

それでは、同期するクロックがない状態で、どのようにデータをサンプルするのでしょうか?
それは、ビットレートの何倍かのクロックでデータをサンプリングします。大体の場合は、16倍とか8倍とかでしょうか。64倍という場合もあります。何倍かによって、受信データのビットレートの狂いにどのくらい耐えられるかが決まります。

serial_signal2_060218.jpg

図2 シリアルインターフェースの信号(スタートビット、データビット1ビット目拡大図)

図2は8倍のクロックを使用したシリアルインターフェース受信回路の例です。シリアルインターフェース受信回路はデータラインが0になるのを監視しています。0になったのを検出してから、3クロック分カウントしたところで、もう一度0になっているかどうかを確認します。この動作で、ひげ状のノイズでの誤動作を防ぐことが出来ます。ここで0のままであれば、スタートビットが来たと認識し、データの受信がスタートします。スタートビットを確認した位置から8クロックを数えた所がデータビットの1ビット目をサンプルするタイミングです。サンプリングしたデータラインが1か0かで、データビット1ビット目の値が決まります。その後、また8クロック数えて2ビット目のデータをサンプリングします。
というように、8ビット目まで、データをサンプリングします。その次が、ストップビットですが、同様にデータビットの8ビット目から8クロック数えてサンプルした値がストップビットの値になります。そのサンプルしたストップビットの値が0の時は、フレーミングエラーになります。これは、ストップビットであるべきところがストップビットでなかったということです。
また、データビットの後にパリティビットがあることがあります。その場合は、データのパリティを計算して、パリティビットの値と合わない場合はエラーとなります。
私の設計したシリアルインターフェースモジュールは、フレーミングエラーとパリティエラーは実装してありません。

以上が受信の場合ですが、送信の場合は、8倍のクロックを使用している場合は、8クロックごとにスタートビット、データビット、ストップビットの順でデータを出していけばOKです。後は受信側が今まで説明したように受信してくれます。
  1. 2006年02月18日 09:50 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/154-3b2ab739
この記事にトラックバックする(FC2ブログユーザー)