我正在使用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度的时钟生成"new"时钟 . (参见下面非常有用的图表,第64页in this document!)
当 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)
) . 我假设不是因为delta时间?这有什么影响? -
首先使用ODDR2有什么好处(为什么
rx_clk <= rx_clk_int
不够用)? (这导致...) -
时钟作为时钟树的一部分"balanced"是什么意思? (第59页简要提到的时钟树here.)
-
在重置期间是不是
rx_clk
被门控?这不是坏事吗? -
这是使用ODDR2和/或执行此操作的"standard"方式吗?有更好的选择吗? (因此,我应该将它添加到我的有用的VHDL零碎件库中吗?)
随意建议推荐阅读和/或其他资源 . 我不想盲目地将这些代码复制/粘贴到我的项目中,而不知道这里到底发生了什么 .
2 回答
是的,他们将完全分阶段进行 .
Delta延迟在这里不是问题 . 它们仅适用于HDL模拟,代替未知的“真实”延迟 . 我希望Xilinx能够正确地使用它们的模型,以便在相同的三角形循环中改变两条边!即 . 他们做的事情如下:
匹配三角洲 .
它确保延迟相对于您无疑与此时钟同步的其他IO是可预测的 . 如果你只是从一个引脚驱动时钟信号,它必须从时钟分配网络,通过一些路由,然后到引脚(因为没有直接路由时钟网到达IO引脚 . 这是一个延迟是不可预测的,并且可能因编译而异 .
据我了解,这意味着时钟树确保时钟与每个目的地的距离(大约)相同 .
是的,它正在被打开和关闭(我会毫不犹豫地使用'gated'这个词,因为这意味着一个特定的东西 - 通过一个AND门进入 - 这不是) . 只有你可以说这是否重要 - 这取决于它的去向 .
一个三个问题,偷偷摸摸:)
是的,这是(a)使用ODDR2的标准方式(其他标准用途当然是实际的DDR数据) .
不,我不知道一个更好的方法来简单地取出时钟 .
是的,将它添加到你的武器库中 .
部分答案:
1)我很喜欢
not (rx_clk_int);
中的不必要的括号,就像许多Xilinx内核一样,它让我想知道它们中的一些是非常糟糕的VHDL . (所以我很容易被逗乐 . )无论如何......合成工具可能会优化单独的“not”并使用rx_clk_int的下降沿,因此您肯定可以通过这种方式获得180度相移 . (无论是保证,还是更复杂的表达都可能愚弄合成,我不能说) .
2)直接分配将rx_clk_int从时钟树上移除到普通路由,通过输出缓冲器,总延迟将是任何人的猜测 . 这样,您可以直接在IOB中精确定时时钟,以获得更可预测的时序 .
3)旁边的FF和IOB时钟根在远处角落之前看不到时钟; balancer 时钟树正在减慢所有短路径以匹配最长的路径 . (您可以在DIMM内存PCB上看到这一点,在迹线上有很多锯齿线以延长它们!)
4)我希望它是门控的 . 这是不是取决于它的时钟 . 也许以太网专家可以在这里筹码 . 或者追逐驱动“重置”到该块的逻辑;它可能不是主系统重置,以解决此问题 .
5)对于较新的FPGA(具有DDR寄存器的FPGA)来说,它肯定是一个众所周知的技巧,除了它们的主要用途(DDR内存到存储器等)之外,它对时钟非常有用 . 保持方便!