01signal.com

Source-synchronous outputs

介绍

本页讨论 source-synchronous data outputs。这种技术意味着 data outputs 与 FPGA 与这些 outputs并行生成的 clock 同步。

Source synchronous clocking with outputs only

如果与外部组件的接口仅由 FPGA中的 output ports 组成,则此方法是显而易见的选择。如本页底部所述,如果 I/O 是双向的,它也适用。还有一个单独的页面讨论了 clock 和 data 之间的一般关系。

基本应用

考虑这个 Verilog 示例:

module top (
   input clk,
   output reg [7:0] data_out,
   output reg sync_clk_out
);

   always @(posedge clk)
     begin
	sync_clk_out <= !sync_clk_out;
	if (sync_clk_out)
	  data_out <= data_out + 1;
     end
endmodule

请注意, @data_out 与 @sync_clk_out的 falling edge同时更改其值: 当 @sync_clk_out 为低电平时, @data_out 不变。当 @sync_clk_out 为高电平时, @data_out 响应 @clk的 rising edge变化为一个新值。

如果IOB registers用于 @data_out 和 @sync_clk_out,所有这些 output signals 几乎同时改变它们的值。接收这些 signals 的外部组件因此可以使用 @sync_clk_out 作为其 clock。这样通常很容易满足外部元件的 timing 要求(假设 @data_out 的采样与 @sync_clk_out的 rising edge同步)。

使用 DDR registers

上面的例子有一个明显的缺点: @sync_clk_out 的频率是 @clk频率的一半。因此 @data_out 的 data rate 也被限制在 @clk 频率的一半。唯一的例外是如果外部组件对 @sync_clk_out和 clock edges 都敏感(即它有一个 DDR input)。通常情况并非如此。

可以使用 output DDR register 来生成与 data outputs对齐的 output clock 。这个想法是使用一个 flip-flop 来改变它在两个 clock edges上的值。因此,这样的 flip-flop 行为如下:

always @(posedge clk or negedge clk)
     if (clk)
       sync_clk_out <= 0;
     else
       sync_clk_out <= 1;

@sync_clk_out 响应 @clk的 rising edge 变为低电平。由于 falling edge而发生相反的情况。结果是具有相同频率的 output clock 。

但是,此 Verilog 代码不适用于大多数 synthesizers,因为 logic fabric 中的 flip-flops 通常无法同时对 clock edges敏感。只有 IOB registers 有这种能力,而 synthesizer 很少聪明到能够理解这种可能性。

因此,需要 instantiation 或 logic primitive 。 primitive 特定于所使用的 FPGA 。此示例显示了如何为 Kintex Ultrascale完成此操作:

ODDRE1 ODDR_ins
     (.C(clk), .Q(sync_clk_out),
      .D1(1'b0), .D2(1'b1),
      .SR(1'b0));

但现在 clock 是用 output DDR register 生成的,而 data signals 是用常规 IOB registers生成的。 data 和 clock 之间的对齐并不像以前那么明显。因此,重要的是阅读所有 outputs的 timing reports ,并验证 delays 之间的差异是否足够小。

也可以将 output DDR registers 用于 data : 如果给 D1 和 D2赋予相同的值,则 output 对每个 clock cycle只改变一次:

module top (
   input clk,
   output [7:0] data_out,
   output sync_clk_out
);

   reg [7:0]  data;

   ODDRE1 ODDR_ins
     (.C(clk), .Q(sync_clk_out),
      .D1(1'b0), .D2(1'b1),
      .SR(1'b0));

   ODDRE1 ODDR_data_ins [7:0]
     (.C(clk), .Q(data_out),
      .D1(data), .D2(data),
      .SR(1'b0));

   always @(posedge clk)
     data <= data + 1;
endmodule

此方法确保 data 和 clock 对齐。 output DDR registers 的显式 instantiation 也确保使用 IOB registers 。这种方法的唯一缺点是它特定于每个 FPGA。

请注意, output DDR registers 的行为可能出乎意料且令人困惑。例如,注意 @data 与 @clk的 positive edge 是同步的。但是 ODDRE1 在两个 clock edges上都是活跃的。请务必阅读 FPGA 的文档,了解如何以及何时对两个 data inputs 进行采样。

另请注意,此示例中未使用 reset 。这可能是不安全的,特别是在复杂的 FPGAs上: output DDR register 可以是 IOB内部更复杂的 logic element 的一部分。如果没有 reset,此类 logic element 可能无法正常运行。

Timing constraints

那么这种方法需要 timing constraints 吗?如果 clock output 和 data outputs 由于使用 IOB registers而几乎完美对齐,这还不够吗?

答案是即使没有 timing constraints,这种方法也可以完美地工作。然而,利用 timing constraints 仍然是个好主意。原因与关于 IOB registers的页面中的相同主题相同。

其他注意事项

但是,使用 IOB registers 并不是唯一要确保的事情: 还要注意 output ports之间的物理距离。如果 output ports 彼此远离,则此物理距离会对 FPGA上的 clock skew 产生不良影响。 PCB 上电线 (traces) 长度的差异也会产生负面影响。此外,所有 outputs的电气参数(voltage、 I/O standard、 slew rate、 drive current 等)应该相同。

如果 FPGA 没有 IOB registers,那么 timing constraints 就变得至关重要: 使用 source-synchronous outputs 的基础是能够确保所有相关 output ports之间的低 skew 。在 flip-flop 和 I/O pin 之间控制 delay 通常就足够了: 如果此 delay 接近相关 FPGA可能的最小值,则 outputs 之间的差异对于大多数用途而言足够小。

双向 I/O

source-synchronous outputs 的主要特点是相关的 clock 是由 FPGA生成的。当所有 data signals 都指向外部组件时,这显然是合适的。但即使在两个方向上都有 data signals ,依赖 FPGA生成的 clock 也是有意义的。

但是请注意, data inputs 与 PCB上的 clock 同步,而不是 FPGA内部的 clock 。当然,这两个 clocks 的频率完全相同。但是有一个 timing 的区别,取决于 output ports的 clock-to-output delay 。这可能是几纳秒。

因此建议在 PCB上做一个 loopback : 将 FPGA的 clock output 连接到 input port。可以将此 input port 视为system synchronous clock : 外部组件的行为就好像它的 clock 来自专用的 oscillator,而不是来自 FPGA。这类似于system synchronous clock ,因为 FPGA 和外部组件都依赖于 PCB上的相同物理 signal 。

Source synchronous bidirectional data with loopback of clock

也可以将 data inputs 视为source-synchronous inputs 。特别是,如果使用 phase shifting 技术,则不需要 clock loopback。这实际上是与 DDR SDRAM memories接口的常用方式。

重要的结论是在 PCB 制造之前仔细规划 input signals 的 timing ,必要时考虑增加一个 clock loopback 。

此页面由英文自动翻译。 如果有不清楚的地方,请参考原始页面
Copyright © 2021-2024. All rights reserved. (6f913017)