摆脱保持时间冲突(Xilinx HDL)



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

我的问题的核心是我有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时钟有3个保持时间违规(60MHz时钟是OK的)。

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

是否有一些已知的多时钟FIFO的好方法?不仅仅是两个(即使在赛灵思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个违规所掩盖?

post PAR模拟验证是否可以在船上工作?我会在船上尝试它,但我必须等待2周的BGA焊接,我只有4周的时间来完成论文,所以我想确保我的设计将工作。

FIFO可以作为异步的。两个主时钟域60Mhz和150Mhz之间的边界桥。严格分离两个时钟域的逻辑。应该只有几个已知的慢速控制信号(慢到可以应用错误路径定时约束)用于它们之间的通信。例如,GUI将时钟比率写入60Mhz一侧的寄存器中。然后它向快速方发出信号,表示有一个新值。快速方在收到通知后捕获该值(例如,对元稳定性进行一些额外注意的上升沿检测)。快速侧的函数逻辑总是使用这个影子寄存器的输出,它也在快速侧。

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

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

最新更新