0

我正在 FPGA 中实现 DSO 控制器,但我遇到了太多违反保持时间的问题(到目前为止,最好的 P&R 结果是 3 个保持时间错误,大约在 -2ns slack 左右)。

我的问题的核心是我有 FIFO 缓冲区,输入来自 ADC 采样抽取器,然后输出到同步 FT245 (60MHz)。输入抽取器可以设置为以 2 的幂次方抽取(例如 1、2、4、8、16...),这也分频 ADC 样本的时钟频率(150MHz)。

我现在的方法是在捕获数据时提供分频(或直接,如果抽取器比率为 0)时钟频率来缓冲,然后当我将样本推送到 PC 时,我从 FT245 切换到提供 60MHz 时钟。在模拟中它工作得很好,但问题在于布局和布线,该路由器会吐出这个错误:

Route:466 - Unusually high hold time violation detected among 226 connections. The top 20 such instances are printed below. The
   router will continue and try to fix it

然后它会持续运行 10-15 分钟,直到它给我计时报告,通知我满足所有设置时间限制,并且 150MHz 时钟(60MHz 时钟正常)有 3 次保持时间违规。

我已经读过这个问题可能是使用门控时钟,即 FPGA 无法正确分配时钟,但我尝试使用方法而不是 FIFO 的门控时钟,我将 150MHz 时钟直接连接到 FIFO,并且我正在使用 dataReady 门控 FIFO 中的数据(它实际上最终是与以前门控时钟相同的信号)然后我得到了比现在更多(50-60)的保持时间违规。

多时钟 FIFO 是否有一些已知的好方法?不只是两个(即使在 Xilinx ISE 的示例中也很多)。还是在 FPGA 中抽取 ADC 样本的想法行不通?

目标 FPGA 是 Spartan 6 LX25 速度等级 -2(不幸的是我无法获得 -3 速度等级)。

这是它给我的松弛示例:

Slack (hold path):      -2.031ns (requirement - (clock path skew + uncertainty - data path))
  Source:               decimator_clock_divisor/decimationRatio_0 (FF)
  Destination:          trigger_analog1/previousValue_2 (FF)

提到的来源是信号(它给我的所有违规行为都是),它不会经常更改,它实际上是由 GUI 控制的,所以我不知道它怎么可能有保持时间违规。它是从抽取器比率到触发缓冲区(或其他违规情况下的我的 FIFO 缓冲区)的路径。

基本上我的问题是我是否应该关心这些违规行为?

因为在改变抽取器的比率之后,在我真正开始在触发器中使用抽取器的结果之前可能有数千个时钟周期。

我知道路由器不知道我多久更改一次异步信号(它是异步的,因为我是从 60MHz 时钟域设置它)以及使用某些模块的结果需要多长时间。问题是我不知道它是否在完成 PAR 后向我显示这 3 项违规是否是最终的,是否没有其他违规只是被这 3 项违规所掩盖?

是否可以发布 PAR 模拟验证它是否可以在船上工作?我会在船上试一试,但我必须等待 2 周才能完成 BGA 焊接,而我只剩下 4 周的时间来完成论文,所以我想确保我的设计能够奏效。

4

1 回答 1

2

FIFO 可以作为异步。两个主时钟域 60Mhz 和 150Mhz 之间的边界桥。严格分离两个时钟域的逻辑。它们上应该只有几个已知的慢速控制信号(足够慢,因此可以应用错误路径时序约束)来进行通信。例如,GUI 将时钟比率写入 60Mhz 端的寄存器。然后它向快方发出信号,那里有一个新值。快速端在接收到通知后的几个周期内捕获此值(例如,上升沿检测需要特别注意元稳定性)。快速端的功能逻辑始终使用同样位于快速端的影子寄存器的输出。

对于快速 ADC 端的时钟分频,您可以使用完整时钟并按照您的描述启用(我也希望如此),或者您可以自行分频时钟。对时钟进行分频时,请确保遵循赛灵思文档中的示例。例如,有时需要一个时钟缓冲器来分配时钟。

如果还有剩余的保持路径违规,请查看源和目标 FF 的时钟和时钟到达时间。有时当目标FF的捕获时钟延迟时,数据就早了。路由器可以通过简单地延迟数据来解决这个问题。当设置要求不允许进一步延迟时(可能是两个时钟之间的不确定性太高的情况),它无法修复。

于 2013-04-09T18:26:58.977 回答