FIFO は、FIFO_RD_CLK、FIFO_RD_EN、FIFO_EMPTY、および FIFO_WRCLK_OUT 信号によって制御されます。FIFO からのデータは Q[7:0] ピンから利用できます。FIFO のビヘイビアーを制御する属性は、RX_DATA_WIDTH および FIFO_SYNC_MODE です。これらは、 表: RXTX_BITSLICE のポート および 表: RXTX_BITSLICE の属性 で説明します。
RX_DATA_WIDTH は、レシーバー全体で使用される属性です。4 に設定すると、FIFO はデータ出力を Q[3:0] ピンで渡し、レシーバーのシリアル入力からの信号が Q5 ピンで利用できます。RX_DATA_WIDTH を 8 に設定すると、FIFO は 8 ビット データを渡し、シリアル データ出力は利用できません。この Q5 シリアル データは RX_BITSLICE および RXTX_BITSLICE でのみサポートされます。ISERDES はサポートされません。
FIFO_SYNC_MODE を FALSE に設定して、FIFO をクロック乗せ換えエレメントとして使用します。このモードにより、インターフェイス クロック ドメインからキャプチャしたデータをインターコネクト ロジックのクロック ドメインへクロスオーバーできます。FIFO 全体の一般的なレイテンシは、2 クロック サイクル (さらに 1 クロックの FIFO イネーブル サイクルをカウントした場合は 3 クロック サイクル) に相当しますが、デザインによっては 8 読み出しクロック サイクルにもなります。 表: FIFO のクロックと制御入力のビヘイビアー に、FIFO のクロックと制御入力のビヘイビアーを示します。
表: FIFO のクロックと制御入力のビヘイビアー で説明したビヘイビアーを、 この図 に示します。
FIFO を使用して、データを複数のレシーバーの Q ピンで揃えます。I/O バンク内で FIFO_WRCLK_OUT を FIFO_RD_CLK として使用する場合、次に従います。
• クロックを受信するビット スライスから最も離れた使用ビット スライスの反転 FIFO_EMPTY 信号を利用します。結果、使用ビット スライスのすべての入力に対して FIFO_WRCLK_OUT がオプションのフリップフロップを介して生成されます。オプションのフリップフロップを使用することで、タイミング要件を満たすことができます。
注記: 「最も離れた」とは、クロック バックボーンの端にあるビット スライスを指します。 この図 に示すように、クロックは byte_2 の下位ニブルに到達し、インターバイトおよびインターニブルのバックボーンを経由して byte_0 の上位ニブルへ渡されます。
• クロック レートが高い場合、タイミングを満たすことが難しくなることがあります。パイプラインを追加して、この問題を解決します。
複数のクロック/ストローブが存在する場合は次のようにします。
• すべての使用ビット スライスの FIFO_EMPTY 信号をオプションのフリップフロップを介してすべての使用ビット スライスの FIFO_RD_EN の入力として処理する NOR ゲートを使用します。オプションのフリップフロップを使用することで、タイミング要件を満たすことができます。
• NOR ゲートは、最後の FIFO_EMPTY 信号が Low に遷移するまで待機し、その後オプションのフリップフロップを介して FIFO_RD_EN をトリガーします ( この図 参照)。
注記:
• スタティック タイミング解析を実行する場合、FIFO_WRCLK_OUT の使用時は生成されたクロックをタイミング制約の一部として指定する必要があります。例として、DATA_WIDTH = 4 (RX_BITSLICE) で、rx_clk_in というポートのサンプル クロックが 500MHz の場合を想定します。さらに、属性 DATA_TYPE = DATA_AND_CLOCK (RX_BITSLICE) および SERIAL_MODE = FALSE (BITSLICE_CONTROL) を用いる、rx_clock_bitslice_inst インスタンス (ニブル位置 0) を想定します。
次のサンプル XDC は、FIFO_WRCLK_OUT ピンに必要なクロックを生成します。
create_clock -name rx_clk -period 2.000 -waveform {0.000 1.000} [get_ports rx_clk_in]
create_generated_clock -divide_by 2 -source [get_ports rx_clk_in] -name fifo_wrclk rx_clock_bitslice_inst/FIFO_WRCLK_OUT
• BITSLICE_CONTROL の VTC_RDY が High になった後にアプリケーション ロジックを FPGA で有効にするのが実践的に優れています。VTC_RDY 信号は、I/O インターフェイスが初期化、起動および実行されていることを示すものです。
• FIFO_WRCLK_OUT クロックは、BUFG クロック バッファーを使用する必要があります。HDL では、FIFO_WRCLK_OUT クロックを FIFO_RD_CLK へ直接接続できますが、Vivado ツールでは BUFG クロック バッファーが自動的に挿入されます。
• すべての RX ビット スライスを同期させるには、RX VTC_RDY 信号がアサートされるまで rx_clk_in (FIFO_RD_CLK) [(上記例では rx_clk_in)] RXCLK を停止する必要があります。
• RX のリセット終了時にユーザーが TX を制御できる場合は、RX VTC_RDY 信号がアサートされるまで RX 部への CLK の供給を停止してください。
• ユーザーが TX 部を制御できない場合は、必要なときにすべてのチャネルが確実にアラインされるように、bitslip モジュールを RX 側に実装する必要があります。
注記 1: シングル クロックまたはシングル ストローブを使用する場合、最も離れたところにあるビット スライスのフリップフロップへの FIFO_EMPTY パスにあるインバーターを NOR ゲートの代わりに使用します。オプションのフリップフロップを使用することで、タイミング要件を満たすことができます。
注記 2: 複数クロックまたは複数ストローブを使用する場合、フリップフロップへのパスにあるすべての使用ビット スライスの FIFO_EMPTY 信号を集めて処理する NOR ゲートを使用します。オプションのフリップフロップを使用することで、タイミング要件を満たすことができます。
この図 と この図 に示すように、FIFO のレイテンシは FIFO_RD_CLK によって異なります。FIFO_RD_CLK に対して書き込みポインターが早く更新された方が FIFO のレイテンシは短くなります。