Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись в DDR2
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
x66
Написал простенькую прогу по записи данных в ОЗУ.
int main()
{
unsigned long *data_inp;
unsigned long *ddr_addr;
data_inp=(unsigned long*)0x4030000;
ddr_addr=(unsigned long*)0x2000003;
while (1)
{
*ddr_addr=*data_inp;
iprintf("input %08x %03i\n", data_inp, *data_inp);
iprintf("ddr %08x %04i\n", ddr_addr, *ddr_addr );
ddr_addr++;
}
}

Результаты в консоли
input 04030000 255
ddr 02000003 0255
input 04030000 255
ddr 02000007 0255
...
input 04030000 255
ddr 02000203 0255
input 04030000 255
ddr 02000207 281018391
input 04030000 255
ddr 0200020b -524288489
...

в начале пишет нормально в ОЗУ, а потом после адреса 02000203 начинает писать всякую ерунду. Что надо прописать в проге, чтобы нормально происходила дальше запись?
doom13
Цитата(x66 @ Mar 3 2015, 12:17) *

Что-то результат работы вообще не соответствует приведённому коду, где у Вас там инкремент указателя? Как оно работает если указатель не изменяется? Должно писать одни и те же данные по одному адресу.
x66
Цитата(doom13 @ Mar 3 2015, 13:22) *
Что-то результат работы вообще не соответствует приведённому коду, где у Вас там инкремент указателя? Как оно работает если указатель не изменяется? Должно писать одни и те же данные по одному адресу.


При инкременте адреса увеличиваются не на 1, а на 4 (может и на другое число увеличиваться в зависимости от типа данных). Вот в консоли ddr 02000003 0255; ddr 02000007 0255 ..., первое число это адрес, а второе это содержимое по адресу.
doom13
Цитата(x66 @ Mar 3 2015, 13:30) *
При инкременте адреса увеличиваются не на 1, а на 4 (может и на другое число увеличиваться в зависимости от типа данных). Вот в консоли ddr 02000003 0255; ddr 02000007 0255 ..., первое число это адрес, а второе это содержимое по адресу.

А где инкремент адреса в коде:
Цитата
Код
int main()
{
      unsigned long *data_inp;
      unsigned long *ddr_addr;

      data_inp=(unsigned long*)0x4030000;
      ddr_addr=(unsigned long*)0x2000003;

      while (1)
      {
             *ddr_addr=*data_inp;
             iprintf("input %08x %03i\n", data_inp, *data_inp);
             printf("ddr %08x %04i\n", ddr_addr, *ddr_addr );
      }
}

???
x66
Цитата(doom13 @ Mar 3 2015, 13:34) *
А где инкремент адреса в коде:

???


Извиняюсь, подчищал код от других записей случайно удалил, подправил код в 1 сообщени. Инкремент делаю ddr_addr++;
Golikov A.
ну остается узнать, вы точно по DDR идете а не по внутреннему раму с зациклом адресов?
x66
Цитата(Golikov A. @ Mar 3 2015, 13:50) *
ну остается узнать, вы точно по DDR идете а не по внутреннему раму с зациклом адресов?


в QSYS адреса DDR выставлены от 0x2000000 до 0x3ffffff.

#define ALTMEMDDR_0_BASE 0x2000000
#define ALTMEMDDR_0_SPAN 33554432
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.