|
最近在用MAXII系列的EPM1270去驱动SDRAM,进行正常的读写操作。
SDRAM设为突发读写模式,突发长度为4。所以在CPLD中,针对读写端口分别设了4个字长的FIFO.把4个数据看成一组,进行读写操作。
每一个数据是16bit. FIFO长度为16bit*4。
时钟是80MHz。
数据流如下
(CPLD中) (CPLD中)
RD_FIFO <- SDRAM<- WR_FIFO
现在出现一个令人费解的BUG.
1.首先如果写好一组数据,多次读这组数据,它们的值是稳定不变的。
2.但写入一些特殊的数据是(当高4位数据为'1'时,如0xffff)数据不稳定
写入 读出 会出现错误(也可能是其他错误,结果不稳定)
0x0000 0x0000
0x0001 0x0001
0xffff 0x0001
0xffee 0xffff
但当高4位为零时,比如
写入 读出 始终是正确的
0x0000 0x0000
0x0001 0x0001
0x0002 0x0002
0x0003 0x0003
写入 读出 始终是正确的
0x0000 0x0000
0x0ff1 0x0ff1
0x0ff2 0x0ff2
0x0ff3 0x0ff3
我的问题来了,为什么错误会依赖于数据的内容呢? 谁有这方面的经验,该从哪块入手去找BUG。
我怀疑以下的一些问题,但不知道从哪入手比较好,希望大家指点。
1.SDRAM布线不等长(这个很难去改,因为板子已经画好了。网上我看到不等长对SDRAM影响不大。我试图降低时钟频率,来降低影响,但结果还是同样的错误。所以不确定是不是这个原因。如果是这个原因,应该是某个bit位数据不稳定,而不是整体出错)
2.时钟。(SDRAM_CLK 是晶振通过 CPLD 直接给 SDRAM 时钟引脚的,在内部有大约6ns的tpd延时(约等于半个时钟周期)。看SDRAM的文档,说是在时钟上升沿采样。我也有些不确定时序是否有问题。 但我反相时钟后,数据就更加混乱了)
说的可能比较混乱,不清楚的我可以在解释。谢谢大家帮忙了。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|