実機の方の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では、決まったボーレート以外は選択できません。
2012年11月28日
この記事へのコメント
コメントを書く

