FX3 GPIF

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
youm_4511561
Level 1
Level 1
First question asked First reply posted First like given

AN65974の「5.3 Synchronous Slave FIFO Write Sequence」を参照しています
 DMA バッファ サイズが1024Byte、バッファ数1個の場合

①PKTEND#信号の扱いについて
 ショートパケット,ZLPではPKTEND#信号をアサートするとすることで転送開始する
 とありますが、1024Byte転送する場合は、FIFOに1024Byteデータを書き込みFULLになると
 自動で転送開始するのでしょうか?それとも、この場合もPKTEND#信号をアサートしないと
 転送は開始されないのでしょうか?

②1024Byteのデータを転送後、続けて512Byteを転送する場合は、FIFOに1024Byteデータを書き込み
 転送を開始し、FIFO FULLのフラグ(FLAGA)が1(FULLでない)になったら512Byteのデータを
 すこしずつセットしていけばよいですか。
 また、FIFOFULLのフラグ(FLAGA)が1(FULLでない)になるのはどのタイミングでしょうか

③AN65974の「図11. デュアルソケットにより継ぎ目のない転送を実現する」
 のサンプルコードはあるでしょうか

0 Likes
1 Solution

A2 cont'd:

FIFOのFullについてですが、ご認識は正しいです。

Full信号はFullではなくなった時(1023以下になったら)de-assertされます。

ただし、通常はAN65974で描かれているように2つ以上のDMAバッファを用意し、DMAバッファがFullになってプロデューサがDMA転送を実施した際、すぐに空のDMAバッファを参照するようにFX3内部で切り替えられます。それにより、Full信号はすぐにde-assertされます。

FYI:

 DMA転送をする際、送信する側はプロデューサ側、受信する側はコンシューマ側と定義されています。

 Slave FIFO Interfaceを使用される際、FPGA等からSlave FIFOを経由してUSBホストにデータが送られる動作(IN転送)を例として以下説明致します。

  FPGA-> Slave FIFOへデータが送られます。その内容がDMAバッファに送られます。この送る側(GPIF II側. FX3内のブロックとしてPIBと定義されています)がプロデューサになります。

  DMAバッファはFullになった段階、またはPKTEND#を受け取った段階で、コミットします。データはUSB側(FX3内のブロックとしてUIBと定義されています)にDMA転送で送られ、最終的にUSB EPと通信するわけですが、このUIB側がコンシューマになります。

 (逆に、USB側からデータが送られ、それがSlave FIFOを経由してFPGA等へ送られる場合であれば、UIBがプロデューサ側、PIBがコンシューマ側になります。)

 上記はざっくりとした説明であるため、詳細はTRM等をご参照ください。https://www.cypress.com/documentation/technical-reference-manuals/ez-usb-fx3-technical-reference-man...

A3 cont'd:

AN75705「EZ-USB FX3入門」ですね。

この動作はAN75779のサンプルプロジェクトにて実装されております。

https://www.cypress.com/documentation/application-notes/an75779-how-implement-image-sensor-interface...

よろしくお願い致します。

Hirotaka Takayama

View solution in original post

3 Replies
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

Cypress Developer Communityをご利用いただきありがとうございます。

A1: PKTENDをassertするのは、ショートパケットまたはZLPの場合のみでございます。

バッファが満たされれば(Fullになれば)PKTENDなしに転送がされます。

A2:

FullになったDMAバッファの内容がコンシューマ側にコミットされれば(または複数バッファが用意された場合はすぐに別のバッファが有効になることで)、FIFO FullのフラグがFullではなくなります。

FPGA等からSlave FIFOに書き込みを行う場合、FIFO Fullフラグの状態を見ながら書き込んでいくことになります。

A3回答にも記述していますが、サンプルがございますのでご参照ください。AN65974の"11.4  FPGA Implementation Details "にいくつかの例が記述されております。

A3: すみません、どちらの図に対しての要求でしょうか。文書番号を教えていただけますか?

AN65974のサンプルコードは https://www.cypress.com/documentation/application-notes/an65974-designing-ez-usb-fx3-slave-fifo-inte...

にございます。FPGA側のサンプルコード(VerilogとVHDL)もございます。

よろしくお願い致します。

Hirotaka Takayama

回答ありがとうございます。

DMA バッファ サイズが1024Byte、バッファ数1個の場合

A2:

「コンシューマ側にコミット」とはどういった状態でしょうか。

FIFOなので1024Byte書き込みFIFO Fullになり転送が開始されるとFIFOのカウンターが1024→1023→1022・・・・→0

となるイメージがあります。その場合、「1023」でFullで無くなる、又は0でFullで無くなる、それ以外、のどれでしょうか

A3:文書番号: 001-85370 Rev. *Dとなります。

     無題.png

0 Likes

A2 cont'd:

FIFOのFullについてですが、ご認識は正しいです。

Full信号はFullではなくなった時(1023以下になったら)de-assertされます。

ただし、通常はAN65974で描かれているように2つ以上のDMAバッファを用意し、DMAバッファがFullになってプロデューサがDMA転送を実施した際、すぐに空のDMAバッファを参照するようにFX3内部で切り替えられます。それにより、Full信号はすぐにde-assertされます。

FYI:

 DMA転送をする際、送信する側はプロデューサ側、受信する側はコンシューマ側と定義されています。

 Slave FIFO Interfaceを使用される際、FPGA等からSlave FIFOを経由してUSBホストにデータが送られる動作(IN転送)を例として以下説明致します。

  FPGA-> Slave FIFOへデータが送られます。その内容がDMAバッファに送られます。この送る側(GPIF II側. FX3内のブロックとしてPIBと定義されています)がプロデューサになります。

  DMAバッファはFullになった段階、またはPKTEND#を受け取った段階で、コミットします。データはUSB側(FX3内のブロックとしてUIBと定義されています)にDMA転送で送られ、最終的にUSB EPと通信するわけですが、このUIB側がコンシューマになります。

 (逆に、USB側からデータが送られ、それがSlave FIFOを経由してFPGA等へ送られる場合であれば、UIBがプロデューサ側、PIBがコンシューマ側になります。)

 上記はざっくりとした説明であるため、詳細はTRM等をご参照ください。https://www.cypress.com/documentation/technical-reference-manuals/ez-usb-fx3-technical-reference-man...

A3 cont'd:

AN75705「EZ-USB FX3入門」ですね。

この動作はAN75779のサンプルプロジェクトにて実装されております。

https://www.cypress.com/documentation/application-notes/an75779-how-implement-image-sensor-interface...

よろしくお願い致します。

Hirotaka Takayama