FTDI SuperSpeed-FIFO Bridge FT601を使ってみよう(その2)

前回の「FTDI SuperSpeed-FIFO Bridge FT601を使ってみよう」では、FT601の1channel 245 Syncronous FIFO mode の使い方を紹介しましたが、今回はFT601のMulti Channel FIFO mode の使い方を紹介します。
FT601シリーズの記事:
FTDI SuperSpeed-FIFO Bridge FT601を使ってみよう
FT601を使った通信システムを設計してみよう(その1)
FT601を使った通信システムを設計してみよう(その2)

FIFOモードの設定
データシートによれば、FT601のGPIO端子の論理状態によってFIFOモードを選択できます。

今回は、4 Channel, Multi-Channel FIFO mode の設定にしますので、GPIO端子には双方とも"1"となるようにしました。

ただし、アプリケーションノート(AN370, AN379, A407)を見ますと、FIFOモードはFT01のGPIO端子に加える論理レベルで決定される以外に、FT601内のデバイス・コンフィグレーションROMの設定値によって決定されるようも解釈できるため、どちらが優先されるのか迷います。(デバイス・コンフィグレーションROMの設定値は、FTDI社が提供するコンフィグレーションツールソフトウェア、または、ユーザーが作成するソフトウェアにより設定可能です。)そこで、FTDI社のサポートエンジニアに問い合わせたところ以下の仕様であることが分かりました。

回答:デバイス・コンフィギュレーションがすべてデフォルト値(工場出荷時設定またはコンフィギュレーション・ツールの「Erase Configuration」ボタンで設定)に設定されている場合、デバイスは電源投入時にGPIO[1:0]ピンのみに基づいてFIFOモードを変更します。

このような仕様であることを踏まえた上で、利用環境に応じて設定方法を選ぶことになります。

FIFOモードの種類と特徴
245 Snycrhronous FIFO Mode または 1channel Multi Chanel FIFO Mode を選択しているときは、FT601内蔵のバッファは、送受信ともに4KBが割り当てられます。(*)
2channel Multi Chanel FIFO mode を選択しているときは、FT601内蔵のバッファは、送受信ともに2KBが割り当てられます。(*)
4channel Multi Chanel FIFO mode を選択しているときは、FT601内蔵のバッファは、送受信ともに1KBが割り当てられます。(*)
*:ダブルバッファ構成なのでこの2倍のバッファが割り当てられますがそれを意識する必要はありません。
Multi Chanel FIFO mode を選択しているときは、245 Snycrhronous FIFO Mode 選択時には無い、どのチャンネルの状態が変わったか確認するフェーズがあるため、245 Snycrhronous FIFO Mode選択時に比べるとデータ転送処理にかかるスループットが劣ります。詳しくは"Multi Channel FIFO Modeのプロトコル"の項で見ていきましょう。

ソフトウェアから見たエンドポイントアドレス
ソフトウェアからFT601を通信を行うには、エンドポイントを指定する必要がありますが、各チャンネルの送信用EPと受信用EPのアドレスは次のとおりです。
例えば、4channel Multi Chanel FIFO mode を選択していて、channel3に向けてホストからデータを送信したい場合は、エンドポイントに0x04を指定します。



Multi Channel FIFO modeのプロトコル
245 Snycrhronous FIFO Mode に比べると先述のとおり複雑な処理になっています。

データバス構造:
FT600/FT601のデバイスでは、32ビットのデータバス(DATA[31:0])を使用してデータ転送を行います。このバスは、データ転送中とアイドル状態で異なる動作をします。つまり、このデータバスは役割が二つあるということです。

3フェーズ:
Multi Channel FIFO Modeのプロトコルは、アイドルフェーズ、転送サイクル(コマンドフェーズ、続いて データ転送フェーズ)という3フェーズが成っています。

アイドル状態の動作:
DATA[15:8] がFIFOの状態を示す重要な部分です。具体的には、各ビットがどのチャネルのFIFOが利用可能か、または空きがあるかを示します。バスマスター(FT601を制御するFPGAの回路)は、ここの状態変化を見てどのチャンネルがデータ送受可能か判断します。アイドル状態の時、DATA[15:8] は、アクティブローとして動作します。それぞれのアクティブ時の意味は以下のとおりです。
DATA[15] = 0:OUT チャネル4にデータを送る準備ができている(FIFOにデータあり)。
DATA[14] = 0:OUT チャネル3にデータを送る準備ができている(FIFOにデータあり)。
DATA[13] = 0:OUT チャネル2にデータを送る準備ができている(FIFOにデータあり)。
DATA[12] = 0:OUT チャネル1にデータを送る準備ができている(FIFOにデータあり)。
DATA[11] = 0:IN チャネル4がデータを受け取る準備ができている(FIFOに空きあり)。
DATA[10] = 0:IN チャネル3がデータを受け取る準備ができている(FIFOに空きあり)。
DATA[9] = 0:IN チャネル2データを受け取る準備ができている(FIFOに空きあり)。
DATA[8] = 0:IN チャネル1がデータを受け取る準備ができている(FIFOに空きあり)。

複数のチャンネルで同時にアクティブになり得るため、バスマスターはチャンネルに優先順位をつけてアクティブ時の処理を順に処理を行います。バスマスターはどのチャンネルについて処理すべきか決まったら、転送サイクルに入ります。

転送サイクル:
転送は「コマンドフェーズ」と「データフェーズ」に分かれています。

コマンドフェーズ:
バスマスターが「どのチャネルにデータを送る/受け取るか」を指定します。
DATA[7:0] にチャネル番号を送信し、BE[3:0] で読み取り/書き込みを指示します。(読み取り('h0)または書き込み('h1)をセットする。)
 Channel 1 を指定したいときは、DATA[7:0] の値を 8'h1にします。
 Channel 2 を指定したいときは、DATA[7:0] の値を 8'h2にします。
 Channel 3 を指定したいときは、DATA[7:0] の値を 8'h3にします。
 Channel 4 を指定したいときは、DATA[7:0] の値を 8'h4にします。
同時に、WR_N信号をアサート(='0')して、データトランザクションをリクエストします。

ターンアラウンド(コマンドフェーズ後):
データ転送中の通信方向を制御するため、コマンドフェーズ後にバス信号の方向を切り替える(ターンアラウンド)処理(DATAやBEをHi-Zにする。)が必要になります。データシートのタイミング図を参考にそれを決めます。

データフェーズ:
FIFOステータスに基づき、実際のデータ転送が行われます。
いずれかのチャンネルのOUT 要求に対する処理を行うのであれば、FT601内のバッファからデータを読み出すことになります。FT601のRXF_N信号がアサート(='0')されるのを待ちます。RXF_N信号が'0'になれば、FT601からデータ転送が可能になりクロックに同期して順次データが転送されてきます。
RXF_N信号が'1'に戻れると、FT601の該当エンドポイントから転送できるデータは無くなった事を示すため、WR_N信号をネゲート(='1')します。そして、DATAやBEをDATAやBEをHi-Zにして(データ転送後のターンアラウンド)次のデータ転送に備えます。
※ OUT要求の処理もIN要求の処理も、WR_N(バスマスターから見て出力)とRXF-N(バスマスターから見て入力)を用います。

OUT要求に対する処理タイミング(バスマスターがFT601からデータを読み出すタイミング)


IN要求に対する処理タイミング(バスマスターがFT601からデータを読み出すタイミング)

最後に
データシートをさーっと読んだだけでは、Multi Channel FIFO modeのプロトコルが難しく感じ、理解するのに苦労しました。データシートを読むに先立ち本記事を読むことで理解が容易になるのではと思います。