ハンドシェイク信号を使用してタイミングのスケジュールを作成する
- 更新日2025-03-06
- 11分で読める
ハンドシェイクとは、継続した通信を行うためのパラメータを確立する、2つのノード間の通信のことです。シングルサイクルタイミングループの指定されたブロックダイアグラムノード F では、ハンドシェイクが動作の発生するタイミングを決定します。
- F は先行ノードからのデータを破棄します。先行ノードは F にデータを送信するノードです。
- F は先行ノードからのデータを受け入れます。
- 後続ノードは F からのデータを破棄します。後続ノードは F からデータを受信するノードです。
- 後続ノードは F からのデータを受け入れます。
マルチサイクルノードでは有効なデータの計算に複数のサイクルが必要ですが、シングルサイクルタイミングループはこれらのノードが各クロックサイクルでデータを返すように強制するため、シングルサイクルタイミングループではハンドシェイクが必要です。そのため、マルチサイクルノードは各クロックサイクルで有効なデータを返しません。アルゴリズムの数値的有効性を確認するには、このデータに依存するノードがデータが有効か無効であるかを認識する必要があります。
NIは、シングルサイクルタイミングループの内側で特定のノードと使用できるハンドシェイクプロトコルを構築しました。このプロトコルには、以下の端子が含まれます。
- 入力有効—次に処理するデータポイントを受信したことを示します。
- 出力有効—ノードが生成したデータポイントが有効であり、後続ノードにより処理される準備ができていることを示します。
- 出力準備完了—後続ノードで新規データポイントの受け入れが可能かどうかを示します。
- 入力準備完了—次のクロックサイクルでノードが新規データの受け入れが可能かどうかを示します。
単一入力ノードが有効なデータを使用することを確認する
先行の関数 U 、関数 F 、後続の関数 D の3つの単一入力関数をシングルサイクルタイミングループで使用する場合を考えます。これらの関数は、入力値xを取得して、特定のクロックサイクル数の後に出力データを生成します。以下の図は、U 、F 、および D を配線して、NIが推奨するハンドシェイクプロトコルを使用する方法を示します。
上記の図では、ワイヤ上の数値は以下の手順に対応します。
- U が有効な値を F に送信すると、F の入力有効端子の値はTRUEになります。TRUEは、U が有効な出力値を生成し、この値を F に送信することを示します。この論理を使用するには、U の出力有効端子を F の入力有効端子に配線します。これにより、F は U が有効な出力値をいつ生成したか認識します。
- F の入力有効端子がTRUEを受信した後に、F は結果の計算を開始します。F が結果を計算している間、F の出力有効はFALSEを返します。出力有効端子は、以下の両方の条件が満たされる場合にTRUEを返します。
- F が結果の計算を開始してからL fクロックサイクル以上経過した場合。L fは Fのレイテンシです。関数のレイテンシは、関数の構成ダイアログボックスで表示できます。関数をダブルクリックして、このダイアログボックスにアクセスします。
- F の出力準備完了端子がTRUEの場合。この端子は、D で F の入力値を受け入れる準備が完了すると F に通知します。この論理を使用するには、フィードバックノードを介して D の入力準備完了端子を F の出力準備完了端子に配線します。デフォルトでは、フィードバックノードの実行には1クロックサイクルかかるため、 F は D が送信した1クロックサイクル後にこの値を受信します。
- Fの出力有効端子をDの入力有効端子に配線した場合、D は F が有効な値を生成したことを認識し、D にこの値を送信します。この論理は、上記の手順1の論理と同じです。F が先行の関数になる以外は、D にも同じ手順が繰り返されます。
- 次のクロックサイクルで F が他の有効な入力データを受信できる場合、F の入力準備完了端子はTRUEを返します。この論理を使用するには、フィードバックノードを介して F の入力準備完了端子を U の出力準備完了端子に配線します。これにより、U は F で新規入力値の受け入れ準備が完了したことを認識します。デフォルトでは、フィードバックノードの実行には1クロックサイクルかかるため、 F は D が送信した1クロックサイクル後にこの情報を受信します。
| ヒント 高スループットレートを確立するには、F のスループット制御器に小さな値を入力します。F が有効な入力を受信し、結果の計算を開始した後に F が他の有効な入力を受信するには、少なくとも T f クロックサイクル以上経過している必要があります。ここで、T fは、F のスループット制御器の値です。そのため、スループット制御器の値が小さいと、大きなスループット値を指定した場合よりも速く F が他の有効な入力データを受信できます。また、小さなスループット値を使用すると、大きなスループット値を使用する場合よりも F の入力準備完了端子がTRUEを速く返すことができます。 |
複数入力ノードが有効なデータを使用することを確認する
「高スループット加算」関数には、xおよびyの2つの入力が含まれるため複数入力関数です。シングルサイクルタイミングループでは、同じクロックサイクルでxとyの両方が有効であることを確認する必要があります。1つの入力が有効でもう1つの入力が無効な場合、この関数は有効な入力値と無効な入力値をそれぞれ使用して出力データを計算してしまいます。
同じクロックサイクルで有効なxとyが受信されることを確認するには、xに送り込まれるすべてのノードのレイテンシの合計を求めます。その後、yに送り込まれるすべてのノードのレイテンシの合計を求めます。2つのレイテンシの合計は等しい必要があります。レイテンシの合計が異なる場合は、短い方のパス (レイテンシの合計が小さい方) にxとyパスのレイテンシの合計が等しくなるまでフィードバックノードを追加します。
複数入力ハンドシェイクアプリケーションでレイテンシパスを調整する方法を示すサンプルについては、labview\examples\target_type \FPGA Fundamentals\FPGA Math and Analysis\High-Throughput Math\Vector Normalization\Vector Normalization.lvprojを参照してください。target_typeは、インストールしたドライバによってCompactRIOまたはRシリーズになります。
ハンドシェイク端子をサポートするノード
以下のノードはハンドシェイク端子をサポートします。
- 「FFT」Express VI
- ハンドシェイクメソッドノード
- 「基本要素」関数を除く、「高スループット数学」関数
- 線形代数関数
- DRAM用に構成される時のメモリメソッドノード
- ハンドシェイクインタフェースを有効にしたFIFOメソッドノード
- 「有理リサンプル」Express VI
- 「スケールされた窓」Express VI
- ユーザ制御I/Oサンプル関数
複数チャンネルのハンドシェイクをサポートするノード
以下のノードは複数チャンネルを使用したハンドシェイクをサポートします。
- 「有理リサンプル」Express VI
複数チャンネルのノードの場合、最初の有効データが最初のチャンネルに、2番目の有効データが2番目のチャンネルに、というようにデータがチャンネルへ順番に渡されるように、LabVIEWは値をインタリーブします。入力有効端子がチャンネルスキャン中にFALSEになる場合、以下の図が示すように、次に有効な入力がシーケンスの次のチャンネルに即時に適用されます。
この図で、d0、d1、およびd2はデータを受信する3つのチャンネルです。入力有効端子がFALSEになった後に再びTRUEになるたびに、後に続く有効なデータがシーケンスの次のチャンネルに即時に適用されることに注目してください。
最速許容スループットレートを決定する
シングルサイクルタイミングループの内側で接続される一連のノードの場合、最速スループットレートは、経過した後に一連のノードにより多くのデータを送信できる最小クロックサイクル数を示します。最速スループットレートは、最遅ノード (スループット制御器の値が最大のノード) のスループットレートと等しくなります。このノードは、一連のすべてのノードのボトルネックです。システムがこの最速レートよりも速いレートでこの一連のノードにデータを送信すると (システムが最小許容クロックサイクル数より少ないクロックサイクル数を待機して、一連のノードにデータを送信する)、LabVIEWはデータを破棄します。
一連のノードの最速スループットレートを決定するには、まずはノードのスループット制御器を確認して各ノードのスループットレートを判断します。ノードをダブルクリックするか、ノードの詳細ヘルプウィンドウを表示することで、この制御器を確認できます。最大値 (最遅ノード) が含まれるスループット制御器は、システムがこの一連の関数にデータを送信できる最速レート (最小サイクル数) です。
たとえば、一連のノードの最遅ノードのスループットレートが32サイクル/サンプル、FPGAターゲットのクロックレートが40 MHz、入力サンプリングレートが2 MS/sの場合があります。システムのスループットレートは、「クロックレート/入力サンプリングレート」で求めることができ、結果は40,000,000サンプルまたは20サイクル/サンプルです。この場合、システムは20サイクルごとに一連のノードにデータを送信し、32サイクルの最速スループットレートよりも速くなります。この違いは、LabVIEWがデータポイントを破棄する原因になります。