我正在 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 周的时间来完成论文,所以我想确保我的设计能够奏效。