|
最近在用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周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|