已经做了好久的sdram了。搞得很崩溃啊,千奇百怪的问题!
< 一 >:建立一xps project,片内微处理器用MicroBlaze,定制一ip mpmc sdram。 用plb46 或者 xcl 总线 访问外部sdram。软件调试。
< 二 >:自己根据lattice 的sdram ip 写了一个sdram controller ,chipscope调试。
< 三 >:1)按照<.一>的方法测试sdram。
2)按照<二>的方法测试sdram。
3)按照<二>的方法向sdram写数据,通过<一>读。
<四>:调试过程中,发现的问题:
按照自己写的代码调试,突发长度为4,读写都正确了。
调用mpmc ip核。
代码如下:
Xuint32 startAdr = MEM_BASEADDR;
Xuint32 myAdr;
Xuint32 range = MEM_SIZE;
Xuint32 DataRead[32];
Xuint32 error ;
Xuint32 total_errors = 0;
// ---------------------------------------
// TEST1 - DATA == ADDR test
// ---------------------------------------
error = 0;
for(myAdr = startAdr; myAdr < startAdr+1000; myAdr = myAdr + 4)
{
WR_WORD(myAdr, myAdr);
}
for(myAdr = startAdr; myAdr < startAdr+1000; myAdr = myAdr + 4)
{
RD_WORD(myAdr, DataRead[0]);
if (DataRead[0] != myAdr)
{
error++;
}
total_errors += error;
}
得到结果: 0x80000000(startAdr) : 0x00000000;
0x80000004(startAdr) : 0x80000004;
0x80000008(startAdr) : 0x00000000;
0x8000000c(startAdr) : 0x8000000c;
……
for(myAdr = startAdr; myAdr < startAdr+range; myAdr=myAdr+4)
{
WR_WORD(myAdr, 0x55555555);
}
for(myAdr = startAdr; myAdr < startAdr+range; myAdr=myAdr+4)
{
RD_WORD(myAdr, DataRead[0]);
if (DataRead[0] != 0x55555555)
{
error++;
}
total_errors += error;
}
得到结果: 0x80000000(startAdr) : 0x00000000;
0x80000004(startAdr) : 0x55555555;
0x80000008(startAdr) : 0x00000000;
0x8000000c(startAdr) : 0x55555555;
……
btw : SDRAM 芯片为: MT48LC32M16A2,DQ宽16bit 行地址:13bit 列地址 10bit Bank 地址 2bit.
另一种做法是,自己写的控制器,往sdram写好数据,用mpmc ip核读。
读到的数据和写入的一致!
实在不知道问题出在啥地方?有人懂么?
用户292641 2010-10-14 15:48