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

在自动生成的xilinx包装器VHDL文件中找到ODDR2用法,vhdl,xilinx,Vhdl,Xilinx,我正在使用TEMAC IP core生成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 (

我正在使用TEMAC IP core生成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度的时钟产生的,通过使用每个时钟作为mux的选择线输入。请参阅下面摘自第64页的非常有用的图表


当C0为“1”时,则Q部分答案集:

1我被not rx_clk_int中不必要的括号逗乐了;就像很多Xilinx内核一样,它让我想知道它是从Verilog自动翻译过来的还是什么;其中有很多非常糟糕的VHDL。所以我很容易被逗乐。无论如何

合成工具可能会优化单独的not,并使用rx_clk_int的下降沿,因此您当然可以通过这种方式获得180度相移。不管它是有保证的,还是一个更复杂的表达式可能会愚弄合成,我不能说

2直接分配将通过输出缓冲区将rx_clk_int从时钟树转移到普通路由,总延迟将是任何人的猜测。通过这种方式,您可以直接在IOB中精确计时时钟,以实现更可预测的计时

时钟发生器旁边的3个FFs和IOB在远角的时钟之前看不到时钟;平衡时钟树会减慢所有短路径的速度,以匹配最长路径。你可以在DIMM内存PCB上看到这一点,在记录道上有很多锯齿形的线条来延长它们

我希望它能被关上大门。这是否糟糕取决于它的时钟。也许一位以太网专家可以在这里插手。或将逻辑驱动复位到该块;要解决此问题,可能不是主系统重置

5这当然是一个相当有名的技巧,在使用DDR寄存器的较新FPGA上,除了其主要用途DDR接口到内存等之外,它对时钟非常有用。请随时使用


1当以这种方式产生时,这两个时钟不是rx_clk_int和rx_clk_int将精确地相差180度吗?通过这种方式,我的意思是说不是很好地放。我只想评论一下Delta延迟只适用于HDL模拟。是的,但可能值得一提的是,它们代表真实但未知的门或信号延迟,这确实适用于合成和真实逻辑。因此,模拟可能会揭示delta循环的倾斜,而简单的合成也可以做到这一点。但当XST完成它的时候,我们可以确定逆变器已经消失了!现在,如果我们坚持使用keep属性和MAP/PAR约束,我想知道我们是否会看到倾斜?RE:delta-你说得很对,它们会导致真正的延迟。主要的一点是XST sim模型应该与FPGA中的实际情况相匹配——因此,如果存在可忽略的hah,那么谁来定义它呢!:由于硅的延迟,sim模型应该没有三角洲。我完全同意。我担心的是,一个没有经验的读者可能会发现delta延迟在全球范围内并不重要,而delta不是问题所在。使用ODDR2而不是BUFG有什么好处?我的理解是,BUFG也会将时钟带到时钟树上,而不是作为正常信号路由。Xilinx模块串联有一个ODDR2和一个BUFG。这有什么好处?就我所见,ODDR2和BUFG之间的区别在于触发器的存在?@Stacey Anne Rieck:BUFGs将时钟引入内部时钟树,ODDR2允许时钟从内部时钟树引入外部引脚。ODDR2的输出通常应该直接发送到PIN驱动程序,而不是BUFG。另外,纯粹从使用xilinx工具的角度来看,是否值得在verilog中工作,以避免您提到的自动翻译问题可能产生的任何问题?我怀疑改用verilog不会太困难,我只是还没有真正的动机这么做;我非常喜欢VHDL,如果它是自动翻译的,至少它可能是正确的。令人好奇的是,他们在如此低的级别上如此糟糕地使用VHDL。我只能推测原因,但可能是如果他们编写了好的VHDL,它就不容易移植到Verilog。
not_rx_clk <= not (rx_clk_int);
rx_clk <= rx_clk_int;