реклама на сайте
подробности

 
 
> Не возможно изменить состояние регистров IO Nios II, Не проходит запись в регистр управления SGDMA
altlogic
сообщение Jul 25 2012, 04:33
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Решил подключить к 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));
}


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
altlogic
сообщение Jul 25 2012, 07:05
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Убийственный компонет SGDMA... Подключил в свой проект обычный DMA, как рекомендовал barabek. Остается сделать интерфейс Memory Mapped к своему модулю и в принципе от SGDMA тогда можно отказаться в моем проекте. Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?...

Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Jul 25 2012, 15:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(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.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 26 2012, 04:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Цитата(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! Ваш код действительно работал, я увидел разницу со своим и нашел ошибку. Досадная ошибка...



--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 26 2012, 06:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



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

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


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 10:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016