2024年の今、「FPGAボードで学ぶVerilog HDL」のXilinx Spartan-3Eで遊ぶ (2) シリアル通信 [電子工作・プログラミング]

前回の環境構築で本の内容ができるようになり、LEDと7セグで遊ぶのにも、いい加減お腹一杯という感じになってきました。
そのとき、書籍の付録Dを見ていると、オプションとしてシリアル・ポート (CN6) が用意されていることに気が付きました。本文中には一言も触れられていないのですが、ロジックレベルとRS-232C信号のレベルを変換するIC (SP3222EHCY) が既に実装されており、コネクタさえ自前ではんだ付けすれば、PCなどのRS-232Cに対応するデバイスと通信することができます。
これもまた運良く、僕の使用しているPCには、マザーボード上にピンヘッダとして、シリアル通信ポートが1つ用意されています。そこで、PC側のシリアル通信ポートを引き出し、FPGAボードとの通信を試みました。

部品の入手とはんだ付けを自前で行うべきFPGAボード側のコネクタ、実は推奨の型番についてエラッタが出ています。正しくはオムロンの「XM3B-0922-112」が推奨とのことです。

某電子部品パーツショップのネット注文でさくっと入手し、はんだ付けしました。ついでに、20ピンのピンヘッダ(HD1)と、+5V電源の端子台(CN2)も付けました。外部クロックの入力まではやらないつもりで、SMAコネクタ(HD2)は無しにしました。PROM(U2)も、もはや推奨品は入手が困難そうなので諦めました。

回路記述の方ですが、本文中に一言も触れられていないながら、制約ファイル例には、シリアルポート関連の信号がひっそりと記載されています。(例えばリスト2-2)
NET "TxD" LOC = "P83";
NET "RxD" LOC = "P79";
TxDがFPGAからの出力、RxDがFPGAへの入力です。付録Dの回路図を見ても、確かにそのように結線されています。これらの信号を用いた、テスト用の回路を作成します。

最初に、練習ということで、1文字8ビットのUART送信モジュール(serial_send.v)を作成しました。ACRiの関連のページ(シリアル通信で Hello, FPGA (2))を参考にしながら、ISEに合わせて、Verilogで改めて記述します。



送信モジュールserial_sendは、WEが立ったら8bitのDATA_INをラッチし、UARTで送信します。送信が完了するまで、BUSYを立てます。トップモジュール(コード省略)は、FPGAボードのスイッチが押されたら、適当なデータを送信モジュールに送り、WEを立ててすぐ下げます。

テストベンチによるシミュレーションでUARTの動作を目視で確認しつつ、実機でコンフィグレーションして、PCに接続して動作を見てみます。シリアル通信ソフトで19200bps、データ8bit、パリティ無し、フロー制御無しに設定して、COM1を開いて、FPGAボードのスイッチを押してみます。

動いた!

ので、続いて受信モジュール(serial_recv.v)も作成します。



受信モジュールは、Rxが0になったのを検知したら、ビットレート19200 bpsの半分だけ待ってからその時のRxの値(スタートビットなので必ずゼロのはず)を読み取ります。
続けて、ビットレートの分待ってRxの値を読み取っていき、8bitのDATAとしてまとめて出力します。
受信完了時には、1クロックだけVALIDを立てて、完了を知らせます。
トップモジュールは、PCから送信されたデータをDATAとして受け取りつつ、PCにはDATAをエコーバックする回路とします。送信モジュールは既にできているので、受信モジュールからのDATAとVALIDをそのまま送信モジュールに渡すだけで、エコーバックの回路は作成できます。可視化のために、受け取ったDATAは、書籍の内容で既にお腹一杯遊んだ7セグにも出力します。(コード省略)

改めてシミュレーションでUARTの動作を確認しつつ、実機でコンフィグレーションして、PCに接続して動作を見てみます。シリアル通信ソフトで19200bps、データ8bit、パリティ無し、フロー制御無しに設定して、COM1を開いて、適当にキーボードを押下してみます。

動いた!

これで、FPGAボードがPCとお話しできるようになりました。

5月2日8時48分
fartrip
コメント(0) 

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。