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ページから抜粋した以下の非常に便利な図を参照してください!)
いつC0 is '1'
それQ <= D0
がを与えるrx_clk <= '1'
か、そしてもしC1 is '1'
それならQ <= D1
どちらがを与えるかrx_clk <= '0'
。リセット中、両方のフリップフロップがリセットされ、rx_clk <= '0' while reset = '1'
だから私はいくつかの質問があります:
- この方法で生成された場合、2つのクロック(
not_rx_clk_int
およびrx_clk_int
)は正確に180度位相がずれますか?(このように、私は意味しますnot_rx_clk_int <= not (rx_clk_int)
)。デルタタイムによるものではないと思いますか?これの意味は何ですか? - そもそもODDR2を使用する利点は何ですか(なぜ
rx_clk <= rx_clk_int
適切ではないのですか)?(これは...につながります) - クロックツリーの一部としてクロックが「バランス」されるとはどういう意味ですか?(59ページのここで簡単に言及されている時計の木。 )
rx_clk
リセット中にゲートされていませんか?これは悪くないですか?- これは、ODDR2を使用したり、この操作を実行したりする「標準的な」方法ですか?より良いオプションはありますか?(したがって、これを有用なVHDLビットおよびピースの武器に追加する必要がありますか?)
おすすめの読み物やその他のリソースをお気軽に提案してください。ここで何が起こっているのかを正確に知らずに、このコードをやみくもにコピーしてプロジェクトに貼り付けたくありません。