首页 文章

在自动生成的xilinx包装器VHDL文件中找到ODDR2用法

提问于
浏览
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度的时钟生成"new"时钟 . (参见下面非常有用的图表,第64页in this document!)

figure 2.11 from page 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_intrx_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 回答

  • 3

    1)以这种方式生成时,两个时钟(not_rx_clk_int和rx_clk_int)是否精确地相差180度? (通过这种方式,我的意思是not_rx_clk_int <= not(rx_clk_int)) . 我假设不是因为delta时间?这有什么影响?

    是的,他们将完全分阶段进行 .

    Delta延迟在这里不是问题 . 它们仅适用于HDL模拟,代替未知的“真实”延迟 . 我希望Xilinx能够正确地使用它们的模型,以便在相同的三角形循环中改变两条边!即 . 他们做的事情如下:

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

    匹配三角洲 .

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

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

    3)时钟作为时钟树的一部分“ balancer ”是什么意思? (第59页简要提到的时钟树[这里 . ] [3])

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

    4)复位期间rx_clk是不是被门控了?这不是坏事吗?

    是的,它正在被打开和关闭(我会毫不犹豫地使用'gated'这个词,因为这意味着一个特定的东西 - 通过一个AND门进入 - 这不是) . 只有你可以说这是否重要 - 这取决于它的去向 .

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

    一个三个问题,偷偷摸摸:)

    • 是的,这是(a)使用ODDR2的标准方式(其他标准用途当然是实际的DDR数据) .

    • 不,我不知道一个更好的方法来简单地取出时钟 .

    • 是的,将它添加到你的武器库中 .

  • 2

    部分答案:

    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内存到存储器等)之外,它对时钟非常有用 . 保持方便!

相关问题