”FPGAで遊んでみる”では、セミナー用に作成したサンプル回路などを整理して少しづつ紹介していきます。


セミナ開催します
手ぶらでOK!実習・Raspberry Pi PicoW×MicroPython I/Oデバイス「時短」開発入門
-- 133MHz ARM Cortex-M0マイコンをPythonでプログラミング 
2024年12月6日(金)CQ出版社セミナルーム CQ出版社セミナ・ルーム
詳しくはこちらへ

ZYBOの本
FPGAパソコンZYBOで作るLinux I/Oミニコンピュータ CQ出版 発売中

Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中

第3回 FPGAとパソコンをシリアル通信させてみる

 今回は、実用的なサンプルということでシリアル通信回路(RS-232C相当)を紹介します。
FPGAとシリアル通信できるとパソコンからターミナルソフトを通しFPGAへ指示を送ったり
メッセージを受け取ったりできます。

シリアル回路のソース(rs232c_tx_rx.v zip形式で圧縮してあります)

rs232c_tx_rxzip

ソースコードが長いのダウンロードして中身を見てください。

仕様説明

 動作概要
  シリアル通信(RS-232C相当)を行います。
  シリアル通信の設定:115200bps,8bit、パリティなし

 入力信号
  CLK:クロック入力/今回使用してたボードにあわせて40MHz
  RESETB:リセット入力/0でリセット。
  RXD:シリアル通信受信信号 通信ポートへ
  TX_DATA:送信用データ
  TX_DATA_EN:TX_DATAのイネーブル 1で有効

 出力信号
  TXD:シリアル通信送信信号 通信ポートへ
  RX_DATA:受信信データ、RX_DATA_EN0->1の時変化、その以降は値を保持
  RX_DATA_EN:RX_DATAのイネーブル 1で有効
  TX_BUSY:送信ビジー/シリアル通信送信中、TX_DATAは受付できない
  RX_BUSY:受信ビジー/シリアル通信受信中

 パラメータ
  lp_bit_end_count:シリアル通信1bitの時間のカウント値
    今回はclk周波数=40MHz、通信レート=115,200bpsなので
    346となっています
    算出方法は
     シリアル通信1bitの時間=8,680.5nS≒1,000,000,000nS/115200
     40MHzの周期=25ns
     シリアル通信1bitのクロック数=347=シリアル通信1bitの時間/40MHzの周期
     シリアル通信1bitの時間のカウント値=346=シリアル通信1bitのクロック数-1

   入力CLK周波数、通信レートが値が違う場合は値を変更してください。

 詳細動作
 送信時の動作
 TX_DATA_EN=1の時にTX_DATAを取り込み、TXDへ送信します。
 TXDの内容
 1bit目 スタートビット=0
 2bit目 TX_DATA[0]
 3bit目 TX_DATA[1]
 4bit目 TX_DATA[2]
 5bit目 TX_DATA[3]
 6bit目 TX_DATA[4]
 7bit目 TX_DATA[5]
 8bit目 TX_DATA[6]
 9bit目 TX_DATA[7]
 10bit目 ストップビット=1
 
 送信が開始されるとTX_BUSY=1になりこの間は、新しいTX_DATAを入力できない。

 波形
 


 受信時
 受信待機状態でRXDが1→0と変化した時に受信開始
 1bit区間の中央でRXDの値を取り込む。
 9bit目まで取り込みが終わりとRD_DATAを出力してRX_DATA_EN=1とする。
 RXDの内容
 1bit目 スタートビット=0
 2bit目 RX_DATA[0]
 3bit目 RX_DATA[1]
 4bit目 RX_DATA[2]
 5bit目 RX_DATA[3]
 6bit目 RX_DATA[4]
 7bit目 RX_DATA[5]
 8bit目 RX_DATA[6]
 9bit目 RX_DATA[7]
 10bit目 ストップビット=1

 受信中はRX_BUSY=1となる。

 波形
 


