この手順では、FIFO を使用してサブシステム間に非同期チャネルをインプリメントします。FIFO のデータは入力された順に処理され、制御信号により有効なデータがある場合にのみデータが読み出され、スペースがある場合にのみデータが書き込まれるよう制御されます。FIFO が空またはフルになると、制御信号がシステムを停止します。このデザインでは、入力は常に書き込み可能であり、FIFO がフルの場合の要件を考慮する必要はありません。
このデザインには、FIFO が必要なデータパスが 2 つあります。
- CTRL から Gain Control へのデータ。
- DDC から Gain Control へのデータ。
- キャンバスのどこかを右クリックし、Xilinx BlockAdd をクリックします。
- [Add Block] ダイアログ ボックスに「
FIFO
」と入力します。 - FIFO を選択してデザインに追加します。
- データパスを FIFO インスタンスを介して接続します。既存の接続を解除してから実行します。
-
CTRL/Out1
をFIFO/din
に接続します。 -
FIFO/dout
をGain Control/In1
に接続します。
-
- FIFO インスタンスのコピーを作成します (Ctrl + C および Ctrl + V キーを使用)。
- データパスを FIFO1 インスタンスを介して接続します。既存の接続を解除してから実行します。
-
DDC/Out2
をFIFO1/din
に接続します。 -
FIFO1/dout
をGain Control/In3
に接続します。
異なるドメイン間のデータが接続され、デザインが次の図に示すようになります。
次に、制御ロジック信号を接続してデータがドメイン間で安全に転送されるようにします。
- CTRL ブロックからライト イネーブルが必要です。この信号は存在していないので、作成する必要があります。
- DDC ブロックからライト イネーブルが必要です。これには、最終 FIR 段からの
data_tvalid
を使用できます。 - Gain Control で両方の FIFO のリード イネーブルを生成する必要があります。FIFO の Empty 信号を使用し、これを反転します。データがある場合は、このブロックが読み出します。
-
- CTRL ブロックをダブルクリックし、サブシステムを開きます。
- キャンバスを右クリックし、Xilinx BlockAdd をクリックして次のブロックを追加します。
- Delay (ザイリンクス)
- Relational
- Out1 インスタンスのコピーを作成します (Ctrl + C および Ctrl + V キーを使用)。
- Relational ブロックをダブルクリックし、プロパティ エディターを開きます。
- [Comparison] ドロップダウン リストから a!=b を選択し、OK をクリックします。
- ブロックを次の図に示すように接続します。
Out2 に出力ストローブが作成されます。出力ストローブは、入力が変化したときに 1 サイクル間アクティブになり、CTRL から Gain Control (最上位の FIFO ブロック) へのライト イネーブルとして使用されます。
- Up to Parent ツールバー ボタン をクリックし、最上位に戻ります。
- Gain Control インスタンスをダブルクリックし、サブシステムを開きます。
- キャンバスを右クリックし、Xilinx BlockAdd をクリックして次のブロックを追加します。
- Inverter
- Inverter (合計 2 個のインバーター)
- Delay (ザイリンクス)
- Out1 インスタンスのコピー
Out3
を作成します (Ctrl + C および Ctrl + V キーを使用)。- Out3 を
DDC_Read
という名前に変更します。
- Out3 を
- Out1 インスタンスのコピー
Out3
を作成します (Ctrl + C および Ctrl + V キーを使用)。- Out3 を
CTRL_Read
という名前に変更します。
- Out3 を
- In1 インスタンスのコピー
In4
を作成します (Ctrl + C および Ctrl + V キーを使用)。- In4 を
CTRL_Empty
という名前に変更します。
- In4 を
- ブロックを次の図に示すように接続します。
- Gain Control FIFO (FIFO) ブロックからの FIFO Empty 信号は、最上位 DDC FIFO (FIFO1) のリード イネーブルを作成するのに使用した Inverter ブロックです。FIFO が空でなければ、データが読み出されます。
- 同様に、最上位 DDC FIFO (FIFO1) からの FIFO Empty 信号が反転され、FIFO のリード イネーブルが作成されています。
- この同じ信号は、新しい
data_tvalid
(以前は In2) として使用されます。ただし、FIFO のレイテンシは 1 なので、この信号を遅延させて制御信号が FIFO により 1 遅延されたデータと正しく揃うようにします。
-
Up to Parent ツールバー ボタン
をクリックして最上位に戻ります。
最上位に制御信号が含まれています。
接続を完成させます。
- 制御パスを FIFO インスタンスを介して接続します。既存の接続を解除してから実行します。
-
CTRL/Out2
をFIFO/we
に接続します。 -
FIFO/empty
をGain Control/CTRL_Empty
に接続します。 -
Gain Control/CTRL_Read
をFIFO/re
に接続します。
-
- 制御パスを FIFO1 インスタンスを介して接続します。既存の接続を解除してから実行します。
-
DDC/Out1
をFIFO1/we
に接続します。 -
FIFO1/empty
をGain Control/In2
に接続します。 -
Gain Control/DDC_Read
をFIFO1/re
に接続します。
-
- [Run simulation] ボタンをクリックしてデザインをシミュレーションし、正しく動作することを確認します。手順 1 ~ 4 の結果と同じになります。
次の手順では、各階層に個別のクロック ドメインを指定する方法を学びます。