FPGA に DSO コントローラーを実装していますが、ホールド タイム違反が多すぎて問題があります (これまでのところ、最高の P&R 結果は 3 つのホールド タイム エラーで、スラックは -2ns 程度でした)。
私の問題の核心は、ADC サンプル デシメータからの入力と同期 FT245 (60MHz) への出力を備えた FIFO バッファがあることです。入力デシメータは、2 の累乗 (例: 1、2、4、8、16...) でデシメートするように設定できます。これにより、ADC サンプルのクロック周波数 (150MHz) も分周されます。
そして、私のアプローチは、データをキャプチャしているときに分周された (デシメータ比が 0 の場合は直接) クロック周波数をバッファに供給し、サンプルを PC にプッシュしているときに FT245 から 60MHz クロックを供給するように切り替えることです。シミュレーションでは問題なく動作していますが、問題は配置と配線にあり、そのルーターは次のエラーを吐き出します。
Route:466 - Unusually high hold time violation detected among 226 connections. The top 20 such instances are printed below. The
router will continue and try to fix it
次に、すべてのセットアップ時間の制約が満たされ、150MHz クロックのホールド タイム違反が 3 つある (60MHz クロックは OK) というタイミング レポートが表示されるまで、10 ~ 15 分間クランチします。
FPGAがクロックを適切に分配できなかったゲーテッドクロックの使用に問題がある可能性があることを読みましたが、FIFOのクロックをゲーティングする代わりに、150MHzクロックをFIFOに直接接続し、dataReadyでFIFOのデータをゲーティングしていました(それ実際には、以前にゲートされたクロックと同じ信号になってしまいました)、現在よりもはるかに多くの (50-60) ホールド タイム違反が発生しました。
複数クロック FIFO に対する既知の適切なアプローチはありますか? 2 つだけではありません (ザイリンクス ISE の例でも十分です)。それとも、FPGA で ADC サンプルをデシメートするという考えはありませんか?
ターゲット FPGA は Spartan 6 LX25 スピード グレード -2 です (残念ながら -3 スピード グレードは入手できませんでした)。
これが私に与えているたるみの例です:
Slack (hold path): -2.031ns (requirement - (clock path skew + uncertainty - data path))
Source: decimator_clock_divisor/decimationRatio_0 (FF)
Destination: trigger_analog1/previousValue_2 (FF)
言及されたソースは、頻繁に変更されることのないシグナル (およびそれが提供するすべての違反) であり、実際には GUI によって制御されるため、ホールド タイム違反が発生する可能性があるかどうかはわかりません。これは、デシメータの比率からトリガー バッファー (または他の違反の FIFO バッファー) へのパスです。
基本的に私の質問は、これらの違反を気にする必要があるかということです。
デシメータの比率を変更した後、トリガーでデシメータの結果を実際に使用し始める前に、何千ものクロック サイクルが存在する可能性があるためです。
ルーターは、非同期信号を変更する頻度(60MHzクロックドメインから設定しているため非同期です)と、モジュールの結果を使用するのにかかる時間を知ることができませんでした。問題は、PAR の完了後にこれらの 3 つの違反が表示されたときに、これらの 3 つの違反によって隠されている他の違反がないことが最終的なものであるかどうかがわからないことです。
PAR シミュレーションを投稿して、ボード上で動作するかどうかを確認できますか? ボード上で試してみますが、BGA のはんだ付けに 2 週間待たなければならず、論文を完成させるのに 4 週間しか残っていないので、自分の設計が機能することを確認したいと考えています。