|
SG-DMA в режиме Stream To Memoy |
|
|
|
Aug 25 2012, 07:49
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Есть необходимость перегружать кучу байт из пользовательской двухпортовой памяти в SDRAM+NIOS. Для этой цели в пользовательсой логике имеются импульсы периодом ~ 100 нс по фронтам которых предполагается организовать пересылку данных (16 бит) в SDRAM. Далее все компонуется и по Ethernet должно идти далее в комп. Для этого попытался сворганить в SOPC SG-DMA (Stream To Memory) + Avalon Straming Source. Получил непонятные ошибки. Разрядность нин в SG-DMA и Avalon Straming Source поставил 16 бит.
Подскажите пожалуйста как правильно. Пробовал по разному (менял оличество бит источника приемника и др.) Не получается. Помог бы простой пример реализации в SOPC подобной схемы. Нужен ли для этой цели еще и FIFO? Или можно будет обойтись только Avalon Straming Source+пользовательская логика полагаясь на внутреннюю FIFO SG-DMA?
|
|
|
|
|
 |
Ответов
|
Nov 20 2012, 06:09
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Т.е. последовательность такая?: 1. Создаю дескрипторы зацикленные друг на друга. 2. Выставляю бит PARK 3. вызываю alt_avalon_sgdma_do_async_transfer и забываю, что у меня есть SGDMA Поток контролируется логикой, прерывание выставляется если будут какие либо ошибки, либо переполнения. И почему один дескриптор может описать передачу максимум 0xFF00 байт? этот момент я не понял.
|
|
|
|
|
Nov 21 2012, 10:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(gosu-art @ Nov 20 2012, 10:09)  Т.е. последовательность такая?: 1. Создаю дескрипторы зацикленные друг на друга. 2. Выставляю бит PARK 3. вызываю alt_avalon_sgdma_do_async_transfer и забываю, что у меня есть SGDMA Поток контролируется логикой, прерывание выставляется если будут какие либо ошибки, либо переполнения. И почему один дескриптор может описать передачу максимум 0xFF00 байт? этот момент я не понял. Все вроде верно, не забудьте что бит OWEND_BY_HW во всех дескрипторах должен быть в 1. Повторюсь, что для индикации текущего буфера можно включить прерывания через нцать дескрипторов (видел где-то там такую возможность). Почему максимум 0xff00? Да ХЗ, не задумывался, может с большими разрядностями счетчиков (а там похоже 16) скорость просаживается, или еще какие проблемы. Вобщем, раз написано так- так и делал.
|
|
|
|
|
Nov 23 2012, 06:48
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Цитата(alexPec @ Nov 21 2012, 14:04)  Почему максимум 0xff00? Да ХЗ, не задумывался, может с большими разрядностями счетчиков (а там похоже 16) скорость просаживается, или еще какие проблемы. Вобщем, раз написано так- так и делал. Я имел в виду, что в доке такую цифру не нашел Ну вроде начинает получаться: 1. память под дескрипторы и данныеКод alt_sgdma_descriptor *desc = (alt_sgdma_descriptor *) DESCRIPTOR_MEMORY_BASE; unsigned char* pkt = MEM_RX_BASE 2. создаю дескрипторыКод alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK,sgdma_rx_dev); alt_u32 *uncached_packet_payload; uncached_packet_payload = pkt; //(void *)alt_remap_cached ((volatile void*) pkt, 4);
alt_avalon_sgdma_construct_stream_to_mem_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next" uncached_packet_payload, // starting write_address 0, // read until EOP 0); while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(S_SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ); uncached_packet_payload = pkt+(256);
alt_avalon_sgdma_construct_stream_to_mem_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // pointer to "next" (uncached_packet_payload), // starting write_address 0, // read until EOP 0); 3. Запускаю последний созданный дескрипторКод IOWR_ALTERA_AVALON_SGDMA_CONTROL(S_SGDMA_RX_BASE, ALTERA_AVALON_SGDMA_CONTROL_PARK_MSK);
desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].control=128; //выставляю OWNED_BY_HW для первого дескриптора
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(S_SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]); условие на прерываниеКод #define ALTERA_TSE_SGDMA_INTR_MASK ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_EOP_ENCOUNTERED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_ERROR_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK В прерывании проверяю ошибки, статусы. в конце делаю Код if(n_desc==0) { t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); n_desc=1; } else {
alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]); n_desc=0; } Все работает. Но мне теперь нужно убрать прерывание и что бы SGDMA молотил поток сам по себе. Убираю..., в результате выполняется один дескриптор (п.3) и все, дальше ничего Как их зациклить друг на друга в бесконечном цикле?
|
|
|
|
|
Nov 23 2012, 16:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
В коде долго разбираться, можете чего-то не заметить, вы посмотрите на результат - найдите адрес дескрипторов (dma->buffer_ptrs->buffer_ptrs[0]->desc_base, если несколько буферов, то у каждого дескрипторы посмотрите). На примере mem to stream (под рукой просто был, Ваш по аналогии) такая картинка должна быть (прил). Зеленый - источник(у вас д.б. ноль, зато получатель - не ноль), синий - след. дескриптор, размер - 0xff00, дальше desc_control, desc_status, actual bytes transferred. Нас интересует в основном desc_control (байт красным выделен) - видно, что ВЕЗДЕ owned by HW равно 1 (старший бит), там в первом дескрипторе 84 - четверка генерирует сигнал SOP, в последнем - 81, однерка генерирует EOP, пусть вас это не смущает, т.е. везде desc_control одинаковый. Отображена память под 5 дескрипторов, последний видно что закольцован на первый. Крутится постоянно, это дма на дисплей, без вмешательства и прерываний, только данные в буфере меняю, они на экране отображаются. Почему только в первом-то OWNED_BY_HW? Везде поставьте, должно работать Про 0xff00 - чет сходу тоже не могу найти, когда курил внимательно - точно помню, где-то было сказано.
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
Acvarif SG-DMA в режиме Stream To Memoy Aug 25 2012, 07:49 barabek Прошу прощенья, немного не в тему. А Вам точно нуж... Aug 26 2012, 22:48 Acvarif Цитата(barabek @ Aug 27 2012, 01:48) Прош... Aug 27 2012, 09:23  ISK Цитата(Acvarif @ Aug 27 2012, 12:23) У ме... Aug 28 2012, 06:11   Acvarif Цитата(ISK @ Aug 28 2012, 09:11) У вас зд... Aug 28 2012, 10:59    alexPec Цитата(Acvarif @ Aug 28 2012, 14:59) Сраз... Aug 28 2012, 12:09     Acvarif Цитата(alexPec @ Aug 28 2012, 15:09) Ну н... Aug 28 2012, 12:31      alexPec Цитата(Acvarif @ Aug 28 2012, 16:31) Да, ... Aug 28 2012, 19:11       Acvarif Спасибо.
Попробую разобраться. Aug 29 2012, 07:45        Acvarif Собрал систему с SGDMA, но без FIFO в надежде на в... Sep 2 2012, 15:46         alexPec В мануале же все написано. Реди - это сигнал готов... Sep 3 2012, 05:56          Acvarif Цитата(alexPec @ Sep 3 2012, 08:56) В ман... Sep 3 2012, 07:46           ISK ЦитатаПо приходу ready пользовательская логика выс... Sep 3 2012, 11:00            alexPec Если есть фифо - то 100нс конечно не проблема ( пр... Sep 3 2012, 17:12             Acvarif ЦитатаДанные должны подаваться на шину вместе с си... Sep 4 2012, 06:14              Acvarif Виноват. Ошибка вышла. Попутал sgdma и dma.
Пытаюс... Sep 5 2012, 07:39               alexPec Штатными функциями все делается. (с небольшим допи... Sep 5 2012, 08:20                Acvarif Спасибо.
У Вас в коде несколько дисрипторов, тое... Sep 5 2012, 12:09                 alexPec Цитата(Acvarif @ Sep 5 2012, 16:09) Спаси... Sep 6 2012, 05:03                  Acvarif Цитата(alexPec @ Sep 6 2012, 08:03) Буфер... Sep 7 2012, 13:21                   alexPec Код не смотрел, но первое что в голову приходит:
... Sep 7 2012, 14:15                    Acvarif Цитата(alexPec @ Sep 7 2012, 17:15) Код н... Sep 7 2012, 15:47                     alexPec ЦитатаСудя по диаграмме от SOPC в моем случае 16 б... Sep 7 2012, 19:46                      Acvarif Спасибо за клок.
Сделал все по правилам. Поставил... Sep 11 2012, 07:26                       alexPec ЦитатаНо всеравно есть непонятности. Не пойму как ... Sep 11 2012, 20:49                        Acvarif Цитата(alexPec @ Sep 11 2012, 23:49) Возм... Sep 12 2012, 05:53                         alexPec Цитата(Acvarif @ Sep 12 2012, 09:53) Спас... Sep 12 2012, 06:16                          Acvarif Цитата(alexPec @ Sep 12 2012, 09:16) Став... Sep 12 2012, 11:25                           Acvarif Большое Спасибо alexPec за поддержку.
Заработало ... Sep 12 2012, 17:20                           alexPec Цитата(Acvarif @ Sep 12 2012, 15:25) В об... Sep 12 2012, 19:29                            Acvarif Выкладываю то, что получилось и вроде работает. Мо... Sep 18 2012, 19:57                             alexPec Цитата1. Не всегда последовательно сменяются буфер... Sep 19 2012, 16:15                              Acvarif Цитата(alexPec @ Sep 19 2012, 19:15) А у ... Sep 19 2012, 17:29                               alexPec Цитата(Acvarif @ Sep 19 2012, 21:29) Но E... Sep 19 2012, 19:27                                Acvarif Цитата(alexPec @ Sep 19 2012, 22:27) Ну т... Sep 20 2012, 06:40                                 alexPec Цитата(Acvarif @ Sep 20 2012, 10:40) Тепе... Sep 21 2012, 11:39                                  Acvarif Цитата(alexPec @ Sep 21 2012, 14:39) Я бы... Sep 21 2012, 13:48                                   alexPec Цитата(Acvarif @ Sep 21 2012, 17:48) Да, ... Sep 21 2012, 14:24                                    Acvarif При наращивании количества данных поступающих на s... Sep 28 2012, 07:44                                     alexPec Регистр статуса и контрола в каком состоянии после... Sep 28 2012, 09:37                                      Acvarif Цитата(alexPec @ Sep 28 2012, 12:37) Реги... Sep 28 2012, 10:33                                       alexPec А покажите дамп сформированных дескрипторов Sep 28 2012, 12:43                                        Acvarif Цитата(alexPec @ Sep 28 2012, 15:43) А по... Sep 28 2012, 13:17                                         Acvarif С дампом (как вывести на консоль) так и не разобра... Sep 28 2012, 19:42                                          alexPec Цитата(Acvarif @ Sep 28 2012, 23:42) С да... Sep 29 2012, 09:23                                           Acvarif Цитата(alexPec @ Sep 29 2012, 12:23) Дамп... Oct 1 2012, 18:50                                            alexPec Написано же :
slide the pointer until 32 byte bo... Oct 1 2012, 20:09                                             Acvarif ЦитатаТут выравнивается начало дескриптора по 32-Б... Oct 2 2012, 07:17                                              Acvarif Все работает. С одним буфером.
С двумя буферами н... Oct 3 2012, 14:06                                               alexPec Честно говоря, не помню из-за чего, 2 года назад б... Oct 3 2012, 17:14                                                Acvarif Спасибо. Примерно так и сделал. Вроде работает. Но... Oct 4 2012, 17:11                                                 alexPec Max_desc_proccessed - это если вам надо прерывание... Oct 4 2012, 20:15                                                  Acvarif Цитата(alexPec @ Oct 4 2012, 23:15) Max_d... Oct 5 2012, 06:47                                                   alexPec Цитата(Acvarif @ Oct 5 2012, 10:47) Спаси... Oct 5 2012, 07:57                                                    Acvarif Цитата(alexPec @ Oct 5 2012, 10:57) Похож... Oct 9 2012, 16:00                                                     alexPec ЦитатаС дескрипторами так толком и не понял почему... Oct 9 2012, 18:30 gosu-art У меня тоже есть вопросики
Имею 2 буфера по 8к.... Nov 19 2012, 09:32 alexPec Цитата(gosu-art @ Nov 19 2012, 13:32... Nov 20 2012, 05:29    gosu-art Цитата(alexPec @ Nov 23 2012, 19:25) Поче... Nov 26 2012, 08:25     alexPec Чего-то не совсем все ясно, вы, когда дескрипторы ... Nov 26 2012, 10:10 gosu-art Вот созданные дескрипторы до вызова alt_avalon_sgd... Nov 26 2012, 12:37 alexPec Первое что в голову приходит - а почему размер-то ... Nov 26 2012, 14:45  gosu-art Цитата(alexPec @ Nov 26 2012, 17:45) Перв... Nov 27 2012, 04:06   alexPec И все же, почему количество передаваемых байт в де... Nov 27 2012, 16:00 gosu-art В общем я тут поковырял alt_avalon_sgdma_construct... Nov 28 2012, 06:50 alexPec Цитата(gosu-art @ Nov 28 2012, 10:50... Nov 28 2012, 09:39 gosu-art Теперь работает прием и передача (256 байт) без уч... Nov 29 2012, 10:42 Копейкин Прошу подсказать, где ошибся...
Использую аналогич... Jan 30 2013, 10:22 alexPec Цитата(Копейкин @ Jan 30 2013, 14:22) Где... Jan 30 2013, 14:17 Acvarif Цитата(Копейкин @ Jan 30 2013, 14:22) Дес... Jan 30 2013, 15:05 Копейкин Acvarif, там всё сложнее.
DMA заполняет только час... Jan 30 2013, 15:16 alexPec Цитата(Копейкин @ Jan 30 2013, 19:16) Пре... Jan 30 2013, 18:30 Копейкин Мне хотелось по минимуму задействовать процессор, ... Jan 31 2013, 07:43 Копейкин Посмотрел внимательно на Альтере:
ссылка
там анг... Jan 31 2013, 12:51 alexPec Цитата(Копейкин @ Jan 31 2013, 16:51) Пол... Jan 31 2013, 16:30 Копейкин Я сейчас, как и описывал, сделал бесконечный цикл ... Jan 31 2013, 16:45 prussta Добрый день! Хочу запустить SGDMA в режиме mem... Feb 1 2014, 17:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|