3

良い FIFO 設計を探しているときに、インターネットで次のコードを見つけました。リンクからSVN Code FIFO - Author Clifford E. Cummings . 私はいくつかの調査を行いましたが、デザインに 3 つのポインターがある理由を理解できませんでした。コードを読むことはできますが、何が欠けていますか?

 module sync_r2w #(parameter ADDRSIZE = 4)
 (output reg [ADDRSIZE:0] wq2_rptr,
 input [ADDRSIZE:0] rptr,
 input wclk, wrst_n);
 reg [ADDRSIZE:0] wq1_rptr;
 always @(posedge wclk or negedge wrst_n)
 if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
 else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
endmodule


module sync_w2r #(parameter ADDRSIZE = 4)
 (output reg [ADDRSIZE:0] rq2_wptr,
 input [ADDRSIZE:0] wptr,
 input rclk, rrst_n);
 reg [ADDRSIZE:0] rq1_wptr;
 always @(posedge rclk or negedge rrst_n)
 if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;
 else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
endmodule
4

2 に答える 2

9

ここで見ているのは、デュアル ランク シンクロナイザーと呼ばれるものです。あなたが述べたように、これは非同期FIFOです。これは、FIFO の読み出し側と書き込み側が同じクロック ドメインにないことを意味します。

ご存じのように、フリップフロップが正しく機能するには、セットアップとホールドのタイミング要件を満たす必要があります。あるクロック ドメインから別のクロック ドメインに信号を駆動する場合、一般的なケースでこの要件を保証する方法はありません。

これらの要件に違反すると、FF はいわゆる「メタ安定」状態になり、しばらくの間不確定になり、その後 (多かれ少なかれ) ランダムに 1 または 0 になります。しかし、FF はこれを行います (これは重要です)。 1 クロック サイクル未満で。

そのため、ここではフロップが 2 層になっています。1 つ目はメタステーブルになる可能性がありますが、2 つ目のフロップ セットで完全にキャプチャされるまでに間に合うように解決する必要があります。

これだけでは、複数ビットの値 (アドレス ポインター) をクロック ドメイン間で渡すには不十分です。同時に複数のビットが変化している場合、反対側でトランジションがクリーンであるとは確信できません。したがって、これらの状況でよく見られるのは、FIFO ポインターがグレー コード化されることです。これは、カウンターの各インクリメントが一度に多くても 1 ビットしか変化しないことを意味します。

例 00 -> 01 -> 10 -> 11 -> 00 ... ではなく、00 -> 01 -> 11 -> 10 -> 00 ... となります。

クロック ドメイン クロッシングは、深く微妙なテーマです。経験豊富な設計者でさえ、慎重に考えずにそれらを台無しにすることが非常によくあります。

ところで、通常の Verilog シミュレーションでは、ゼロ遅延シミュレーションで説明したことについて何も表示されません。実際のタイミング モデルを使用して、バック アノテーション付き SDF シミュレーションを実行する必要があります。

于 2013-04-12T16:24:11.103 に答える
2

この例では、アドレスを1 クロック サイクル遅らせるためにシフト レジスタを介して渡されます。出力をさらに遅らせるために、より多くの「ポインター」があった可能性があります。

一般に、設計をシミュレートして波形を見ると、何が起こっているのか、その理由を理解しやすくなります。

また、ここにいくつかの優れた FIFO 実装があります。

  1. ザイリンクス FIFO Generator IP コア
  2. アルテラのシングル/ダブルクロック FIFO
  3. OpenCores ジェネリック FIFO

それが役に立てば幸い。幸運を!

于 2013-04-12T13:08:35.830 に答える