Board logo

标题: 求助:程序可以下载到SDRAM中,但是执行不正确,为什么啊 [打印本页]

作者: whh    时间: 2008-8-6 23:08     标题: 求助:程序可以下载到SDRAM中,但是执行不正确,为什么啊

调试2C20+SDRAM,折腾了N天,程序下载时终于没有提示Verify failed了,但是下载进去后程序运行不正确,进入调试界面观察其汇编代码,发现有时汇编代码正确,有时是乱码,而有时能跳到main()函数中,有时又不能,直接就跑飞,即使能跳到main()函数,其汇编代码也是乱的,都是0xFFFFFFFF。我已经将PLL的相移从-2度以9度为步进调整到了-297度,系统主频是80M,SDRAM是三星的8M的,K4S641632,软件Quartus8.0。大家说一下还有可能是什么问题啊?

[此贴子已经被作者于2008-8-6 23:17:23编辑过]


作者: caopengly    时间: 2008-8-7 12:42

楼主可以先把主频降低些,比如10M或更低,看看sdram是不是好的,当然这时相移在-30~-70左右就可以了。

楼主看看程序有没有问题,可以建一个小的nios程序和小的ram on chip,在fpga上面单独跑,看程序有没有问题。

硬件问题出错可能性比较多啊,楼主需要好好分析,关键是思路要清晰。


作者: whh    时间: 2008-8-7 21:06

谢谢版主,降频我还没有试,今天试了一下在RAM里运行对SDRAM读写操作的程序,主要功能是向SDRAM的一段地址写入一些给定的数据,然后再读取出来进行比较。下面是主要实现代码:

for(i = 0;i < PRO_LENGTH;i++)
{
sdw = i + 1;

}

while(j < 32)
{

for(i = 0;i < PRO_LENGTH;i++)
{
addr = 50*j+i+5000;
IOWR(SDRAM_BASE,addr,sdw);
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xFF);
for(i = 0;i < PRO_LENGTH;i++)
{
addr = 50*j+i+5000;
sdr = IORD(SDRAM_BASE,addr);

}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
for(i = 0;i < PRO_LENGTH;i++)
{
if(sdr != sdw)
{
alt_printf("i=%x\n",i);
alt_printf("j=%x\n",j);
alt_printf("sdr=%x\n",sdr);
alt_printf("sdw=%x\n\n",sdw);
counter++;
}
}

j++;

}

结果发现,当写入的SDRAM地址addr为0x1400时,执行写入函数IOWR(SDRAM_BASE,addr,sdw)时,程序就会复位,然后从头开始运行,后来经试验,发现只要在测试循环中写入的是256的倍数处的地址(即0x100、0x200、0x300...),都会发生上面的现象,但是要是在这段循环之前(即while(j < 32)语句之前)直接写入256这个地址,又能正常执行,真是奇怪啊。


作者: caopengly    时间: 2008-8-11 12:51

这样比一下可能就不奇怪了,我觉得楼主如果有其他的sdram可以比较一下,我觉得sdram还是有可能有硬件的问题啊。
作者: tanjun    时间: 2008-9-14 15:32

我也遇到到楼主同样的问题,不知楼主是否已经找到解决方法?


作者: csbowei    时间: 2008-9-18 12:12

楼上要PLC编程电缆联系我啦
[em01][em01]
作者: fjx0012    时间: 2011-9-9 14:04

我的经常跑不到main();唉




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0