Fool's チュートリアル -- FPGA ベースの CYUSB3014 双方向通信

I. 概要

      CYUSB3014 は、サイプレスが近年発売した新世代の USB3.0 ペリフェラル コントローラで、USB2.0 の帯域幅制限の問題を解決したり、USB プロトコルとドライバを独自に開発したりできます。Cypress では CYUSB3014 を EZ-USB FX3 と略称しており、柔軟性が高く、開発者は FX3 のファームウェア ライブラリをダウンロードするだけで USB3.0 の機能を使用できます。

      現在、一部の電子製品では、メイン コントローラーと PHY チップを使用する最も一般的な方法は、FPGA + FX3 を使用して USB3.0 インターフェイスを実現することです。

       サイプレスの公式データシートにおける FX3 の説明は次のとおりです。 EZ-USB FX3 には、完全に構成可能な並列汎用プログラマブル インターフェイス GPIF II があり、任意のプロセッサ、ASIC、または FPGA に接続できます。汎用プログラマブル インターフェイスである GPIF II は、サイプレスの主力 USB 2.0 製品である FX2LP に含まれる GPIF の拡張バージョンです。非同期 SRAM、非同期および同期アドレス データ多重化インターフェイス、パラレル ATA などの多くの一般的なインターフェイスに簡単かつシームレスに接続できます。

       EZ-USB FX3 は、USB 3.0 および USB 2.0 物理層 (PHY) と 32 ビット ARM926EJ-S マイクロプロセッサを統合しており、強力なデータ処理能力を備えており、カスタム アプリケーションの構築に使用できます。独創的なアーキテクチャを使用して、GPIF II から USB インターフェイスへの最大 320 MBps[1] のデータ転送速度を実現します。デュアルロールのユースケースを必要とするアプリケーションは、統合された USB 2.0 OTG コントローラーを通じて実装できます。たとえば、EZ-USB FX3 は、MSC および HID クラスのデバイスの OTG ホストとして使用できます。

2. CYUSB3014の内部ロジックブロック図

FX3 の機能は、FPGA/MCU/CPU コントローラーと USB インターフェイス間のブリッジとして機能することです。CPU は GPIF II インターフェイスを介して FX3 に送信する必要があるパラレル データを送信し、FX3 は内部でデータを USB3.0 プロトコルを使用してデータ パケットにパックし、USB 標準インターフェイスを介して外部に送信します。このように、開発者は USB3.0 プロトコルの基礎となるアーキテクチャを習得する必要がなく、UVC プロトコルを使用して USB3.0 インターフェイスを備えたホスト (コンピュータ) にデータを送信することもできます。

    FX3 の内部には、コードとデータを保存するための 512KB オンチップ SRAM を統合した ARM9 コアがあり、JTAG ポート経由でプログラムをプログラミングすることで FX3 を ARM として使用できます。一般的なアプリケーション シナリオは次のとおりです。

3. CYUSB3014のハードウェア構成

電源

FX3 電源には、コア電源、デジタル I/O ポート電源、I/0 アナログ電源の 3 つの部分があります。

コアパワー

  • VDD: ロジックコアの電源電圧。公称電源電圧は 1.2 V です。このドメインはコアロジック回路に電力を供給します。次の場合も同じ電源を使用する必要があります。

  • AVDD: PLL、水晶発振器、およびその他のコアアナログ回路用の 1.2 V 電源。

  • U3TXVDDQ/U3RXVDDQ: USB 3.0 インターフェイス用の 1.2 V 電源電圧。

デジタルI/Oポート電源

  • IO_VDDQ: デジタル I/O 用の独立した電源のセットを指します。電源電圧は1.8V~3.3Vです。EZ-USB FX3 は、デジタル I/O に次の 6 つの独立した電源を提供します。

  • VIO2 - IO2電源

  • VIO3 - IO3電源

  • VIO4 -UART/SPI/I2S 電源

  • VIO5 - I2C および JTAG 電源 (1.2V ~ 3.3V をサポート)

  • CVDDQ - クロック電源電圧ドメイン

I/0 アナログ電源

VBATT/VBUS: USB I/O およびアナログ回路用の 3.2V ~ 6V バッテリ電源。USB トランシーバーは、EZ-USB FX3 の内部電圧レギュレーターを通じて電力が供給されます。VBATT は内部で 3.3V に調整されます。

3.2 設定の開始

CYUSB3014 のスタートアップ コンフィギュレーションは主に PMODE の 3 つのピンによって実現され、PMODE ピンをプルアップ、フローティング、グランドにすることで異なるスタートアップ コンフィギュレーションを実現できます。具体的な方法については、以下の表を参照してください。

クロック構成

