01signal.com

Source-synchronous inputs

介绍

本页讨论 source-synchronous data inputs: 这种技术意味着 data inputs 与外部组件与这些 inputs并行生成的 clock 同步。

Source synchronous clocking with inputs only

通常使用此方法只是因为这是外部组件的工作方式。另一个很好的理由是 data 的来源在物理上远离 FPGA。 FPGA 和另一侧之间也可能有电缆和连接器。例如,发送 pixel data的 digital camera 。

source-synchronous clock 的一个可能困难是它可能不会一直处于活动状态。 clock signal 也可能受到悬空物理连接或过大噪音的影响。也有可能是 clock 没有稳定的 clock period,或者 jitter 过高。当 data (因此也是 clock)的来源是 microprocessor的 I/O peripheral时,这种情况经常发生。

请注意,有一个单独的页面总体上讨论了 clock 和 data 之间的关系。

应对不稳定的 clock

source-synchronous inputs 最重要的准则是 clock 不应直接连接到 FPGA内部的 logic elements 。相反, FPGA 内部使用的 clock 应该是干净的 clock,它是由 FPGA内部的 PLL 生成的。

如果外接的 clock 直接连接到 FPGA内部的 logic ,可能会出现奇怪的问题: 错误的 clock 会产生意想不到的行为,这些行为看起来不像是 clock的问题。过多的 jitter 和 glitches 可能违反保证 design可靠运行的 timing 要求。结果是几乎任何事情都可能发生,包括根据 Verilog 代码不可能发生的情况。因此很容易误认为问题出在 FPGA design中的 bug 。

很自然地(错误地)认为 clock 的问题只会导致 clock cycles的丢失,因此一些 data 元素将会丢失。当一个坏的 clock 导致其他问题时,解决这个问题的尝试通常集中在 logic design 上看起来最相关的部分。那会浪费很多时间。

唯一可以让 logic fabric 直接使用外接 clock 的情况,就是在保证这个 clock 稳定干净的情况下。如果 FPGA 开始运行时此 clock 不稳定,则需要处理此问题: 只要 clock 不稳定,就必须在依赖这个 clock的 logic 上应用一个 reset 。

可能的策略

与外部 clock同步主要有四种可能的策略。这些策略将在下面讨论,没有特别的顺序。

策略#1: 01-signal sampling

这个策略对于 source-synchronous inputs来说是最稳健的方法。当外部 clock 出现异常时, 01-signal sampling 比任何其他方法都有明显的优势。不过这种方法只有当数据源的 clock 频率比较低的时候才有用。

该方法将在专门页面上单独讨论

策略#2: 使用 PLL

通过这种策略,外部 clock 连接到 FPGA上的 PLL 的 input 。这个 PLL的 output clock 用于 logic elements。当 PLL 未锁定时,将 reset signal 应用于这些 logic elements 。该解决方案确保 logic elements 依赖稳定的 clock: 当 PLL的 output clock 不稳定时, logic elements 会被 reset停用。

与直接连接外部 clock 相比, PLL 也更容易实现 timing 要求: PLL 补偿了 clock pin 和 FPGA内部 clock之间的 delay 。

但是,请注意外部 clock 的缺陷可能会导致 PLL的 output处出现过多的 jitter 。 PLL的 lock detector 可能会继续指示 PLL 正常运行,即使它产生的 clock 异常嘈杂。这种情况没有简单的解决方案。一种可能性是将timing constraints更改为取决于 PLL的 output的 logic 。比如 timing constraints 中的 clock的 jitter 可以增加到 PLL 很可能不会超过的值(因为会出现 loss of lock )。

该策略与system synchronous clocking有相似之处: 两种场景都是外接一个 clock 接一个 PLL, FPGA内部使用这个 PLL 的 output 。因此, timing constraints 的编写方式与system synchronous clock相同。

请注意, PLL 通常以最适合system synchronous clock的方式将其 output clock 与 external clock 对齐。 source synchronous clock 的最佳对齐方式可能略有不同。在这两种可能性中, clocks 都没有完全对齐。相反, clocks的 edges之间有一个有意的小时间差。这个时间差更容易满足 I/O registers对 timing 的要求。某些 PLLs 可以配置为使 clocks 与 source synchronous clock对齐以获得最佳性能。

与此处列出的其他策略相比,此策略是最容易实施的策略。适用于比较高的 clock 频率。但对于接近 I/O 所能达到的最大值的频率,此策略可能不起作用。

