http://njnmnp.narod.ru/proj/video/video.html
Для экономии подсоединил выводы SDRAM (1Mx16x4BANK 7нс) DQM/DQL на землю CKE на притание.
Для тестирования памяти написал тестовую программу (Q7.2 + SP3)
Код
memory_base = MEMORY_BASE_ADDRES;
while (memory_base < 0x02800000)
{
if (switcher!=0x55555555)switcher=0x55555555;
else switcher=0xAAAAAAAA;
IOWR_32DIRECT(memory_base, 0, switcher);
Readed_32=IORD_32DIRECT(memory_base, 0);
if (Readed_32 !=switcher)
{
for (;;);
}
memory_base +=0x04;
}
while (memory_base < 0x02800000)
{
if (switcher!=0x55555555)switcher=0x55555555;
else switcher=0xAAAAAAAA;
IOWR_32DIRECT(memory_base, 0, switcher);
Readed_32=IORD_32DIRECT(memory_base, 0);
if (Readed_32 !=switcher)
{
for (;;);
}
memory_base +=0x04;
}
Частота которую проект допускает равна 122МГц.
То есть при компиляции с частотой работы со SDRAM 144 - получаю "критический варнинг" с указаной частотой 122 МГц
Перевел проект на 108 Мгц, варнинг исчез.
При пошаговом прохождении - портится младшие 16 бит
Так как USB Blaster самодельный, то решил не использовать пошаговое прохождение.
Тест проходит корректно.
Для дальнейшего тестирования дописал программу еще одним циклом которая после указанного выше
тестирования еще раз считывает данные и проверяет.
Как оказалось считывает всегда с ошибкой - данные сдвинуты на 16 байт.
Изменил программу чтобы подсчитывать чило неправильных чтений
Код
memory_base = MEMORY_BASE_ADDRES;
CountAA=Count55=CountA5=Count5A=CountUnknown=0;
while (memory_base < 0x02800000)
{
Readed_32=IORD_32DIRECT(memory_base, 0);
switch(Readed_32)
{
case 0x55555555: Count55++; break;
case 0xAAAAAAAA: CountAA++; break;
case 0x5555AAAA: Count5A++; break;
case 0xAAAA5555: CountA5++; break;
default: CountUnknown++;
}
memory_base +=0x04;
}
CountAA=Count55=CountA5=Count5A=CountUnknown=0;
while (memory_base < 0x02800000)
{
Readed_32=IORD_32DIRECT(memory_base, 0);
switch(Readed_32)
{
case 0x55555555: Count55++; break;
case 0xAAAAAAAA: CountAA++; break;
case 0x5555AAAA: Count5A++; break;
case 0xAAAA5555: CountA5++; break;
default: CountUnknown++;
}
memory_base +=0x04;
}
Ровно пополам поделились ошибки между Count5A и CountA5.
Для оделения "мух от котлет" понизил частоту до 86,4МГц.
Все работает как часы. И пошаговая отладка и прогон.
По моему что-то нужно "покрутить" в модуле SDRAM SOPC Builder.
Я тайминги подкручивал на 20% и побольше - результата нет.
Пробовал в цепь тактирования SDRAM резистор от 5 до 33 ома впаивать для задержки - не помогает.
Где чего подкрутить?
Спасибо.