FPGA同步总线时序

时间:2016-05-10 11:07:03

标签: constraints delay fpga timing fsm

我发现自己实现了一个Verilog代码,用于将FT600 USB3.0 FIFO连接到莱迪思ICE40 FPGA。我在这里要问的问题并不是特定于这些部分,因为它适用于每当你必须设计状态机和读/写数据到同步并行总线时。

我确信这是非常基本的东西,但我无法在互联网的任何地方找到满意的答案,我想不出另一种方法来制定问题。在这里。

以下是相关总线的时序图。 (取自ft600数据表,省略冗余部分):

enter image description here

  1. 观察图表,我们发现FT600提供的数据和控制信号在上升时钟边沿期间是稳定的。因此,FSM必须对这些信号进行采样,并在时钟的上升沿(always @(posedge clk))相应地改变状态。这种推理是否正确?

  2. 我正在实施一个Moore FSM,其输出仅取决于当前状态。假设初始状态为RX_WAIT。一旦FSM在上升时钟(A)对RXF_N = 0线进行采样,状态将变为RX_PRE。然后,组合块将状态RX_PRE转换为FPGA输出OE_N = 0,RD_N = 0。问题是:如果这个组合块非常快,输出将在(A)之后的红线处改变,而不是在应该是上升时钟之间的黑线。这可能违反了芯片的保持条件。我可以想到两个解决方案:

    A)放置一个寄存器,对输出后的输出进行采样 时钟的下降边缘的组合块。然后我们 如果组合块慢于半个,则会出现问题 时钟周期。另外,我被告知混合上升和不是很好 除非你正在做DDR,否则会出现掉落的触发器。

    B)以某种方式确保组合块的延迟 恰好半个时钟周期,必要时增加延迟(这是什么 我们想要?让系统变慢?)。在这种情况下,我该如何指导 编译器这样做?我正在使用支持计时的Ice Cube 2 类似于Altera的限制,但我从未使用它们和我 我不熟悉这些术语(输出延迟,输入延迟,最大值 延迟,多周期,时钟延迟... )以及如何使用它们。

  3. 我很确定(B)是要走的路,如果有经验的用户必须给我一些建议,我会非常感激。

1 个答案:

答案 0 :(得分:0)

如果您尝试提供相对于总线接口时钟的保持时间,可以通过多种方式进行操作。我无法直接与莱迪思部件或工具对话,我还没有使用他们的设备。

  1. 约束驱动固定延迟
  2. 为设计工具提供时序约束,以推断正确的保持时间。在内部,它可能使用可编程延迟元件,该元件通常位于I / O块结构中或附近。我个人不喜欢这个因为编译的变化。工具不能给你一个精确的延迟,他们只保证"不低于"或者"不超过"。因此,您最终可能会修复一个不相关区域中的错误,然后使用新的比特流使您的总线变得不稳定。

    1. 修正手动延迟
    2. 在I / O块的RTL实例中嵌入常量,将值连接到延迟端口。精确计算这个值很棘手,因为您需要涵盖PCB设计和零件变化的不确定性。并非所有输入端口都具有相同的电容,并且所有PCB走线也不具有相同的长度。

      1. 修正手动歪斜
      2. 为总线生成I / O时钟,并使用PLL设置提供延迟。从概念上讲,您可以将延迟设置为所需的保持时间,然后将其传播到出站信号。要小心,因为限制和满足静态时间并不明显。出于这个原因,我会避免这种可编程技术的方法。

        1. 可编程延迟
        2. 与#2类似,现在只将延迟连接到设计中的可编程寄存器。这允许您进入实验室,然后拨打"拨入"理想的设置,通过示波器直接观察信号,或间接行为。这是最通用的解决方案,但请注意,在生产中,您将根据部件(调节器电压不确定性,工艺变化)以及环境(温度)进行一些变化

          1. 自校准延迟
          2. 与#4相似,但现在该部分本身确实找到了最佳延迟。通常,这是通过"写确认"在公共汽车上行动。您在从属部分写入寄存器,然后将其读回。使用此反馈循环,您可以通过迭代延迟值来扫描窗口,然后选择成功传输窗口边缘之间的中点。这可以在启动时,周期性地或响应环境变化来执行。除非你正在处理你的高速序列化I / O,否则它通常不会解决所有这些问题。

            1. 更快的时钟和捕获脉冲
            2. 想法是增加你的时钟,然后有一个触发启用的状态机。比" negedge"更精确但比大多数I / O延迟块更颗粒。因此,您可以一次移动1/8周期的信号,或1/16。我只提这个,所以如果你在某个地方看到它,你就知道要避免它。