FX3 は 2 つのクロック構成をサポートしています。1 つはパッシブ外部水晶発振器を使用する方法、もう 1 つは CLKIN 専用クロック導入に外部クロックを接続する方法です。

一般的な使用方法は、000 に設定し、19.2MHz の水晶発振器を使用することです。

4. GPIFIIインターフェース

GPIFII インターフェースのマニュアルは次のように説明されています。

EZ-USB FX3 は、高性能の汎用プログラマブル インターフェイス GPIF II を備えています。このインターフェイスは、FX2LP の GPIF およびスレーブ FIFO インターフェイスと同様の機能を実装しますが、より高度です。

GPIF II は、業界標準または独自のインターフェイスでマスターまたはスレーブとして使用できる柔軟なインターフェイスを可能にするプログラマブル ステート マシンです。パラレル インターフェイスとシリアル インターフェイスは両方とも GPIF II を介して実装されます。

GPIFⅡの特徴をまとめると以下のようになります。

  • マスターまたはスレーブとして使用可能

  • 256 のファームウェアのプログラム可能な状態を提供

  • 8 ビット、16 ビット、および 32 ビットのパラレル データ バスをサポート

  • インターフェイス周波数は最大 100 MHz です。

  • 32 ビット データ バスを使用する場合、14 個の構成可能な制御ピンがサポートされます。すべての制御ピンは入力/出力または双方向にすることができます。

  • 16/8 ビット データ バスを使用する場合、16 個の構成可能な制御ピンをサポートします。すべての制御ピンは入力/出力または双方向にすることができます。

使用方法は次のとおりです。

上のブロック図は、GPIF II ポートが 32 ビット パラレル データ バスとして使用されることを意味します。A[1:0] の機能は、4 つのバッファ領域のどれが内部で使用されるかを示します。FLAG信号はFX3の内部SLAVE FIFOステータスのフラグ情報です。他のいくつかの信号は制御信号です。

5. 開発環境

  • FPGA 開発ボード (CYUSB3014 チップを含む)

  • 4番目の素数17.1

  • オペレーティングシステムwin10

  • USB3.0インターフェースを備えたコンピューター

  • CYUSB3014 チップを搭載した FPGA 開発ボードがこのチュートリアルを参照できる限り

6. 準備

バッファはファームウェアによって構成できます。上の図は 2 つのキャッシュを示しており、各バッファは 1kB です。パフォーマンスを向上させるために、ファームウェアで 4 つのキャッシュを設定し、各バッファは 16KB です。データ バスは 32 ビット幅で、クロックは測定されたアップリンクおよびダウンリンク通信は 338MB/s に達します。

  • CYUSB3014 チップと fpga 間の接続は GPIF インターフェイスを使用します。CYUSB3014 を FIFO として使用するだけで済みます。

 

 

  • セブン、ドライブ

  • まず、FX3_SDK_Windows_v1.3.3 をインストールします。このソフトウェアのインストール ディレクトリは、以下 SDK と呼ばれます

  • SDK ディレクトリには、多くのドキュメント、ファームウェアのサンプル、対応するドライバーが含まれています

  • テストの前に、サイプレスが提供する USB ドライバーをインストールする必要があります。USB を接続すると、コンピューターは認識されないデバイスを検出します。このとき、デバイス マネージャーを開いて、認識されない USB を右クリックし、ドライバーを手動で選択します。 。

  • 8. ファームウェア

  • ファームウェアについては、興味のある方はご自身で勉強していただくこともできますし、使用するだけであれば、このチュートリアルで提供されているファームウェアをそのまま使用することも可能です。この例のファームウェアを使用すると、すべてスレーブ FIFO モジュールであるため、基本的に USB2.0 として使用できます。

  • 大騒ぎしたい場合は、フラグ信号の設定に注意する必要がありますが、USB フラグ信号はより柔軟です。以下ではフラグ信号の設定を中心に説明します。

  • 九、GPIF II デザイナー

  • サイプレスは gpif インターフェイス信号 (フラグ信号を含む) を設定するために使用できるソフトウェアを公式に提供しています。このチュートリアルはスレーブ fifo のみを対象としており、他のモードは自分で見ることができます。

  1. GPIF II ソフトウェアを開きます

     

 

 

  2. 赤い丸をクリックします

3. さらに情報を編集するには、「ファイル」->「プロジェクトを編集可能として保存…」をクリックします。

4. 上図に従って編集エリアが設定されます. 右側のブロック図は主にフラグ信号 FLAGA/FLAGB/FLAGC/FLAGD を設定するためのものです. 右側のフラグをダブルクリックすると、フラグの設定は次のようになります: 

 

 

 

5. 4 つのフラグはすべて低効果に設定されています。初期値は関係なく、すべて特殊なフラグとして設定されているので、設定後は必要なヘッダファイルをコンパイルして生成するだけです。

 

