2-ffシンクロナイザーはどのようにして適切な同期を保証しますか?


9

2-ffシンクロナイザーの使用は、信号がクロック境界を越えるための標準でした。そして、このようなメカニズムを説明する多くの紙/図があります:ここに画像の説明を入力してください

bclkは、(bclkの 2番目の立ち上がりエッジで)adatのパルスを1回だけサンプリングできるようです。これにより、bq1_datで出力メタスタビリティが発生します。次のアクティブクロックエッジでbq1_datを「ハイ」にサンプリングするにはどうすればよいですか。


私の質問に加えて、信号が安全に通過するために私が思うことを別のクロックドメインに追加したいと思います(MTBF要件を満たすのに2 FFで十分だとします)。間違いがあれば訂正してください。

ここに画像の説明を入力してください

ps:メタステーブル状態では「さまよう」波形は表示されませんが、「1」でも「0」でもないレベルが表示されます。次の図は、メタステーブル出力の例を示しています。ここに画像の説明を入力してください

元の図は、WJ DallyによるEE108Aの講義ノート、講義13:メタスタビリティと同期の失敗(適切なフリップフロップが不良になる場合)からのものです。


4
メタステーブルの出力を「さまよっている」ことを示す図は、非常に誤解を招くものであると言いたいだけです。それは、メタスタビリティがどのように見えるかではありません。FFが準安定になると、その出力は単一の特定の中間電圧(値は実装テクノロジによって異なります)に送られ、そこに留まります。予測できない時間が経過すると、電圧は高または​​低にスイングし、どちらの方向に進むかも予測できなくなります。
デイブツイード

@Dave Tweed♦コメントありがとうございます。私がメタスタビリティに関して読んだほとんどすべてのドキュメントで、「さまよう」波形を目にしました。私は周りを検索し、メタステーブル状態がキャプチャされたOスコープからのシュートを含む投稿(フリップフロップにセットアップ違反があり、メタステーブルになった場合、発振終了時に入力値に落ち着くことが保証されていますか?)を見つけました。図の元の参照へのリンクは、その投稿に含まれています。
fiedel

はい、それは私のポイントを完全に示しており、それから得られたパワーポイントのプレゼンテーションには多くの優れた情報が含まれています。
Dave Tweed

回答:


8

簡単な答えは、彼らは自分自身ではないということです。シンクロナイザは、データが確実に渡るようにするためのものではありませんが、メタステーブル信号が他の多くの信号を供給して問題を引き起こさないようにするためのものです。図に示されている2番目のFFは、準安定最初のFF出力をキャッチし、それがデザインをさらに伝搬するのを防ぎます。

