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 が出ているんだと思います)
2012年12月01日
2012年11月28日
UARTの設計(2)
RS-232Cの実装は、工作の方も必要になります。
幸い、DE0 のボードにレベルシフタ(ADM3202相当)が搭載されているので、結線してコネクタを増設するだけです。
DE0 のRS-232Cの端子は、基板右上になります。
この端子はランドしかありませんので、接続用のコネクタを付けるか、もしくは直接配線する必要があります。

この写真は、コネクタを接続した後になります。
ただ、ここの箇所の回路(というか印刷)が間違っています。
上から順に、RXD、TXD、CTS、RTS、GND4 となっていますが、CTS と RTS が逆です。
外部から入力されるのが CTS、外部へ出力するのが RTS ですが、回路図も全部間違っています。
まあ、逆に繋ぐだけでいいんですけどね。
RS-232C 用のDsubコネクタは、音声ボードの方にしました。ただ、今のままだとジョイスティック端子用のDsub9ピンコネクタが邪魔になります。
正確には、Dsubのピンピッチを変換している基板が大きくて邪魔なんですね。
なので、今回は、Dsubの足を曲げる事で対処しました。

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

実装した後の写真です。
右上のケーブルが挿さっているのがRS-232C用の配線で、上部に並んでいる3つのDsub9ピンが、ジョイスティック×2とRS-232Cになります。
幸い、DE0 のボードにレベルシフタ(ADM3202相当)が搭載されているので、結線してコネクタを増設するだけです。
DE0 のRS-232Cの端子は、基板右上になります。
この端子はランドしかありませんので、接続用のコネクタを付けるか、もしくは直接配線する必要があります。
この写真は、コネクタを接続した後になります。
ただ、ここの箇所の回路(というか印刷)が間違っています。
上から順に、RXD、TXD、CTS、RTS、GND4 となっていますが、CTS と RTS が逆です。
外部から入力されるのが CTS、外部へ出力するのが RTS ですが、回路図も全部間違っています。
まあ、逆に繋ぐだけでいいんですけどね。
RS-232C 用のDsubコネクタは、音声ボードの方にしました。ただ、今のままだとジョイスティック端子用のDsub9ピンコネクタが邪魔になります。
正確には、Dsubのピンピッチを変換している基板が大きくて邪魔なんですね。
なので、今回は、Dsubの足を曲げる事で対処しました。
こんな感じです。
また、RS-232C用のコネクタは、P6 では Dsub25ピンなんですが、場所をとるので DOS/V と同じ規格(Dsub 9ピン)にしました。
実装した後の写真です。
右上のケーブルが挿さっているのがRS-232C用の配線で、上部に並んでいる3つのDsub9ピンが、ジョイスティック×2とRS-232Cになります。
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では、決まったボーレート以外は選択できません。
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では、決まったボーレート以外は選択できません。

