geff 发表于 2012-2-7 12:21:44

CPLD驱动SDRAM有问题啦!

最近在用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的文档,说是在时钟上升沿采样。我也有些不确定时序是否有问题。 但我反相时钟后,数据就更加混乱了)

说的可能比较混乱,不清楚的我可以在解释。谢谢大家帮忙了。

wwwfw 发表于 2012-2-7 14:37:51

算了,搞一个EP1C3T100,价格和EPM1270也差不多,用1c3做sdram多方便,一切都是现成的,何必用cpld呢?!

geff 发表于 2012-2-7 17:04:47

回复【1楼】wwwfw
-----------------------------------------------------------------------
谢谢你的提议
做这个项目,主要是为了学习

geff 发表于 2012-2-7 17:12:57

时钟晶振是80MHz,周期为12.5ns.

从CPLD到SDRAM所有信号线的最大差不到2 inch. 网上看到电路板一般用的是FR4材料,信号传播速度大概在180ps/inch。这个参数会随着温度变化而变。但可以看出来不严格等长布线,对信号影响很小。

继续找BUG,怀疑是SDRAM clk在CPLD中的延时,让SDRAM采样落不到数据的有效窗口中。

appleboy 发表于 2012-2-7 18:00:04

建议你用ALTERA官方的程序测试一遍,以排除你对硬件的担忧

study_yu 发表于 2012-2-8 08:47:22

时钟非常重要。在80M的频率下,时序裕量本来就不大,再加上触发器的输出延时和内部布线延迟,时序可能不满足要求。
将时钟频率降低再试试

youpeng 发表于 2013-10-16 13:25:20

顶,lz的问题解决得怎样了?{:handshake:}
页: [1]
查看完整版本: CPLD驱动SDRAM有问题啦!