策略#3: Phase shifting

当 data rate 接近 FPGA 所能支持的最大值时,通常会选择这种策略。

保证 timing 要求的常用方法在此类 data rates上不起作用: 就不可能实现 timing constraints。然而, data signals 的可靠采样仍然是可能的。

timing constraints的问题是通过一个计算来保证 timing 的要求: 这种计算包括几个不确定的参数,例如 FPGA的制造差异。当考虑这些参数时,计算不会产生可确保可靠采样的 timing 解决方案。当 data rate 非常高时,没有多余的 timing 可以浪费在这些不确定性上。

但是对于特定的 FPGA chip,这些参数是不变的。因此,解决方案是在 FPGA 工作时搜索正确的 timing 。实际上,这意味着 FPGA 内部的 state machine 在 data clock 和采样时刻之间调整 delay 。因此使用自适应机制来找到最优的 timing,而不是依赖于计算。这种机制称为phase shifting

这种策略通常与 DDR SDRAM memories的 data signals 一起使用。在此应用中,目标始终是尽可能高地达到 data rate 。因此, I/O ports的功能被推到了极限。因此, phase shifting 是确保 data inputs 可靠采样的唯一方法: DDR memory 初始化完成后,向 memory 写入一段特殊的 data 序列( data signals 到 memory 都是source-synchronous outputs ,所以 timing没有难度)。然后 FPGA 重复读取 DDR memory中的同一部分。 state machine 通过逐渐改变采样的 delay 找到最优的 timing 。预期的 input data 是已知的,因为它与之前编写的 data 序列相同。因此, state machine 可以轻松评估 data 的可靠性,并找到最佳的 delay。

这种机制的一个有趣的特点是 data clock 可以忽略: DDR memory 与 FPGA 生成的 clock 同步。这个 clock 是 DDR memory收到的source-synchronous outputs的一部分。因此可以保证 source-synchronous inputs 的 data clock 具有与 FPGA生成的 clock 完全相同的频率。因此, phase shifting 机制可以依赖内部 clock 而不是随 data一起到达的 clock 。这两个 clocks之间有一个未知的 delay 并不重要: 不管这个 delay如何, state machine 都找到最优的 timing 。

实际上, DDR memories通常是这样实现这种机制的: 尽管 DDR memories 有一个 source-synchronous clock (称为 data strobe),但 phase shifting 机制的通常实现忽略了这个 signal。理由是确保 data signals 可靠到达比与 strobe对齐更重要。

所以使用 phase shifting 可以消除对 data clock的需求。如果保证其频率与 data rate完全相同,则可以依赖内部 clock 。

采用这种策略, timing constraints 的用途与常规 IOB registers相同。

策略#4: 直接使用 clock

这个策略显然是最直接的一个: 外部的 clock 直接连接到 FPGA内部的 flip-flops 。是这样的:

module top (
   input data_clk,
   input [7:0] data
);

   reg [7:0] data_samp;

   always @(posedge data_clk)
     begin
       data_samp <= data;

      [ ... ]
     end

如上所述,这种策略通常不是一个好主意。主要原因是如果 @data_clk 有一个 glitch,所有依赖于这个 clock 的 logic 都变得不可预测

如果保证清洁和稳定,以这种方式使用外部 clock 是合理的。但即使这样保证,也可能因为 clock pin 和 flip-flops之间的 delay 而难以达到 timing 的要求。有些 FPGAs 有专门的 clock 资源,就是为了减少这个 delay。这可能需要使用专用的 clock input pin 并将 I/O ports 限制在 FPGA上的特定区域。

当直接使用 clock 时, timing constraints 的编写方式与system synchronous clock相同。

如上所述,此策略的直接替代方法是使用 PLL。如果 data clock 不稳定,则应考虑 01-signal sampling 。

概括

本页首先提到 01-signal sampling 并非巧合,并且该策略在单独的页面上进行了描述: 如果 data rate 不高于此方法的能力,则这是最推荐的方法。

如果考虑其他策略,一定要注意 data clock的稳定性。如果 clock 偏离其允许的行为(即 clock period 和最大 jitter),这可能导致相关 logic发生永久且不可恢复的故障。只有 reset 才能使 logic 恢复正常运行。

使用 PLL 生成可靠的 clock 可以大大改善这种情况: 只要 lock detector 表明如此, PLL的 output 就是可靠的。否则应将 reset 应用于此 logic 。

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