0

非同期 FIFO の設計方法についてアドバイスが必要です。別のクロック ドメインにデータをキャプチャするときのメタ安定性の問題は理解しています。私の質問は、2 つのフリップフロップ シフト レジスタを使用すると、フル フラグとエンプティ フラグの計算で書き込みポインターと読み取りポインターの値を同期するのにどのように役立つかということです。レジスタが別のドメインのデータをキャプチャすると、メタステーブル状態になり、未知の値に落ち着く可能性があるため、この問題を効果的に解決するにはどうすればよいでしょうか。

ありがとう

4

2 に答える 2

1

読み取りポインターと書き込みポインターは、あるクロック ドメインから別のクロック ドメインに転送されるときにグレイ エンコーディングを使用する必要があります。ご存知のように、グレー カウンターの 1 ビットだけが 2 つの連続する値の間で異なります。したがって、メタスタビリティは変化する 1 つのビットのみに影響を与える可能性があります。再同期後、転送されたポインタは、更新されたポインタまたは以前の値のいずれかになります。

どちらの場合も、これは問題ではなく、FIFO の悲観的なフラグ/カウントにつながるだけです。

読み取り/書き込みポインターに通常のカウンターを使用し、次の関数を使用してそれらをグレイコードに変換します。これらは VHDL で記述されていますが、次のように理解する必要があります。

function bin_to_gray(a: unsigned) return unsigned is
begin
    return a xor ('0' & a(a'left downto 1));
end function bin_to_gray;

function gray_to_bin(a: unsigned) return unsigned is
    variable ret   : unsigned(a'range);
begin
    ret(a'left) := a(a'left);
    for i in a'left-1 downto 0 loop
        ret(i) := ret(i+1) xor a(i);
    end loop;
    return ret;
end function gray_to_bin;
于 2015-03-23T11:33:11.577 に答える
0

ジョナサンはそれをうまく説明しました。いくつかの点を追加したいと思います。まず、2 ステージ シンクロナイザ レジスタに加えて、ソース レジスタも必要です。組み合わせロジックはグリッチを生成するため、組み合わせロジックから 2 ステージ シンクロナイザーに信号を供給することはできません。

また、Verilog および VHDL には、クロック ドメイン クロッシングおよびメタスタビリティに対するサポートが組み込まれていないことに注意する必要があります。グレイ コード ポインターを転送する適切な 2 ステージ シンクロナイザーを作成したとしても、シンセシス ツールがシンクロナイザーを変更して、メタスタビリティに対する保護が無効になるという保証はありません。一部の合成ツールは、シンクロナイザーを検出してそのままにしておこうとします。そうでない人もいます。どちらの場合でも、それに依存するべきではありません。完全に適切なクロック ドメイン クロッシングのために、ベンダー固有の属性と SDC タイミング制約を使用して、シンクロナイザーとソース レジスターを制約する必要があります。

于 2015-04-10T18:58:07.030 に答える