2012年12月01日

UARTの設計(3)

  RS232C の確認用のプログラムを変更しました。

rs232c_5.zip


  修正点は、以下の通りです。

 ・RS232C割り込みベクタのスキップ先アドレスの変更
  mk2だと、変なアドレスに飛ぶため、妙な動きになる時があります。

 ・受信時のエラーを表示
  受信中に一度でもエラーがあると表示されます。

 ・送信時に EMPTY になったかどうかを表示
  送信時にEMPTYになるのは、シリアルデータが途切れた事を意味します。TxEMPTY はエラーフラグではないので、最悪は取り損ないます。

 ・送信時、TxEMPTY になってからデータをセットしていたものを修正

 ・8251のリセットを追加
  ボーレートを変更した時や、間違ったデータを受信した後などはリセットした方が無難です。

 ・ドキュメントを同梱



  このプログラムを使って、PC-6001F mk2 でどこまで送受信(特に受信)が可能かを試しました。

  受信側は 614400bps 、送信側は512000bps(TxEMPTY有なら、768000bps)まで正常に送受信できました。



  どこまで送受信が可能かを算出してみると...


  今のプログラムが1バイト受信するのに掛かる時間が 4MHz で 61クロック分です。送信は、83 クロック分です。

  パリティなし、ストップ1ビットとして、最高ボーレートを計算すると

  受信:4MHz / 61 * (8+1+1) = 655.7 Kbps
  送信:4MHz / 83 * (8+1+1) = 481.9 Kbps

  となり、受信側は結果と合っています。


  送信側は、計算値を超えていますが、多分TxEMPTY を検出できていないと思われます。
 (レジスタ読み込み→次のデータ書き込み、の間に、TxEMPTY が出ているんだと思います)



posted by えすび at 09:58| Comment(3) | FPGA化:RS232C | このブログの読者になる | 更新情報をチェックする

2012年11月28日

UARTの設計(2)

  RS-232Cの実装は、工作の方も必要になります。

  幸い、DE0 のボードにレベルシフタ(ADM3202相当)が搭載されているので、結線してコネクタを増設するだけです。


  DE0 のRS-232Cの端子は、基板右上になります。
  この端子はランドしかありませんので、接続用のコネクタを付けるか、もしくは直接配線する必要があります。

DE0上のRS232C端子

  この写真は、コネクタを接続した後になります。

  ただ、ここの箇所の回路(というか印刷)が間違っています。
  上から順に、RXD、TXD、CTS、RTS、GND4 となっていますが、CTS と RTS が逆です。

  外部から入力されるのが CTS、外部へ出力するのが RTS ですが、回路図も全部間違っています。

  まあ、逆に繋ぐだけでいいんですけどね。



  RS-232C 用のDsubコネクタは、音声ボードの方にしました。ただ、今のままだとジョイスティック端子用のDsub9ピンコネクタが邪魔になります。
  正確には、Dsubのピンピッチを変換している基板が大きくて邪魔なんですね。


  なので、今回は、Dsubの足を曲げる事で対処しました。


Dsubコネクタ加工

  こんな感じです。


  また、RS-232C用のコネクタは、P6 では Dsub25ピンなんですが、場所をとるので DOS/V と同じ規格(Dsub 9ピン)にしました。


RS232Cポート増設

  実装した後の写真です。


  右上のケーブルが挿さっているのがRS-232C用の配線で、上部に並んでいる3つのDsub9ピンが、ジョイスティック×2とRS-232Cになります。


posted by えすび at 21:52| Comment(0) | FPGA化:RS232C | このブログの読者になる | 更新情報をチェックする

UARTの設計(1)

  実機の方のRS-232Cボードが大体落ち着いたので、FPGA版にも実装する事にしました。

  8251 の仕様書を見る限りは、そんなに難しくはありません。
  本来、8251は USART なんですが、同期通信は使わないので、UART の実装になります(S が抜ける)。


  大体、回路は作ってしまいましたが、以下の点が実機(8251)と違います。

1)同期通信を実現していない。
  これは、前述の通り、使用していないので、実装していません。

 2)分周クロックを使わずに、50MHzクロックを数えて代わりに使用している。
  これは、同じようで微妙に違います。受信側の解像度が50MHz になるため、従来よりも受信しやすくなります。
  さらに、従来では出来なかった、1/1分周の非同期受信が可能です(あまり意味はないですが)。

  また、50MHzクロックで数えている関係で、実際のデータレートから若干ずれます。
  例えば、9600bps の場合、データ1ビットの幅は、1/9600 = 104,166 ns です。
  1周期20ns の 50MHz クロックから生成した場合は、104,160 ns になります。

  ただ、500Kbps で通信をしても1%程度のずれなので、特に問題にならないかと思います。

  (ちなみに、平均値として小数点以下も合わせる事は可能です。していませんが。)


 3)ブレーク検出の仕様が若干厳しい
  本来の検出条件は、2キャラクタ分Lの時ブレーク検出なんですが、20ビット間Lならばブレークとしました。
  殆ど影響がないので、このようにしています。

 4)DSR/DTR/CD がない
  これは、DE0 のボードの方の制約です。
  DE0 のボード上には、RS232C用のレベル変換のIC が搭載されています。
  ですが、RXD/TXD/CTS/RTS の4本しかないんですね。

  外部にレベル変換のICを載せればいいんですが、多分使わないので割愛しました。


  回路モジュールとしては完成し、制御のF/Wも一応完成しました。
  ただしボーレートの選択方法がちょっといまいちです。
  回路的には、ボーレートは任意の値が可能なんですが、今のF/Wでは、決まったボーレート以外は選択できません。


posted by えすび at 20:37| Comment(0) | FPGA化:RS232C | このブログの読者になる | 更新情報をチェックする