複数クロック領域を実装する
- 更新日2025-03-06
- 7分で読める
シングルサイクルタイミングループは異なるクロック領域で実行できます。シングルサイクルタイミングループでは、FPGA VIが持つクロック領域を指定できます。利用可能なすべてのFPGAターゲット上のクロックが、FPGAターゲットのベースクロックまたは派生クロックとしてプロジェクトエクスプローラウィンドウに表示されます。FPGAターゲットがサポートするFPGAターゲットベースクロックまたは派生クロックをシングルサイクルタイミングループのタイミングソースとして選択できます。ただし、シングルサイクルタイミングループに配置したコードの組み合わせパスの長さは、指定するクロックレートで実行するのに十分な短さである必要があります。
異なるクロック領域でI/Oを同期する
異なるクロック領域で実行する複数のシングルサイクルタイミングループ間でデータを転送する必要がある場合があります。通常のFPGAターゲットのデジタル入力はトップレベルのFPGAターゲットクロックに同期されず、再度同期を行う必要があります。一部のFPGAターゲットでは、特定のクロックに同期されたI/Oリソースまたは外部クロックを使用することができます。入力データがすでにトップレベルのFPGAターゲットクロックに同期されている場合、再同期のオーバーヘッドを回避することができます。利用可能なI/Oリソースの同期については、特定のFPGAターゲットのハードウェアドキュメントを参照してください。
クロック領域間でデータを転送する
クロック領域間でデータを転送するには、シングルサイクルタイミングループトンネル、レジスタ項目、ハンドシェイク項目、ローカルおよびグローバル変数、またはブロックメモリFIFOを使用することができます。以下の表には、各メソッドの特性の概要が記載されています。
| 転送メソッド | FPGAリソース | ロッシー? | 並列ループ間? | 無制限の領域間? | 一般的用途 |
|---|---|---|---|---|---|
| シングルサイクルタイミングループトンネル | 論理 | X | いいえ | いいえ | データロギング |
| レジスタ項目およびローカル/グローバル変数 | 論理 | ○ | ○ | ○ | 制御、シミュレーション |
| ブロックメモリを使用して実装されたメモリ項目 | メモリ | ○ | ○ | X | データロギング |
| ブロックメモリFIFO | 論理およびメモリ | X | ○ | X | データロギング |
| ハンドシェイク項目 | 論理 | X | ○ | X | 制御、シミュレーション |
シングルサイクルタイミングループトンネル
シングルサイクルタイミングループトンネルを使用して、シングルサイクルタイミングループの入出力信号を配線することができます。LabVIEWは、入力信号をループのクロック領域にハンドシェイクします。シングルサイクルタイミングループの各反復の終了後、LabVIEWは出力信号をトップレベルFPGAターゲットクロックにハンドシェイクします。シングルサイクルタイミングループトンネルは、LabVIEWのデータフローを維持するため、並列ループ間のデータの転送に使用できません。
レジスタ項目およびローカル/グローバル変数
1つのクロック領域からのみレジスタ項目やローカルまたはグローバル変数に書き込むことができます。その後は、どのクロック領域からでもレジスタ項目やローカルまたはグローバル変数から読み取りを実行できます。LabVIEWは書き込み領域から読み取り領域にデータを転送します。データの破損はハンドシェイクを使用して回避されます。新規の値をハンドシェイクするには、書き込みおよび読み取り領域の両方で数クロックサイクル待機する必要があります。ハンドシェイクのオーバーヘッドの影響により、あるクロック領域から書き込んだ一部の値は、出力先の領域で読み取られない場合があります。データが読み取りよりも速く書き込まれることを避けるには、追加の論理をプログラムして読み取りと書き込み間で双方向の通信を確立し、データ損失を回避する必要があります。
ブロックメモリを使用して実装されたメモリ項目
ターゲット指定またはVI定義メモリ項目を使用して、ブロックメモリを使用してメモリ項目を実装した場合のみ、データの保存と異なるクロック領域からそのデータにアクセスすることができます。メモリ実装を変更するには、メモリプロパティダイアログボックスの一般ページで、メモリ項目の実装としてブロックメモリを選択してください。この実装では、各メモリ項目で1つの書き込みノードと1つの読み取りノードのみを使用できます。
| 注意 複数のクロック領域にブロックメモリを使用して実装されたメモリ項目を使用する場合は、同じアドレスで同時に読み取りと書き込みを実行することが可能です。ただし、それを実行すると、不正確なデータを読み取る可能性があります。 |
ブロックメモリFIFO
ブロックメモリを使用してFIFOを実装する場合のみ、ターゲット指定またはVI定義のFIFOを使用してクロック領域間でデータを転送できます。FIFO実装を変更するには、FIFOプロパティダイアログボックスの一般ページで、メモリ項目の実装としてブロックメモリを選択してください。1つのクロック領域からのみブロックメモリFIFOへの書き込みが可能です。その後、1つのクロック領域からのみFIFOの読み取りが可能です。
ハンドシェイク項目
1つのクロック領域からのみハンドシェイク項目への書き込みが可能です。その後、同じクロック領域または異なるクロック領域でハンドシェイク項目からの読み取りが可能になります。任意のクロック領域からハンドシェイク項目をクリアすることができます。LabVIEWはハンドシェイクを使用することにより、書き込み領域から読み取り領域への無損失データ転送と、読み取り側がデータを受信した際に書き込み側への通知を実行できます。クロック領域間で新規の値をハンドシェイクするには、LabVIEWは書き込みおよび読み取り領域の両方で数クロックサイクルを必要とします。