Jump to content
    

Можете посоветовать литературу по DMA, где толково расписано.

Описание на IP-ядра смотрите ну и пример можете какой качнуть.

 

Share this post


Link to post
Share on other sites

О каких 60 МГц говорили Вы - Вам виднее.

О сферических в вакууме, естественно ;)

 

 

но лучше разобраться с DMA (SgDMA/mSgDMA).

ДМА имеет смысл если ядро чем то еще полезным нагружено, в данном же случае, я так понимаю вся нагрузка на ядро проца - это тосовка данных. Более того подозреваю что ядро проца появилось как раз из-за необходимости доступа к ДДР, через имеющийся в ядре интерфейс. В таком раскладе ДМА - лишнее усложнение и нестабильность

 

 

В атаче если будет интересно программное фифо, вам надо создать 2 буфера длинной в 1.2 мегобайта, и набивать один из входящего потока, как получите сигнал выдать данные, переходите на другой буффер, а первый отдаете пользователю.

 

какой смысл хранить данных больше чем у вас могут попросить?

 

 

использовать буферы так

 

uint8_t DataBuf1[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
uint8_t DataBuf2[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
FIFOStr   Buffer1;
FIFOStr   Buffer2;

InitFIFOStr(Buffer1,DataBuf1, sizeof(DataBuf1));
InitFIFOStr(Buffer2,DataBuf2, sizeof(DataBuf2));

 

 

дальше пихаете туда данные через AddFIFOData

и забираете через GetFIFOData, буфер чиститься сам при забирании данных, но можно и вызвать функцию очистки

 

вам надо только поправить функцию добавления данных, потому что она не дает перезаписывать буфер, возвращая код ошибки при переполнении. А также надо понять что делать если данные запросили, но их в буфере меньше 1.2 МБ, может вам вообще надо сделать 1 буфер, и выдавать всегда его целиком, а писать его по кругу...

Code.zip

Share this post


Link to post
Share on other sites

В атаче если будет интересно программное фифо, вам надо создать 2 буфера длинной в 1.2 мегобайта, и набивать один из входящего потока, как получите сигнал выдать данные, переходите на другой буффер, а первый отдаете пользователю.

 

какой смысл хранить данных больше чем у вас могут попросить?

 

 

использовать буферы так

 

uint8_t DataBuf1[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
uint8_t DataBuf2[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
FIFOStr   Buffer1;
FIFOStr   Buffer2;

InitFIFOStr(Buffer1,DataBuf1, sizeof(DataBuf1));
InitFIFOStr(Buffer2,DataBuf2, sizeof(DataBuf2));

 

Не совсем понял кое что: буффер создается в DDR2 или где? Если в самой плиске, то не совсем понятно, как такого объема создать.

Share this post


Link to post
Share on other sites

О сферических в вакууме, естественно ;)

 

Ну пипец эта ваша альтера - это так чтобы doom13'а позлить:)..

то хоть убейтесь ничего не выйдет, даже на ксалинксе, не то что на альтере - ну это тоже чтобы дума позлить:)

 

В целом конечно я не прав. Все же вопрос частоты. Я как то не подумал что люди могут ставить DDR3 и работать с ним на 60 МГц... (условно все конечно)

 

смело...

 

Чего то мне говорит что начиная с ддр2, уже не может, но могу и ошибаться...

 

ну пипец ваша альтера:)....

этож надо было придумать отдельные инструкции записи мимо кеша. Так за этим еще следить надо чтобы кеш был всегда синхронен с памятью под ним...

а вот явно указано

что срали они на понятие изменяемый%) и просто оптимизацию отключают и рады)

 

Думаю, скоро можно будет менять Ваш статус на "БОЛТУН" :biggrin:

 

Share this post


Link to post
Share on other sites

В атаче если будет интересно программное фифо, вам надо создать 2 буфера длинной в 1.2 мегобайта, и набивать один из входящего потока, как получите сигнал выдать данные, переходите на другой буффер, а первый отдаете пользователю.

 

какой смысл хранить данных больше чем у вас могут попросить?

Осталось только разобраться, как бы ухитриться набивать из входящего потока 60М при частоте процессора 100М и ничего не потерять:). Хотя, если со стороны АЦП поставить упаковщик и аппаратное ФИФО, то, наверное, успеет.

А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

 

Данные могут попросить не самые последние, а какие-нибудь старые, например, такая возможность есть в правильных цифровых осциллографах.

 

Share this post


Link to post
Share on other sites

Осталось только разобраться, как бы ухитриться набивать из входящего потока 60М при частоте процессора 100М и ничего не потерять:). Хотя, если со стороны АЦП поставить упаковщик и аппаратное ФИФО, то, наверное, успеет.

А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

 

Данные могут попросить не самые последние, а какие-нибудь старые, например, такая возможность есть в правильных цифровых осциллографах.

Там - 8bit*60M, а шина проца - 32bit*100M, получим - 32bit*15M.

 

А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

Лучше тогда mSgDMA, оно новее будет, а в управлении им всё просто.

 

Не совсем понял кое что: буффер создается в DDR2 или где? Если в самой плиске, то не совсем понятно, как такого объема создать.

В DDR2, а она - память Ниоса (Qsys-системы).

Share this post


Link to post
Share on other sites

Кстати а какая частота DDR2?

Это видно из рисунка приведённого выше.

Share this post


Link to post
Share on other sites

Это видно из рисунка приведённого выше.

 

Проект делается на основе отладочной платы DB4CGX15 Cyclone IV PCIexpress Development Board. Такие параметры взяты из примера для этой платы

Share this post


Link to post
Share on other sites

200 МГц

Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?

Share this post


Link to post
Share on other sites

200 МГц

Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?

 

Как вы получили это значение? Не 3200 МБ/с?

Edited by x66

Share this post


Link to post
Share on other sites

200 МГц

Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?

Как вы получили это значение? Не 3200 МБ/с?

Вот и я думаю, что товарищ ткнул пальцем в небо.

Для Вашего случая максимальная скорость записи/чтения данных будет:

8 (ширина шины) * 200 MHz(частота тактирования памяти) * 2 (память DDR2 - работает по двум фронтам) = 3200 Mbit/s = 400 MB/s

Share this post


Link to post
Share on other sites

а... 3.2 Гигабита...

А с учетом необходимой задержки между выставлением адреса колонки и столбца при выборе адреса?

А когда ДМА и ниос будут по разным адресам щемится?

Share this post


Link to post
Share on other sites

В DDR2, а она - память Ниоса (Qsys-системы).

 

Не совсем понятно как делается

Edited by x66

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...