altlogic 0 25 июля, 2012 Опубликовано 25 июля, 2012 · Жалоба Здравствуйте! Решил подключить к 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 0 25 июля, 2012 Опубликовано 25 июля, 2012 · Жалоба Убийственный компонет SGDMA... Подключил в свой проект обычный DMA, как рекомендовал barabek. Остается сделать интерфейс Memory Mapped к своему модулю и в принципе от SGDMA тогда можно отказаться в моем проекте. Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?... Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konst_777 0 25 июля, 2012 Опубликовано 25 июля, 2012 · Жалоба ...Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?... У меня все работает. Начните с простых вещей: Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA. Познакомтесь с файлом "altera_avalon_sgdma_regs.h". Попробуйте выполнить такой код в отладчике в пошаговом режиме: 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); Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов. Зато, значения дескриптора можно формировать и цифровым автоматом. То есть, дескриптор может быть и цифровым автоматом. Жаль только, что SGDMA съедает много ресурсов FPGA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
altlogic 0 26 июля, 2012 Опубликовано 26 июля, 2012 · Жалоба Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA. Познакомтесь с файлом "altera_avalon_sgdma_regs.h". Попробуйте выполнить такой код в отладчике в пошаговом режиме: 1. Базовый адрес в SOPC-Builder и system.h сопадают, проверял уже. 2. Знаком, пользовался дефайнами. Нашел даже, как мне показалось баг, а именно в строке #define ALTERA_AVALON_SGDMA_CONTROL_DESC_POLL_FREQ_OFST (20) должно быть определено смещение 19. 3. А вот тут то и нашел ошибку. Неправильно использоал функцию IOWR/IORD. Смещение этой функци в байтах, а не в словах. Спасибо, Konst_777! Ваш код действительно работал, я увидел разницу со своим и нашел ошибку. Досадная ошибка... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
altlogic 0 26 июля, 2012 Опубликовано 26 июля, 2012 · Жалоба А вот на чем я накололся... Карта памяти регистров SG-DMA составлена не как у всех остальных периферийных устройств SOPC Builder. Между регистрамии SGDMA в карте памяти "дырки" по три слова. Не понятно засем это сделано, и не понятно, почему на карте памяти в документации не отражены зарезервированные регистры. Но я сам виноват - в таблице четко указано - смещение в 32-х битных словах. 32-bit Word Offset | Register Name base + 0 | status base + 4 | control base + 8 | next_descriptor_pointer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться