【发布时间】:2016-09-05 07:50:02
【问题描述】:
我发现自己实现了一个 Verilog 代码,用于将 FT600 USB3.0 FIFO 连接到 Lattice ICE40 FPGA。不过,我在这里要问的问题并不特定于这部分,因为它适用于您必须设计状态机并将数据读/写到同步并行总线的任何时候。
我确信这是非常基本的东西,但我在互联网上的任何地方都找不到令人满意的答案,而且我想不出另一种方法来解决这个问题。就这样吧。
这是相关总线的时序图。 (取自 ft600 数据表,省略多余部分):
观察图表,我们看到 FT600 提供的数据和控制信号在上升时钟沿期间是稳定的。因此,FSM 必须对这些信号进行采样并在时钟的上升沿相应地更改状态 (
always @(posedge clk))。这个推理正确吗?-
我正在实现一个 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