0

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 週間しか残っていないので、自分の設計が機能することを確認したいと考えています。

4

1 に答える 1

2

FIFO は非同期として機能できます。2 つのメイン クロック ドメイン 60Mhz と 150Mhz の間の境界ブリッジ。両方のクロック ドメインのロジックを厳密に分離します。通信する既知の低速制御信号 (フォルス パスのタイミング制約を適用できるほど十分に低速) は、少数にとどめる必要があります。たとえば、GUI はクロック比を 60Mhz 側のレジスタに書き込みます。次に、高速側に新しい値があることを通知します。高速側は、通知を受信した数サイクル後にこの値をキャプチャします (たとえば、メタ安定性に特別な注意を払った立ち上がりエッジ検出)。高速側の機能ロジックは、高速側にもあるこのシャドウ レジスタの出力を常に使用します。

高速ADC側でクロックを分割するには、説明したようにフルクロックを使用して有効にするか(私も好む)、クロックを自己分割することができます。クロックを分周する場合は、ザイリンクス ドキュメントの例に従ってください。たとえば、クロックを分配するためにクロック バッファが必要になる場合があります。

ホールド パス違反が残っている場合は、ソース FF とデスティネーション FF のクロックとクロックの到着時間を調べます。デスティネーション FF のキャプチャ クロックが遅れていると、データが早すぎる場合があります。ルーターは、単にデータを遅らせることでこれを修正する場合があります。セットアップ要件でそれ以上の遅延が許容されない場合は修正できません (両方のクロック間の不確実性が高すぎる場合など)。

于 2013-04-09T18:26:58.977 に答える