【问题标题】:FPGA Synchronous Bus TimingFPGA 同步总线时序
【发布时间】:2016-09-05 07:50:02
【问题描述】:

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

我确信这是非常基本的东西,但我在互联网上的任何地方都找不到令人满意的答案,而且我想不出另一种方法来解决这个问题。就这样吧。

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

  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 的约束,但我从未使用过它们,我 我不熟悉这些术语(输出延迟、输入延迟、最大 延迟、多周期、时钟延迟...)以及如何使用它们。

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

【问题讨论】:

    标签: constraints delay fpga timing fsm


    【解决方案1】:

    如果您尝试为总线接口提供相对于时钟的保持时间,有多种方法可以做到这一点。我不能直接与 Lattice 部分或工具交谈,我没有使用过他们的设备。

    1. 约束驱动的固定延迟

    为设计工具提供能够推断正确保持时间的时序约束。在内部,它可能会使用通常位于 I/O 块结构中或附近的可编程延迟元件。我个人不喜欢这个,因为编译基础上的变化。工具不能给你精确的延迟,它们只能保证“不小于”或“不大于”。因此,您最终可能会修复一个不相关区域中的错误,然后让您的总线因新的比特流而变得不稳定。

    1. 修复了手动延迟

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

    1. 修复了手动歪斜

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

    1. 可编程延迟

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

    1. 自校准延迟

    与 #4 类似,但现在部件本身会找到最佳延迟。通常这是通过总线上的“写确认”操作来完成的。您在从属部分写入一个寄存器,然后将其读回。使用此反馈循环,您可以通过迭代延迟值来扫描窗口,然后选择成功传输窗口边缘之间的中点。这可以在启动时、定期或响应环境变化时执行。通常情况下,除非您正在处理您所没有的高速序列化 I/O,否则它不会全部发生。

    1. 更快的时钟和捕获脉冲

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多