2013-04-09 142 views
0

我在FPGA中实现DSO控制器,并且遇到太多保持时间违规(到目前为止最好的结果是3个保持时间错误约为-2ns松弛) 。摆脱保持时间违规(赛灵思HDL)

我的问题的核心是我有从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的门控时钟来代替,我直接连接150MHz时钟到FIFO,并且我在FIFO中选通数据与dataReady(它实际上结束了与以前门控时钟相同的信号),那么我得到了比现在更多(50-60)的保持时间违规。

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

目标FPGA是斯巴达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周完成论文,所以我想确保我的设计将工作。

回答

2

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

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

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

+0

我接受这个答案,因为感谢您的建议,我设法让PAR的计时分数为0。 – 2013-04-10 10:13:57