EDA-009は、FTDI社のUSB3.0 SuperSpeed FIFOブリッジIC "FT600"を搭載したUSB-FPGAボードです。(Altera Cyclone V搭載)
FT600とFPGA間でデータの送受信を行いましたので、ご参考に手順をお示しします。

USB FPGA FT600 CYCLONE V
 

 FT600は「Multi-Channel FIFO」と「245 Synchronous FIFO」というふたつの動作モードを選択できます。後者のほうがアプリケーションで確認すべき事項が少なそうですので、今回の実験では245 Synchronous FIFOモード(以後、245モード)使用しました。

 FT600用API(D3XX)に関しては下記の資料を参考してください。

AN_379 - D3XX Programmers Guide

 


1.ハンドルの取得

 FT_Create()によりハンドルを取得します。Flagは"FT_OPEN_FT60X_BY_INDEX"を使用しました。問題がなければ0(=FT_OK)が返ります。

FT_Create(&index, FT_OPEN_FT60X_BY_INDEX, &ftHandle);

 


2.チップ情報の取得

 FT_GetChipConfiguration()により、Vendor ID(VID), Product ID(PID)など、チップの情報が正しく取得できるかを確かめます。

下図のように取得できました。VID,PIDがデータシートに示されているデフォルト値とあっている事が確認できます。
 FIFOClock=0(CONFIGURATION_FIFO_CLK_100)なので100MHzが出力されています。

FT_60XCONFIGURATION chipConfig;
FT_GetChipConfiguration(ftHandle, &chipConfig)

 


3.動作モードの変更(チップ情報の書き換え)

 245FIFOモードで動作させるためにはFIFOModeを"FIFO_MODE_245"、ChannelConfigを"CHANNEL_CONFIG_1"としなければならないようです。

先に読み出したchipConfigを書き換えてFT_SetChipConfiguration()で書き込みます。

chipConfig.FIFOMode = CONFIGURATION_FIFO_MODE_245;
chipConfig.ChannelConfig = CONFIGURATION_CHANNEL_CONFIG_1;
FT_SetChipConfiguration(ftHandle, &chipConfig);

動作モードはGPIO[1..0]ピンを使用して設定もできるようですが、執筆時には確かめられていません。

 


4.データの送信 (FT600→FPGA)

 FT_WritePipe()によりデータを送信します。第2引数のPipeIDには0x02を指定します。第6引数のOverlappedにはNULLを指定しておきます。
 Overlapを使用すると非同期動作を行えます。つまりFT_WritePipe関数がデータの送信完了を待ちません。このときの返り値は"FT_IO_PENDING"となります。今回はNULLとしていますので送信完了まで関数から返りません。

FT_WritePipe(ftHandle, 0x02, buff, 10, &bytesTransferred, NULL);

FPGA側での受信波形を示します。FT600から出力した"HuMANDATA*"という10ByteのデータをFPGAで正常に受信できています。


クリックして拡大

 


5.データの受信 (FPGA→FT600)

 FT_ReadPipe()によりデータを受信します。第2引数のPipeIDには0x82を指定します(MSBが方向を示す)。第4引数には受信するバイト数を指定します。今回は4Byteを受信してみます。
 受信待ちをするため、Overlapを使用しました。FT_ReadPipe()から"FT_IO_PENDING"が返った後、FT_GetOverlappedResult()により受信完了をポーリングします。 

ftStatus = FT_ReadPipe(ftHandle, 0x82, buff, 4/*bytes*/, &bytesRead, &overlappedRead);
if(ftStatus == FT_IO_PENDING){
    while(1){
        ftStatus = FT_GetOverlappedResult(ftHandle, &overlappedRead, &bytesRead, FALSE);
        if(ftStatus == FT_IO_INCOMPLETE){
            continue;
        }else if(ftStatus != FT_OK){
            break;
        }else{ //ftStatus == FT_OK
            result = 0;
            break;
        }
    }
}


クリックして拡大

 TXE信号はFT600が受信可能である事を表す出力信号です。FT_ReadPipe()が実行される事でLowとなります。FPGAはTXEがLowであれば押しボタンからの入力(shot)でデータ出力を開始し、TXEのHighで停止します。
 今回4Byteの受信を実行したので、4Byte(2Word)を受信した時点でFT600がTXEをHighとしています。
 アプリケーションでは希望のデータ量を受信できたあとのFT_GetOverlappedResult()の実行でFT_OKが返ります。

4096Byteを受信した際の波形を下記に示します。

・全体


クリックして拡大

・2048Word


クリックして拡大

 

 

お問い合わせについて

 

 弊社では、FPGAそのものの使い方、開発ツールの使い方などは、サポートしておりません。


[kw] 2015-10-09 EDA-009 FTDI USB3.0 FT600


[]