6. この .h ファイルをファームウェア プロジェクトに配置し、ファームウェアの対応する .h ファイルを置き換えます。

 

 

7. これらはこのプロジェクトで行われており、特別な必要がない場合は、このプロジェクトが提供するファームウェア プロジェクトを直接使用するだけでよく、GPIF インターフェイスを自分で設計する必要はありません。

  • 10 書き込みサイン

  • flag_a と flag_b はスレッド 0 (P2U、つまり FPGA が CYUSB3014 に書き込む) の特殊フラグとして設定されます。flag_b はウォーターマーク値フラグです。

  • 書き込みがフルになると、通常の flag_a は Low に引き下げられますが、プルダウン時間が少し遅いため、fpga は flag_a が Low であることを検出し、オーバーフローが書き込まれ、flag_b のウォーターマーク値がfpga が検出できるように、事前にフラグをプルダウンしておきます。flag_b が Low になるまで、書き込みオーバーフローは発生しません。

 

slwr 信号はフラグに従って駆動されるため、ウォーターマーク値 flag がない場合は flag_a を使用し、flag_a == 0 が検出された場合に slwr を High にプルすると、書き込みオーバーフローが発生しますか? 上の図から、要件を満たすためには 4 サイクル前に flag_a を下げるだけでよいことがわかります。したがって、ウォーターマーク値を 4 に設定します。時間が来たら、signal_tap によってキャプチャされた画像を見てください。

CyU3PGpifSocketConfigure ウォーターマーク値を設定する

  • サインを読む

  • flag_c と flag_d はスレッド 3 (U2P、つまり FPGA が CYUSB3014 から読み取る) の特別なフラグとして設定されます。flag_d はウォーターマーク値を持つフラグです。

  • 空を読み取る場合、通常の flag_c は Low に引き下げられますが、プルダウン時間が少し遅いため、fpga は flag_a が Low であることを検出し、すでに空を読み取っており、flag_d のウォーターマーク値によってフラグが Low に引き下げられる可能性があります。事前に fpga が flag_b が Low になるまで検出できるように、空の読み取りは発生しません。

  • 書き込み動作と同様に、slrd 信号はフラグに従って駆動されます。ウォーターマーク値フラグがない場合は flag_c を使用し、flag_c == 0 が検出された場合に slrd を High にプルすると、空に読み取られますか? 上の図から、要件を満たすためには事前に flag_c を 3 サイクル下げるだけでよいことがわかります。したがって、ウォーターマーク値を 3 に設定します。時間が来たら、signal_tap によってキャプチャされた画像を見てください。

  • さらに、重要な点は、fifo_addr からデータが有効になるまでに 3 サイクルの遅延があることです。

  •  ezUsbSuite.exeを開きます

     

  • このチュートリアルで提供されるファームウェア プロジェクトをインポートします

  •  

     

     

     

     

    最後に、FIFO サイズが 16k、P2U バッファが 8、U2P バッファが 4 に設定されていることを思い出してください。この構成により、伝送速度を最大化できます。なお、書き込みでも読み取りでも単位は16k、つまり4バイトのコマンドを送るだけでも16kバイト送らなければならず、0であれば0を送れば良いことになります。冗長です。

  •  

  • 設定後、コンパイルして要点を描画すると、デバッグでのコンパイル速度は約252MB/s、リリースでのコンパイル速度は約338MB/sとなった。

  • テスト

  • このチュートリアルで提供されるファームウェアは、読み取りと書き込みの両方をサポートしています。

  • ファームウェアをダウンロードする

  • デバッグ中は、まずブート方法を USB ブートに設定します。

 

 

 

  • 読み取りテスト

  • このチュートリアルで提供されている fpga プログラムを開き、slrd 立ち下がりエッジ トリガーを設定します。

  •  

     

  • 読み取りバッファのサイズは 16k バイトであり、送信するデータは通常一部の命令であるため、データ量は比較的少ないため、データ構造を調整しました。最初の 4 バイトは、送信するデータの長さになります。 (32 ビット) を送信したい場合、fpga には cmd_flag 信号と cmd_data 信号があり、これら 2 つの信号に従って読み出しデータがわかります。詳細については私のコードを参照してください。

  • テストを書く

 

 

  • テストの作成は簡単です。「データの転送」をクリックすると、PC は 16k データを読み取ります。データは0~16'h0000_0FFFです。

  • スピードテスト

  • ストリーマー ソフトウェアを開く

 

 

 

読み取りおよび書き込み速度がほぼ約 338MB/s であることがわかります。パフォーマンスは依然として良好です。 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/mochenbaobei/article/details/131321493