Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не возможно изменить состояние регистров IO Nios II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
altlogic
Здравствуйте!

Решил подключить к Nios II IP-core Altera SG-DMA для переноса данных из устройства в память. Проблема заключается в том, чтот процессор не может изменить состояние регистров SGDMA. В регистре управления всегда одно и то же значение - 0x01. При этом состояние регистров PIO-Core процессор изменить может (зажигаю светодиоды). Проект выполняю в режимие дебага, Nios II SBT.
Есть идеи?

Код
      
unsigned char rw[3];
int  base, offset, data;
printf("\nEnter command (Example: w 1)\n");
scanf("%1s %x", rw, &offset);
base = SGDMA_0_BASE;
if (rw[0] == 'w')
{
   printf("Enter write data: ");
   scanf ("%x",&data);
   printf("\n");
   printf("Generated IOWR(0x%x, 0x%x, 0x%x)...\n", base, offset, data);
   IOWR(base, offset, data );
   printf ("Read at base 0x%x with offset 0x%x data 0x%x\n",base,offset, IORD(base, offset));
}
altlogic
Убийственный компонет SGDMA... Подключил в свой проект обычный DMA, как рекомендовал barabek. Остается сделать интерфейс Memory Mapped к своему модулю и в принципе от SGDMA тогда можно отказаться в моем проекте. Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?...

Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов.
Konst_777
Цитата(altlogic @ Jul 25 2012, 10:05) *
...Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?...

У меня все работает.
Начните с простых вещей:
  1. Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA.
  2. Познакомтесь с файлом "altera_avalon_sgdma_regs.h".
  3. Попробуйте выполнить такой код в отладчике в пошаговом режиме:
Код
       alt_u32 wrData, rdData;
      
           IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_0_BASE, 0x00);
           // Проверьте, что считывается 0x0
           rdData = IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_0_BASE);
      
           wrData = 0x00100000;
           IOWR_ALTERA_AVALON_SGDMA_NEXT_DESC_POINTER(SGDMA_0_BASE, wrData );
           // Проверьте, что rdData == wrData
           rdData = IORD_ALTERA_AVALON_SGDMA_NEXT_DESC_POINTER(SGDMA_0_BASE);


Цитата(altlogic @ Jul 25 2012, 10:05) *
Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов.

Зато, значения дескриптора можно формировать и цифровым автоматом. То есть, дескриптор может быть и цифровым автоматом. Жаль только, что SGDMA съедает много ресурсов FPGA.
altlogic
Цитата(Konst_777 @ Jul 26 2012, 02:37) *
  1. Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA.
  2. Познакомтесь с файлом "altera_avalon_sgdma_regs.h".
  3. Попробуйте выполнить такой код в отладчике в пошаговом режиме:

1. Базовый адрес в SOPC-Builder и system.h сопадают, проверял уже.
2. Знаком, пользовался дефайнами. Нашел даже, как мне показалось баг, а именно в строке
Код
#define ALTERA_AVALON_SGDMA_CONTROL_DESC_POLL_FREQ_OFST              (20)

должно быть определено смещение 19.

3. А вот тут то и нашел ошибку. Неправильно использоал функцию IOWR/IORD. Смещение этой функци в байтах, а не в словах. Спасибо, Konst_777! Ваш код действительно работал, я увидел разницу со своим и нашел ошибку. Досадная ошибка...

altlogic
А вот на чем я накололся...

Карта памяти регистров SG-DMA составлена не как у всех остальных периферийных устройств SOPC Builder. Между регистрамии SGDMA в карте памяти "дырки" по три слова. Не понятно засем это сделано, и не понятно, почему на карте памяти в документации не отражены зарезервированные регистры. Но я сам виноват - в таблице четко указано - смещение в 32-х битных словах.
Цитата
32-bit Word Offset | Register Name
base + 0 | status
base + 4 | control
base + 8 | next_descriptor_pointer
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.