Spartan-3A スタータキット

〜シリアル通信(送信編)〜


2007/04/23

あなたは 人目のお客様です.

シリアル通信をしてみよう.

Spartan3Aスタータキットには,シリアルポートが2つついている. 片方はDCE,もう片方はDTEポートとなっている.

スタータキットのユーザーガイドに書いてあるが, 左のオスコネクタがDTEポート, 右のメスコネクタがDCEポートだ.

DTEは Data Terminal Equipment の略で,データ端末装置,つまりいわゆる端末だ. たとえばPCとかのこと.

DCEは Data Communication Equipment の略でデータ通信装置. モデムなど,データの転送を行うもののこと.

PCはデータ端末に当たるので,PCにはDTEのコネクタがついている. んでモデムは通信装置に当たるので,DCEのコネクタがついている. PCとモデムを接続するときは,それぞれのコネクタをストレートケーブルで 接続することになる. いまどきのPCにはたいていD-SUB9ピンのシリアルコネクタ (上の写真の左側のコネクタと同じもの)がついているので, D-SUB9ピンオス−D-SUB9ピンメスのストレート結線のケーブルを使うことになる. まあ単なるD-SUB9ピンの延長ケーブルだ.


D-SUB9ピンオス−D-SUB9ピンメスのストレート結線ケーブル

で,スタータキットでは,DTEコネクタもDCEコネクタも, 2番ピンと3番ピンがFPGAに接続されている.

2番ピンは RxD と呼ばれ,端末への受信データ線である. つまり RxD 上では,DCE→DTE の方向にデータが流れる.

3番ピンは TxD と呼ばれ,端末からの送信データ線である. つまり TxD 上では,DTE→DCE の方向にデータが流れる.

ということは,モデムなどのDCE機器から見ると,TxDは受信,RxDは送信となる ことになる.このようにDCEでは送信線と受信線の名前の扱いが逆になるので注意.

あとついでに,PCのようなDTE端末どうしを接続したい場合には, それぞれのTxDとRxDをクロスさせて接続すれば,片側の端末の送信データは もう片方の受信線に入っていくことになるので,双方向通信ができる.このように TxDとRxDがクロスさせてあるケーブルをクロスケーブルという. なので,クロスケーブルはDTE(オス)どうしを接続するために, たいていメス−メスになっている.


D-SUB9ピンメス−D-SUB9ピンメスのクロス結線ケーブル

というわけで,スタータキットをPCと接続する方法は, スタータキットをDCEとして扱うか,DTEとして扱うかで2通りの方法がある.

で,どうするか考えたんだけど,とりあえずストレートケーブルを使って, DCEコネクタで接続することにした. というのはストレートケーブルが1本あれば,スタータキットのDCEコネクタを使って PCと接続することもできるし,DTEコネクタを使ってモデムと接続することもできるし, ユーザーガイドに書いてあるように, スタータキットのDCEとDTEを直結してループバックテストをすることもできるからだ.

シリアル通信に関しては, Interface誌 2006/01月号 に詳しい説明がある.「調歩同期」というやつだ. 簡単に言うと,普段は1を出力しっぱなしで, データ送信の開始時にはスタートビットとして0を出力, あとは決められたボーレートでデータを送信し,必要なら最後にパリティを付加, 最後にストップビットとして1を出力するというもの. さらに次のデータは,前のデータのタイミングに同期している必要は無いので, ストップビットの長さは1.5ビットぶんというような, 中途半端な長さだったりしてもよい.

シリアル通信ではクロックというものが無いので, 相手から送られてきたデータのタイミングに合わせて, てきとうにビットの真ん中あたりのタイミングでデータを拾うことになる. これは実際に受信処理を書いてみて気がついたことなのだけど, このため最後のストップビットが真ん中で終わってくれると 次のデータのスタートビットを拾いやすいため,ストップビット長が1.5ビットの 長さになることがあるようだ. うーん,実際に書いてみて初めて気がつく新事実がけっこうあって感動.

ちょっと悩んだのは,データの送信ピンにTxDを使うのか,RxDを使うのかだ. 上でも説明したように,DCEでは送信線と受信線が逆になる. ということは送信には RxD (2番ピン) を使えばいいことになる. ところがユーザーガイドの回路図を見ると, DCEコネクタのRxD(RS232_DCE_RXD)は受信線として (データの流れを表す矢印が内向きになっている),3番ピンに接続されているのだな. 実際に RS232_DCE_RXD を送信として利用しようとすると, 論理合成(配置配線?)の際にエラーになってしまう.エラーメッセージを読む限り, どうやら RS232_DCE_RXD は送信には使えないということらしい. どうやらRxD(2番ピン)はDCE側では送信になるので, ユーザガイドでは送信(TxD)として命名されているようだ. よっておそらく送信には RS232_DCE_TXD を使えばよい.

しかし問題なのは,ユーザーガイドの回路図のDTE側だ. ユーザーガイドの回路図では,DTEは 2番ピンがTxD(RS232_DTE_TXD), 3番ピンがRxD(RS232_DTE_RXD)となっている. これはへんだ. 上で説明したように,DTEでは送受信の名前の扱いは逆にはならない. なので2番ピンがRxDで受信線,3番ピンがTxDで送信線でいいはずだ. これはへんだ. そもそもこれでは,スタータキットのDCEとDTEをストレートで直結してループバック テストをすることができないはずだ.(送信と送信,受信と受信が接続されてしまう)

スタータキットの回路図(Xilinxのページ のSpartan-3Aスタータキットのページからダウンロードできる (s3astarter_schematic.pdf))を見ると, DTEコネクタは2番ピンが受信線,3番ピンが送信線となっているようだ (DCEコネクタは2番ピンが送信線,3番ピンが受信線となっており,これは問題無し). やはりユーザーガイドの回路図が間違っていて, RS232_DTE_TXDは2番ピンでなく3番ピン, RS232_DTE_RXDは3番ピンでなく2番ピンに接続されているのではなかろうか. UCFファイルでは RS232_DTE_TXD (FPGAのE15ピン)は送信ピンとして定義してある ようなので(RS232_DCE_TXD と同様の定義になっている),単にユーザーガイドの 回路図の間違いのように思える.

で,結局のところ RS232_DCE_TXD を送信に使ったらうまくいった. とりあえずこんなかんじ.

tx.v
tx.ucf

下ボタンを押すことで,DCE端子にデータをだらだらと出力するだけのHDLだ. PCでのシリアル通信は, 9600bps,8ビット,パリティ無し,ストップビット長1ビットというのが 標準的なようなので,それに合わせて書いてある.

実際に起動する前に,PCと接続する.


DCEコネクタをストレートケーブルでPCに接続

ここではPC側にFreeBSD-6.1のPCを利用した.

# cu -s 9600 -l /dev/cuad0
で,シリアルデバイスに接続する. ちなみにWindowsで接続するならば,TeraTermとかでCOMポートに接続すればよい. 接続パラメータをちゃんと合わせるように注意 (まあ標準で既に合っていることが多いと思うけど).


cuでシリアル接続したところ

とりあえず何もデータが送られてきていない状態.

で,FPGAを起動.


ダウンロード直後.まだ何もシリアル送信されていない

下ボタンを押すことで,データを送信する.


下ボタンを押下


PC側にデータが送信されている

とりあえずうまくいった. 送信は決められたクロックで出すだけなので非常に簡単.

次は受信だ.こっちはもうちょっと難しそう.


メールは kozos(アットマーク)kozos.jp まで