2

TEMAC IPコアを使用して1GBイーサネットMACを生成していますが、興味深いコードに出くわしました。

-- DDr logic is used for this purpose to ensure that clock routing/timing to the pin is
-- balanced as part of the clock tree
   not_rx_clk_int <= not (rx_clk_int);

  rx_clk_ddr : ODDR2
    port map (
      Q  => rx_clk,
      C0 => rx_clk_int
      C1 => not_rx_clk_int,
      CE => '1',
      D0 => '1',
      D1 => '0',
      R  => reset,
      S  => '0'
      );

したがって、私の理解によれば、ここで起こっていることは、「新しい」クロックが、マルチプレクサへの選択ライン入力として各クロックを使用することにより、180度位相がずれた2つのクロックによって生成されているということです。(このドキュメントの64ページから抜粋した以下の非常に便利な図を参照してください!)

64ページの図2.11

いつC0 is '1'それQ <= D0がを与えるrx_clk <= '1'か、そしてもしC1 is '1'それならQ <= D1どちらがを与えるかrx_clk <= '0'。リセット中、両方のフリップフロップがリセットされ、rx_clk <= '0' while reset = '1'


だから私はいくつかの質問があります:

  1. この方法で生成された場合、2つのクロック(not_rx_clk_intおよびrx_clk_int)は正確に180度位相がずれますか?(このように、私は意味しますnot_rx_clk_int <= not (rx_clk_int))。デルタタイムによるものではないと思いますか?これの意味は何ですか?
  2. そもそもODDR2を使用する利点は何ですか(なぜrx_clk <= rx_clk_int適切ではないのですか)?(これは...につながります)
  3. クロックツリーの一部としてクロックが「バランス」されるとはどういう意味ですか?(59ページのここで簡単に言及されている時計の木。 )
  4. rx_clkリセット中にゲートされていませんか?これは悪くないですか?
  5. これは、ODDR2を使用したり、この操作を実行したりする「標準的な」方法ですか?より良いオプションはありますか?(したがって、これを有用なVHDLビットおよびピースの武器に追加する必要がありますか?)

おすすめの読み物やその他のリソースをお気軽に提案してください。ここで何が起こっているのかを正確に知らずに、このコードをやみくもにコピーしてプロジェクトに貼り付けたくありません。

4

2 に答える 2

3

1)この方法で生成された場合、2つのクロック(not_rx_clk_intおよびrx_clk_int)は正確に180度位相がずれますか?(このように、私は意味しますnot_rx_clk_int <= not (rx_clk_int))。デルタタイムによるものではないと思いますか?これの意味は何ですか?

はい、それらはかなり正確に段階的に行われます。

ここでは、デルタ遅延は問題になりません。これらはHDLシミュレーションにのみ適用され、未知の「実際の」遅延の代わりになります。ザイリンクスがモデルを正しくして、両方のエッジが同じデルタサイクルで変化することを願っています。すなわち。彼らは次のようなことをします:

not_rx_clk <= not (rx_clk_int);
rx_clk <= rx_clk_int;

デルタに一致します。

2)そもそもODDR2を使用する利点は何ですか(なぜrx_clk <= rx_clk_int適切ではないのですか)?(これは...につながります)

これにより、間違いなくこのクロックと同期している他のIOと比較して遅延が予測可能になります。クロック信号をピンから駆動するだけの場合は、クロック分配ネットワークから出て、ルーティングを介してピンに到達する必要があります(クロックネットがIOピンに到達するための直接ルートがないためです。これは予測不可能な遅延であり、コンパイルごとに異なる可能性があります。

3)クロックツリーの一部としてクロックが「バランス」されるとはどういう意味ですか?(59ページに簡単に記載されている時計の木[ここ] [3])

私が理解しているように、それは時計ツリーが時計がすべての目的地まで(ほぼ)同じ距離を移動することを確認することを意味します。

4)rx_clkリセット中にゲートされていませんか?これは悪くないですか?

はい、オンとオフが切り替えられています(「ゲート付き」という言葉は、特定のものを意味するため、使用することを躊躇します。これは、ANDゲートを介して供給されますが、そうではありません)。それが重要かどうかを言うことができるのはあなただけです-それはどこに行くかによります。

5)これはODDR2を使用したり、この操作を実行したりする「標準的な」方法ですか?より良いオプションはありますか?(したがって、これを有用なVHDLビットおよびピースの武器に追加する必要がありますか?)

1つに3つの質問、卑劣な:)

  • はい、それは(a)ODDR2を使用する標準的な方法です(他の標準的な使用法はもちろん実際のDDRデータです)。
  • いいえ、私は単に時計を出すためのより良い方法を知りません。
  • はい、それをあなたの兵器庫に追加してください。
于 2012-11-26T12:08:44.390 に答える
2

回答の一部:

1)多くのザイリンクスコアのように不要な角かっこに面白がっていますnot (rx_clk_int);。Verilogなどから自動変換されているのではないかと思います。それらのいくつかには本当に悪いVHDLがたくさんあります。(だから私は簡単に面白がっています。)とにかく...

合成ツールは、おそらく個別の「not」を最適化し、rx_clk_intの立ち下がりエッジを使用するため、この方法で確実に180度の位相シフトを得ることができます。(それが保証されているか、より複雑な表現が合成をだますかもしれないかどうか、私は言うことができません)。

2)ストレート割り当ては、rx_clk_intをクロックツリーから外し、出力バッファを介して通常のルーティングに移します。合計遅延は誰でも推測できます。このようにして、より予測可能なタイミングのために、IOBで直接正確なタイミングのクロックを得ることができます。

3)クロック生成のすぐ隣のFFとIOBは、遠い隅にあるクロックの前のクロックを見ません。クロックツリーのバランスをとると、すべての短いパスが遅くなり、最長のパスと一致します。(これはDIMMメモリPCBで確認できます。トレースには、それらを長くするためのジグザグの線がたくさんあります!)

4)ゲートされることを期待します。それが悪いかどうかは、それが何を計時しているかに依存します。おそらく、イーサネットの専門家がここに参加することができます。または、このブロックに「リセット」を駆動するロジックを追跡します。この問題を修正するために、メインシステムがリセットされていない可能性があります。

5)これは確かに新しいFPGA(DDR regを備えたもの)ではかなりよく知られているトリックであり、主な目的(メモリへのDDRインターフェイスなど)に加えてクロックにも非常に役立ちます。手元に置いてください!

于 2012-11-26T10:34:56.163 に答える