我正在使用 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 度的时钟正在生成一个“新”时钟。(请参阅以下非常有用的图表,取自本文档的第 64 页!)
什么时候C0 is '1'
给Q <= D0
,rx_clk <= '1'
如果C1 is '1'
那么Q <= D1
给rx_clk <= '0'
。在复位两个触发器都复位给rx_clk <= '0' while reset = '1'
所以我有几个问题:
- 以这种方式生成时,两个时钟 (
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 零碎的库中吗?)
随意建议推荐阅读和/或其他资源。我不想在不知道这里发生了什么的情况下盲目地将这段代码复制/粘贴到我的项目中。