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 度的时钟正在生成一个“新”时钟。(请参阅以下非常有用的图表,取自本文档的第 64 页!)

图 2.11 来自第 64 页

什么时候C0 is '1'Q <= D0rx_clk <= '1'如果C1 is '1'那么Q <= D1rx_clk <= '0'。在复位两个触发器都复位给rx_clk <= '0' while reset = '1'


所以我有几个问题:

  1. 以这种方式生成时,两个时钟 (not_rx_clk_intrx_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) 当以这种方式生成时,两个时钟 (not_rx_clk_intrx_clk_int) 是否会精确地异相 180 度?(通过这种方式,我的意思是not_rx_clk_int <= not (rx_clk_int))。我假设不是由于增量时间?这意味着什么?

是的,它们将非常精确地分阶段。

Delta 延迟在这里不是问题。它们仅适用于 HDL 模拟,代替未知的“真实”延迟。我希望 Xilinx 的模型正确,以便两个边缘在同一个增量周期中发生变化!IE。他们会做类似的事情:

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

以匹配增量。

2) 首先使用 ODDR2 有什么好处(为什么rx_clk <= rx_clk_int不够用)?(这导致...)

它确保延迟相对于您无疑已与此时钟同步的其他 IO 是可预测的。如果您只是将时钟信号从引脚驱动,它必须从时钟分配网络通过一些路由,然后到引脚(因为时钟网络没有直接路由到 IO 引脚。那是延迟是不可预测的,并且可能因编译而异。

3) 作为时钟树的一部分,时钟“平衡”是什么意思?(时钟树在第 59 页 [here.][3] 中简要提及)

据我了解,这意味着时钟树确保时钟到每个目的地的距离(大约)相同。

4)rx_clk在复位期间没有被门控吗?这不是很糟糕吗?

是的,它正在被打开和关闭(我会犹豫使用“门控”这个词,因为这意味着一个特定的东西——通过与门输入——这不是)。只有你可以说这是否重要——这取决于它的去向。

5) 这是使用 ODDR2 和/或执行此操作的“标准”方式吗?有更好的选择吗?(因此,我应该将它添加到我有用的 VHDL 零碎的库中吗?)

三个问题合二为一,偷偷摸摸:)

  • 是的,它是 (a) 使用 ODDR2 的标准方式(另一种标准用途当然是用于实际 DDR 数据)。
  • 不,我不知道有什么更好的方法来打卡。
  • 是的,将其添加到您的武器库中。
于 2012-11-26T12:08:44.390 回答
2

部分答案:

1) 我对not (rx_clk_int);很多 Xilinx 内核中不必要的括号很感兴趣,这让我想知道它是否是从 Verilog 自动翻译的;其中一些有很多非常糟糕的VHDL。(所以我很容易被逗乐。)无论如何......

综合工具可能会优化单独的“not”并使用 rx_clk_int 的下降沿,因此您当然可以通过这种方式获得 180 度相移。(是否有保证,或者更复杂的表达式可能会欺骗综合,我不能说)。

2) 直接分配会将 rx_clk_int 从时钟树上移到普通路由上,通过输出缓冲区,总延迟将是任何人的猜测。这样,您就可以直接在 IOB 中精确定时时钟,以获得更可预测的定时。

3) 紧挨着时钟发生器的 FF 和 IOB 看不到在远角的时钟之前的时钟;平衡时钟树正在减慢所有短路径以匹配最长路径。(您可以在 DIMM 内存 PCB 上看到这一点,走线上有很多锯齿线以延长它们!)

4)我希望它是封闭的。这是否不好取决于它的时钟。也许以太网专家可以在这里插手。或者将逻辑驱动“复位”到这个块;它可能不是主系统重置,以解决此问题。

5) 这在较新的 FPGA(带有 DDR regs 的 FPGA)上肯定是一个众所周知的技巧,除了它们的主要用途(DDR 接口到内存等)之外,它对时钟非常有用。随身携带!

于 2012-11-26T10:34:56.163 回答