摆脱保持时间违规(Xilinx HDL)

时间:2013-04-09 14:59:01

标签: vhdl xilinx synthesis

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

我的问题的核心是我有来自ADC采样抽取器的输入的FIFO缓冲器,然后输出到同步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时钟有3次保持时间违规(60MHz时钟可以)。

我已经读过可能正在使用门控时钟的问题,FPGA无法正确分配时钟,但我尝试接近而不是将FIFO的时钟连接到150%时钟直接连接到FIFO,我在FIFO中选通数据dataReady(它实际上最终与之前的门控时钟信号相同)然后我比现在有更多(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周的时间来完成论文,所以我想确保我的设计能够正常工作。

1 个答案:

答案 0 :(得分:2)

FIFO可以充当异步。两个主时钟域60Mhz和150Mhz之间的边界桥。严格区分两个时钟域的逻辑。应该只有一些已知的慢速控制信号(足够慢以便可以应用错误的路径时序约束)进行通信。例如,GUI将时钟比率写入60Mhz侧的寄存器中。然后它向快速侧发出信号,表示有新值。快速方在收到通知后的某些周期内捕获此值(例如,上升沿检测并特别注意元稳定性)。快速侧的功能逻辑总是使用该影子寄存器的输出,该输出也是快速的。

对于快速ADC侧的时钟分频,您可以使用完整时钟并按照您的描述启用(我也更喜欢)或者您可以自己分频时钟。划分时钟时,请确保遵循Xilinx文档中的示例。例如,有时需要时钟缓冲器来分配时钟。

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