|
SGDMA почему-то байты пропускает, Что делаю не так? |
|
|
|
Jan 10 2011, 09:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Добрый день Всем.Думал, что разобрался с SGDMA, ан нет! Непонятные для меня вещи с этой штукой происходят, помогите прояснить, в чем дело. На рисунке диаграммы сигнал-тапа, фрагмент сопца (что касается этого ДМА) и дамп памяти в которую этот дма пишет данные. Суть такая. Внешнее к сопцу устройство выдает отсчеты сигнала (четвертая строка сверху в сигнал-тапе) и сигнал Valid (пятая строка сверху), заведенный на одноименный сигнал стриминг-дма. Данные проходят через фифо на 1024 байта и попадают на вход SGDMA stream to memory (третья строка сверху).Зелеными линиями показано соответствие потока данных. До этого места как видно все ок, какие данные пришли, такие и попали на вход ДМА. Еще показаны адрес m_write_address (первая строка) и данные m_write_data (вторая строка). Если я правильно понял, это как раз адрес памяти куда дма пишет и данные, которые он пишет.Еще выведен строб записи m_write_write. Так вот по графику видно, что данные на выходе ДМА появляются все, но не все почему-то записываются в память. Синим выделено слово, которое например не записалось в память (на дампе это тоже видно, серым выделена клетка, где идет FD9A и сразу 008F, а должно быть FD9A,0000,008F). Опытным путем замечено, что такие пропуски появляются когда сигнал m_write_write затягивается, т.е. похоже когда шина загружается. Но при этом фифо для дма не переполняется (сигнал wrful_from_the_fifo_1, последняя строчка). Я то думал фифо для того и нужно, чтоб если шина загружена - буферизировать данные, разгрузится - заталкивать в память. А получается шина загрузилась - пропустили байты и дальше. Ну и детали. Клок для процессора, дма и сигнал-тапа - 80 МГц (pll0_c1 в сопце), клок для входных данных - 20 МГц (clk1 в сопце). Данные валятся пачками (пачка выделяется сигналом valid) по 2048 16 битных слов с периодичностью примерно раз в 1,5 мс. Мастеров на шине 3 - собственно процессор, дма дисплея (вытаскивает из памяти 16-разрядные слова с частотой 5 МГц) и упомянутый выше дма. Память у проца внешняя, асинхронная, программа, буфер видео, буфер для дма описанного и все остальное в ней лежит. Настройки компонентов дма в рисунках приложены. компонент ADC - просто сигналы avalon-st выведенные наружу. Поделитесь пожалуйста идеями как победить, свои кончились.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Jan 10 2011, 14:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(vadimuzzz @ Jan 10 2011, 17:37)  у фифы не стоит галочка "Allow backpressure", да и у Timing Adapters тоже не везде. еще на диаграмме не выведен waitdatarequest или как его там - через который SGDMA показывает, что он не готов, он же должен использоваться для backpressure. Спасибо VADIMUZZZ! Вроде помогли галки backpreassure, вроде не пропускает, но проверить точно не могу, поскольку появилась другая проблема: адрес начала записи стоит в дескрипторе 0x133128 (на рисунке область памяти с дескриптором ДМА), а писать начинает с 0х13392С (в рисунке с сигналтапом). По скриншоту дескриптора видно, что записал столько, сколько его просили, но КУДА? Проверил что действительно в памяти лежит (третий рисунок) - все тоже что и сигналтап говорит, писать начинает с 0x13392C. Понять не могу откуда этот адрес берется? Нигде его нет. При этом если предположить, что дма записал 0х1440 байт с 0х13392С, то получается, что конец записи - 0х134D6C. Но туда он не попадает, т.к. дескриптор находится по адресу 0х134580 и после трансфера он не портится. Зато данные, которые где-то в середине пакета попадают в начальный адрес 0х133128. Т.е. пишет он в отведенную область, но начало смещено. Причем при перезапуске ДМА адрес начала записи точно такой же. Из-за чего такое может быть? В софте абсолютно по сравнению со старым вариантом ничего не менял, просто поставил галки, скомпилировал, и залил тот же софт (только bsp перестроил, ато ругается на sysid). Как быть? Что делать? UPD:Сделал размер фифо вместо 1024 байта 512 байт - дма начал писать с адреса 0х13352С (вместо 0х13392С), т.е. ровно на 1024 байта меньше, чем с фифо на 1024 байта. Чума! Дескрипторы один в один. А как его заставить писать с начала?
Сообщение отредактировал alexPec - Jan 10 2011, 19:19
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
alexPec SGDMA почему-то байты пропускает Jan 10 2011, 09:04 vadimuzzz а как вы определяете момент начала DMA-транзакции ... Jan 10 2011, 23:57 alexPec Цитата(vadimuzzz @ Jan 11 2011, 05:57) а ... Jan 11 2011, 03:36  vadimuzzz Цитата(alexPec @ Jan 11 2011, 12:36) В до... Jan 11 2011, 05:20   alexPec Цитата(vadimuzzz @ Jan 11 2011, 11:20) та... Jan 11 2011, 06:13    vadimuzzz Цитата(alexPec @ Jan 11 2011, 15:13) Напи... Jan 11 2011, 06:22     alexPec Цитата(vadimuzzz @ Jan 11 2011, 12:22) хм... Jan 11 2011, 08:27      vadimuzzz Цитата(alexPec @ Jan 11 2011, 17:27) А та... Jan 11 2011, 10:06       alexPec Цитата(vadimuzzz @ Jan 11 2011, 16:06) да... Jan 11 2011, 13:30        vadimuzzz Цитата(alexPec @ Jan 11 2011, 22:30) Надо... Jan 11 2011, 14:29         alexPec Цитата(vadimuzzz @ Jan 11 2011, 20:29) вы... Jan 11 2011, 16:52 vadimuzzz пока инфы маловато..
вытащите сигналы модуля fifo_... Jan 11 2011, 20:49 alexPec Цитата(vadimuzzz @ Jan 12 2011, 02:49) по... Jan 12 2011, 04:24 vadimuzzz 1. нетлист называется "SignalTap Pre-Synthesi... Jan 12 2011, 05:08 alexPec Цитата(vadimuzzz @ Jan 12 2011, 11:08) 2.... Jan 12 2011, 07:36  alexPec Все, победил! Уважаемый Vadimuzzz! У Вас... Jan 12 2011, 16:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|