最近项目中遇到的dcfifo的问题,和大家分享一下!
wrclk=33MHz,是外部输入的pci时钟;rdclk=120MHz,是由50MHz的晶振经PLL生成。
实际测试的时候发现运行一段时间就会出现数据错乱的情况。
未修改其他逻辑,只是弃用了板上的50MHz晶振,用33MHz的pci时钟经PLL生成99MHz和132MHz的时钟。fifo的rdclk改为99MHz。另外工程中用到120MHz时钟的模块改为99MHz或132MHz。
再测试就没有问题了。
我们定位问题:33MHz时钟和120MHz时钟无任何相位和频率关系,导致fifo运行不稳定。
但是Altera的文档上根本没有这一限制啊,理论上是不应该出问题的。
这是不是Altera dcfifo的一个......呢?
欢迎有经验的大侠们加入讨论,分享自己的经验啊。
还有就是同样的代码,就是用的板子不是同一块,在客户那里出问题,在我们这里就是不出问题,所以在debug的时候都是远程。我觉得很奇怪......
看看里面是否有什么异步处理的时候没处理好,产生了亚稳态的问题
与时钟频率关系无关,是逻辑设计的问题。
3# 心海的一滴泪
谢谢。
最初的设计33MHz和120MHz时钟的唯一有交叉的地方就是用于数据缓存的dcfifo,写时钟是33MHz,读时钟是120MHz。
所以我觉得不是我的逻辑设计产生了亚稳态,而是我调用的这个IP核产生了亚稳态。
4# jackertja
我没有改其他的逻辑,只是将时钟换了一下,一开始写时钟33MHz,读时钟120MHz出问题;后来换成写时钟33MHz,读时钟采用写时钟的3倍频99MHz就对了。我觉得这样看来的话逻辑是没有问题的。时钟的差别导致我调用的这个dcfifo的运行不一样了。
6# psd0208
可是降低时钟频率,MTBF也会跟着降低呀,亚稳态发生的几率也会降低的。
7# defflin
谢谢!有道理!
显然是亚稳态造成的
学习了。
altera dcfifo。你可以仔细读一下代码,就可以发现他的fifo,首先空满标志位,没有经过任何处理。直接通过二进制读写指针得到。也就是说在时钟相位较好的情况下(尤其是同源时钟),没有任何问题。但是如果时钟没有任何关系,空满标志位就可能会产生错误。因此FIFO的数据可能发生问题。如果非要dc fifo的话,需要根据他的代码改一下,把空满比较改为格雷码比较。而不是用二进制码比较。
拿示波器看看晶振输出。FIFO不要用ACK模式。哪有那么多亚稳态问题啊。
学习一下
我也遇到一样的问题,写时钟是外部输入,读时钟是内部PLL对晶体时钟倍频产生,完全没有任何关系,结果完全没法工作。