2

2 つのプロセス A と B があり、それぞれに独自のクロック入力があります。

クロック周波数が少し異なるため、同期されていません。

プロセス A は IC からデータをサンプリングします。このデータはプロセス B に渡される必要があり、プロセス B はこのデータを別の IC に書き込む必要があります。

私の現在の解決策は、プロセス A と B の間で単純なハンドシェイク信号を使用することです。メモリは、プロセス A (ブロック メモリではない) 内で分散 RAM (std_logic_vector(7 downto 0) の配列として 128 バイト) として宣言されています。

ザイリンクスの Spartan 3AN と ISE Webpack を使用しています。

しかし、これは正しい方法ですか?

Spartan 3 には 2 つのクロックをサポートするデュアル ポート ブロック メモリがあるとどこかで読みましたが、これはより正確でしょうか?

私が質問している理由は、私のデザインが予測不可能な動作をするためです。このような場合、私は魔法が嫌いです. :-)

4

3 に答える 3

5

非常に特殊な例外的なケースを除いて、2 つの独立したクロック ドメイン間でデータを移動する唯一の正しい方法は、非同期 FIFO (より正確にはマルチレート FIFO とも呼ばれます) を使用することです。

ほぼすべての FPGA (使用しているザイリンクス パーツを含む) では、ベンダーが作成した FIFO を使用できます。ザイリンクスの場合、CoreGen ツールを使用して自分で FIFO を生成することによってこれを行います。

デュアルポート RAM と適切なハンドシェーク ロジックを使用して、そのような FIFO を自分で構築することもできますが、ほとんどの場合と同様に、これは非常に正当な理由がない限り、自分で再発明する必要はありません。

デザインに複数のクロック ドメインが本当に必要かどうかを検討することもできます。絶対に必要な場合もありますが、それはほとんどの人が信じているよりもはるかに少ないです. たとえば、複数のレートで実行するロジックが必要な場合でも、多くの場合、1 つのクロックと適切に生成された同期クロック イネーブルを使用することでこれを処理できます。

于 2012-09-27T21:06:47.593 に答える
1

クロックドメイン全体で「有効/ack」フラグのセットを取得するには、Flancterを確認することをお勧めします。これは、そのアプリケーションです。

しかし、一般的なケースでは、デュアルクロックFIFOを使用するのが日常茶飯事です。自分で書くことは興味深い練習になりますが、すべての潜在的な時計のタイミングのケースを検証することは悪夢です。これは、Coregenブロックをインスタンス化する数少ない場所の1つです。

于 2012-09-28T11:05:37.437 に答える
1

あなたが経験している魔法は、合成でデザインを正しく制約していないか、ハンドシェークを適切に行っていないことが原因である可能性が最も高いです。次の 2 つのオプションがあります。

  1. FIFO

wjl で述べられているようにマルチレート FIFO を使用します。これは非常に一般的なソリューションであり、(適切に行われた場合) 常に機能し、リソースの点で巨大です。このソリューションの大きな利点は、実際のクロック ドメインの交差の問題を気にする必要がなく、2 つのドメイン間で最大の帯域幅が得られることです。動作しないため、VHDL で非同期 FIFO を構築しようとしないでください。VHDL でさえ、正しく実行できないことがいくつかあります。ザイリンクスの適切なジェネレーターを使用してください。CoreGen だと思います。

  1. 握手

2 つのドメインにデータ用に少なくとも 2 つのレジスタを用意し、完全な要求/承認ハンドシェイク ロジックを構築します。それらを含めないと、適切に機能しません。受信ドメインにハンドシェーク信号用に少なくとも 2 つのレジスタを追加して、ハンドシェーク ロジックが適切に同期されていることを確認してください。

于 2012-09-28T05:59:44.670 に答える