|
Не возможно изменить состояние регистров IO Nios II, Не проходит запись в регистр управления SGDMA |
|
|
|
Jul 25 2012, 04:33
|
Местный
  
Группа: Свой
Сообщений: 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)); }
--------------------
|
|
|
|
|
 |
Ответов
|
Jul 25 2012, 07:05
|
Местный
  
Группа: Свой
Сообщений: 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 нужно делать несколько дескрипторов.
--------------------
|
|
|
|
|
Jul 25 2012, 15:37
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(altlogic @ Jul 25 2012, 10:05)  ...Но вопрос останется открытым. Чем так может оличаться 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); Цитата(altlogic @ Jul 25 2012, 10:05)  Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов. Зато, значения дескриптора можно формировать и цифровым автоматом. То есть, дескриптор может быть и цифровым автоматом. Жаль только, что SGDMA съедает много ресурсов FPGA.
|
|
|
|
|
Jul 26 2012, 04:35
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Цитата(Konst_777 @ Jul 26 2012, 02:37)  - Проверьте по "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! Ваш код действительно работал, я увидел разницу со своим и нашел ошибку. Досадная ошибка...
--------------------
|
|
|
|
|
Jul 26 2012, 06:12
|
Местный
  
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|