信号にはさまざまな種類があり、シンクロナイザを含める方法は、話している信号によって異なります。しかし、いくつかの一般的なタイプを見てみましょう:

  1. トリガー信号 -または、基本的には何か他の実行を開始する必要があるパルスである信号。これらは一般にデータを運びません、そしてあなたが興味を持っているのは、例えば、別のクロックドメインで何かを始めるために立ち上がりエッジがあることです。これらをクロスオーバーさせるには、シンクロナイザ(基本的には図に示されていることを実行する)が必要ですが、もう少し必要です。

    最も単純なオプションは、パルスを拡張することです。基本的に、入力パルスが宛先クロックの1クロック周期以上であることを確認します(少なくとも宛先レジスタのセットアップおよびホールドタイムの​​大きい方が1サイクルより長くなければなりません)。 。たとえば、20MHzクロックから15MHzクロックに移行する場合、パルスが入力で2クロックサイクルであることを確認します。これにより、パルスが宛先クロックに送られ、失われないことが保証されます。これは、信号が確実に通過することを保証する方法についての質問にも答えます。パルスが1つのデスティネーションクロック周期よりも広い場合、最初のクロックエッジでメタステーブルになり、最終的に0と見なされる場合、2番目のクロックエッジで確実にパルスをキャッチします。

    このタイプの信号では、パルスが到達したことにのみ関心があるので、出力信号がいつか2つのクロックサイクルで高くなり、残りの1つのサイクルで終わるかどうかは重要ではありません。シングルサイクルパルスであることを確認する必要がある場合は、単純なエッジ検出回路をインスタンス化できます。

  2. コントロールバス -またはデータバスの種類。同期を維持する必要があるマルチビットデータストリームがある場合、これらは間違いなくより困難です。この場合、「ハンドシェイク」と呼ばれるものを実装することになります。基本的には、データをソースクロックにロードして保持します。次に、シンクロナイザを介して(1のような)要求信号を送信します。要求信号が渡ると、データバスも宛先ドメインで安定することがわかります。次に、それを宛先のレジスタバンクにクロック入力できます。次に、宛先は確認応答パルスを再度送信して、次のワードをロードできることをソースに通知します。

    別のメッセージを送信する前にそこに到達したことを知る必要がある宛先ワードに制御ワードを送信する必要がある場合(たとえば、何かを行うコマンドを送信する場合)は、この種のバスを使用します。

  3. データバス -データを継続的またはバースト的に吐き出すソースがあるデータの場合、間違いなくシンクロナイザーよりもFIFOを使用する方が良いでしょう。FIFOは、デュアルクロックメモリを使用してデータを保持するとともに、FIFO内のデータ量を追跡するためのカウンターを使用します。スペースがあるときにFIFOにデータを書き込み、書き込みアドレスをインクリメントします。このアドレスは、通常、「グレーコーディング」スキームにエンコードされます。これにより、アドレスの増分ごとに1つだけが発生します。変更するアドレスバスのビット(複数のビットを同期する必要がないことを意味します)。次に、このアドレスは(同期チェーンの1つを介して)宛先ドメインに転送され、そこで読み取りアドレスと比較されます。FIFOにデータがある場合、デスティネーションクロックポートを使用してメモリから読み取ることができます。読み取りアドレスも同様にグレイコード化され、別のシンクロナイザーを介してソースに返送されるため、書き込みポートはFIFOにスペースがあるかどうかを計算できます。

  4. リセット信号 -これらは通常、「非同期アサート、同期デアサート」として知られているシンクロナイザの修正バージョンを使用します。この変更バージョンでは、最初のフリップフロップへのデータ入力はGNDに接続され、代わりに着信リセット信号がシンクロナイザ内の各フリップフロップの非同期プリセット信号に接続されます。これにより、出力信号がハイになると完全に非同期になる出力信号が生成されますが、シンクロナイザチェーンは、レジスタチェーンのゼロをクロッキングすることにより、宛先クロックと同期してローになることを保証します。

    このタイプのシンクロナイザは、データと制御にひどいですが、リセット信号に完全に適しています。すべての宛先ロジックがこのチェーンの出力をドメイン内の任意のレジスタの非同期リセット入力に供給する場合、すべてのレジスタが既知の状態に強制されるため、アサート(非同期であっても)のメタスタビリティの心配はほとんどありません。次に、ソースドメインでリセット信号がディアサートされると、宛先ドメインで同期的にディアサートされます。つまり、すべてのレジスタが同じクロックサイクルでリセットされます(非同期ディアサートの場合は+/- 1サイクルではありません)。


上記からわかるように、2つのフリップフロップシンクロナイザーを信号に貼り付けるよりも、クロックドメインの交差を行う方がはるかに複雑です。使用される正確な方法は、アプリケーションによって異なります。


トムの答えに加えて、これらのケースの実装を持つPoCへの参照を追加したいと思います。シンクロナイザドキュメントは、 RTDにご利用いただけます。基本的な2 FFシンクロナイザー用に2つのフリップフロップをチェーニングする理論に加えて、PoCはsync_BitsザイリンクスおよびアルテラFPGAの専用実装()を提供して、メタスタビリティ動作を改善します。2-FFシンクロナイザーは、たとえばsync_Strobeパルス用のより複雑なシンクロナイザーを構築するために使用されます。
Paebbels、2016年

同期戦略について詳しく説明していただきありがとうございます。この写真は、クリフォードE.カミングスによる「systemverilogを使用したクロックドメインクロッシング(CDC)の設計と検証手法」からのものです。1ビット信号の場合、信号が安全に通過するには、幅が少なくとも1クロックサイクル+セットアップタイム+受信側のホールドタイムでなければならないことを理解しています。この図では、adatのパルスはbclkサンプルによってその立ち下がりエッジで1回だけサンプリングされ、bq1_datが準安定になるため、この基準は満たされていません。
fiedel 2016年

...その結果、bclkの次の立ち上がりエッジでのbq1_datの読み取り値は「0」または「1」のいずれかになります。したがって、図の同期は失敗したようです。私は正しいですか?
fiedel 2016年

@Paebbels参照ありがとうございます。見てみましょう=)
fiedel

これを回答として投稿するのではなく、質問に編集する必要がありますが、基本的には、その例の出力で1が得られる場合と得られない場合があります。
トムカーペンター2016年

1

1)例として図面を使用すると、aclkとbclkは互いに非同期です。つまり、クロックソースが異なります。それらは有効なデータとしてadatを示していますが、aclkのみに同期されています。ここで、bclkシンクロナイザーが機能します。

2)この図は最悪のシナリオを想定しています。bq1_datは乱雑な出力であり、bq1 FFはデータの最後の一部しかキャッチせず、通常は出力がガベージであるメタステーブル状態を作成します。ここにトリックがあります。Bq2はbq1と同じbclkを持っていますが、データが通過してbq2_datに現れるには、bclkの2クロックサイクルかかります。

3)最初のbclkはデータの一部をキャプチャして乱雑な出力を生成しますが、2番目のbclkは1クロックサイクル後、bq1_datからのあいまいなデータがハイまたはローの状態に落ち着くのに十分な時間です。乱雑なbq1_datパルスは、bq2が有効なロジック「1」(ロジックハイ)をキャプチャし、それを有効で同期されたデータ(ロジックハイ)としてbq2_datに渡すのに十分なだけ長く続きました。

4)下流では、bclkを使用するすべてのクロックでデータを同期できます。最初のbclk FFだけが準安定状態を処理する必要があったことに注意してください。ADATがピコ秒またはナノ秒で遅すぎた場合、出力はロジックローであった可能性があります。これらのフリップフロップは、クロックの立ち上がりエッジでのみデータ入力をサンプリングすることに注意してください。立ち上がりエッジの前または後に何が起こるかは無視されます。


ただし、bclk遅延は安全性の確率的測定を提供するだけであり、正確な量はFFテクノロジーとbclk期間の両方に依存することに注意してください。いくつかのhi-relケースでは、エラーレートを許容レベルに下げるために3つ以上のステージが必要になる場合があります。
WhatRoughBeast 2016年

@WhatRoughBeast。最悪の場合、多くの同期ステージとデジタルフィルタリングが必要になることを知っています。明らかに私の答えは単純すぎました。
Sparky256

@ Sparky256何が私を困惑させるか3)コメントで。bq1_datが準安定状態にあるときに、bq2はどのように「1」をキャプチャできますか?
fiedel 2016年

@ fiedel、bq2が(少なくとも)クリーンな入力をキャプチャできるようにするために2つのことが貢献しています。最初に、準安定状態がクロックサイクル全体にわたって持続する必要があります。第2に、bq1からの準安定(疑似中間レール)値がウィンドウ内にある可能性は低い(または回避するように最適化されている)ため、bq2も準安定になる可能性がありますが、主に最初のものです。このテクノロジーにより、準安定が5%の確率で十分に持続するとします。3-FF同期ステージでは、両方のセルに障害が発生するため、これを0.25%に削減します。メッシーは、実際にはほぼ安定した状態からの明確な指数偏差です。
Sean Houlihane 2016年

@SeanHoulihane。説明ありがとう。データを受け入れるウィンドウ(準安定または安定)が立ち上がりエッジの中間点にあり、数ピコまたはナノ秒しか持続しないため、「立ち上がりエッジ」という用語は一部を混乱させます。のみ、その時点でそれは論理1または0のICの閾値と比較し、その電圧レベルに応じて、準安定または安定しているかどうかを、論理「1」または「0」の入力データである
Sparky256
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.