FPGAでの動作確認
 
 トップモジュール追加
 rs232c_tx_rx.vだけですと、RX_DATA,TX_DATAを扱う回路がありませんので、動作確認では、
 RX_DATAをTX_DATAへ折り返すトップモジュールを作成しました。折り返しだけであれば、シリアル通信信号のTXDとRXDを
 接続しただけでも機能してしますので、受信データのLSB(RX_DATA[0])をLEDに接続してあります。LEDの点滅でFPGA内部で
 折り返していること確認してみます。

 トップモジュールの記述

module rs232c_led(
RESETB, 
CLK,
TXD,
RXD,
LED_0              
);
//            PIN NAME         description        
input         RESETB;         // power on reset    
input         CLK;         // main clk          
//                                      
output        TXD;         //serial tx data    
input         RXD;         //serial rx data
//
output        LED_0        ;        
//   
wire  [7:0]RX_DATA;        //rx data 8bit
wire       RX_DATA_EN;     //rx data enable 
wire       RX_BUSY;        //rx busy
wire       TX_BUSY;        //tx busy
//
assign  LED_0 = RX_DATA[0];
   
rs232c_tx_rx  rs232c_tx_rx(
.RESETB(      RESETB),      
.CLK(        CLK),           
.TXD(        TXD),           
.RXD(        RXD),           
.TX_DATA(     RX_DATA),     
.TX_DATA_EN(  RX_DATA_EN),  
.TX_BUSY(     TX_BUSY),     
.RX_DATA(     RX_DATA),     
.RX_DATA_EN(  RX_DATA_EN),  
.RX_BUSY( RX_BUSY)) ;
   
endmodule


 FT2232Dモジュールとの接続

 第1回で紹介したFT2232DモジュールとMFPGA_SPAR3Eを接続してPC上のターミナルと通信してみます。
 FT2232DのAch側はFPGAのコンフィグレーションに使用するので、シリアル通信にはBch側を使用します。
 FPGAのRXD(PIN_2)とFT2232DのBD0(TXD)を接続、
 FPGAのTXD(PIN_3)とFT2232DのBD1(RXD)を接続します。
 ボード間の実際の接続は
 FPGAボードのA01とFT2232DモジュールのBD0の間、
 FPGAボードのB01とFT2232DモジュールのBD1の間をジャンパー線で繋いでします。

 接続図
 

 FT2232Dモジュールを使わない場合にPCのCOMポートとFPGAのTXD,RXDは電位が違うので直接は接続できません。
 PCのCOMポートと接続する場合は、AMD3202などのRS232C用のレベル変換ICを介して接続してください。


 ターミナルソフトの設定

 シリアル通信の通信相手のPC上のターミナルソフトの設定をハイパーターミナルを例に紹介します。
 接続先の設定
 FT2232Dモジュールを接続すると2個のCOMポートが追加されます。小さいい番号がAchでFPGAのコンフィグレーションに使用します。
 大きい番号がBchで、ターミナルの接続先はこちらになります。
 
 手元の環境では、COM17,COM18が追加されたので、ターミナルはCOM18に接続しました。

 次に通信設定です。rs232c_tx_rx.vに合わせて設定します。
 


 動作の様子

 FPGAをコンフィグレーションして、ハイパーターミナルを接続した様子です。
 "1”を入力するとasciiコードで0x31でlsbが"H"なのでLEDが消灯、
 "0”を入力するとasciiコードで0x30でlsbが"L"なのでLEDが点灯します。、
 ターミナルに表示されている文字はFPGAから折り返してしたデータが表示されています。



紹介した回路を試す場合は、自己責任でお願いします。
次回は、SVGAへグラフィック表示するモジュールを紹介する予定です。

リンクフリーです。
リンクされた場合にご連絡をいただけると嬉しです。
メール 


変更履歴
(2010/09/14) 初版
(2010/10/16) 項目の先頭にを追加


TOPへ戻る