Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор размера FIFO, оценка загрузки
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
alexPec
Добрый день. Видел где-то в топиках, что люди загрузку FIFO определяли. А как это сделать? Суть такая: есть система на NIOS, АЦП, 5 МГц, 16 бит. Надо заполнить память (память внешняя) выборками АЦП, порядка 100-200 кБ. Думаю должен быть SGDMA, FIFO. А вот какого размера ставить его? И как потом определить загрузку FIFO? На шине стоит, кроме SGDMA АЦП, еще SGDMA для LCD и собственно сам проц ниос. Проц (и память) работает на 80 МГц, SGDMA для LCD - 5 МГц (16 бит), память 16-ти разрядная.

Если кто примерчик кода скинет stream->SGDMA->память будет здорово. Ну или тонкости какие может есть в отличие от память->SGDMA->stream, он работает на дисплей, пример взял с кита.
alexPec
PS. Как то я поднимал вопрос о 8/16 бит SGDMA для LCD (Вот тут). Так вот тогда выход на LCD все-таки пришлось в сопце делать 8 разрядный, 2 beat per symbol, т.е. он как бы 16 разрядный, но выходит только по 8 разрядов за 2 такта, распаралелил я его на 16 разрядов снаружи сопца. Синхронизировался SGDMA с video sync generator через SOP/EOP.
А здесь с АЦП как сделать? Ну допустим 16 рарядов я разложу в 2х8, удвою тактовую. А как сделать чтоб старший байт на месте младшего не оказался? Как - то тоже с этими пакетами подозреваю надо.
И еще вопрос: почему в сопцбилдере добавляю внешний клок 4,354 МГЦ, а он после ентера ставит 4,0 МГц?
vadimuzzz
а интерфейс у АЦП какой? не SPI часом? если SPI, то в билдере есть компонент SPI с Avalon-ST интерфейсом. к нему еще Avalon-ST клок-адаптер добавить (как раз FIFO), он автоматически из соотношений клоков определит, достаточен ли размер. если маловат - кинет warning. по поводу округления клоков - это нормально, он все равно не в наносекундах или мегагерцах меряет, а в тактах. и округляет с запасом.
alexPec
Цитата(vadimuzzz @ Nov 6 2010, 04:23) *
а интерфейс у АЦП какой? не SPI часом? если SPI, то в билдере есть компонент SPI с Avalon-ST интерфейсом. к нему еще Avalon-ST клок-адаптер добавить (как раз FIFO), он автоматически из соотношений клоков определит, достаточен ли размер. если маловат - кинет warning. по поводу округления клоков - это нормально, он все равно не в наносекундах или мегагерцах меряет, а в тактах. и округляет с запасом.

Не, там LVDS сигналы, по времени жуть нормированные. Я их в паралельный переделал уже. Щас есть данные и клок когда эти данные готовы.

Eще вопрос появился: куда SOP/EOP, empty цеплять? У меня ведь АЦП. Каждый такт данные появляются. С какого отсчета начинать - без разницы. Их что жестко посадить на vcc/gnd? У SGDMA не нашел отключение packet support.
vadimuzzz
Цитата(alexPec @ Nov 6 2010, 14:35) *
Не, там LVDS сигналы, по времени жуть нормированные. Я их в паралельный переделал уже. Щас есть данные и клок когда эти данные готовы.

не-не-не, погодите. причем тут I/O Standard? AD7625 (http://electronix.ru/forum/index.php?showtopic=82351)?
зачем его руками в параллельный переделывать, если 1 сигнал (строб) добавить и будет вполне себе SPI. который к готовому компоненту и цепляете. а LVDS там или что другое совершенно не важно
alexPec
Цитата(vadimuzzz @ Nov 6 2010, 14:31) *
не-не-не, погодите. причем тут I/O Standard? AD7625 (http://electronix.ru/forum/index.php?showtopic=82351)?
зачем его руками в параллельный переделывать, если 1 сигнал (строб) добавить и будет вполне себе SPI. который к готовому компоненту и цепляете. а LVDS там или что другое совершенно не важно


Ключевое слово было "по времени нормированные" smile.gif По таймингам там жестко как-то. После строба CNV надо подождать 145 ns, потом burst на чтение 16 бит, причем закончиться он должен уже после того как новый строб придет, на след. отсчет, но не позднее 110 нс после строба. А время между стробами CNV тоже нормировано. Вобщем чем с SPI увязывать - подумал проще в паралель и в дма 16 разрядный, благо память тоже 16 разрядов.

А все-таки, SOP/eop, empty - куда цеплять? Или для stream->memory нафиг не нужны? В memory->stream понятно, там в дескрипторе бит выставляется, если при чтении видит бит - формирует sop/eop, для синхронизации удобно. Не сталкивались с этим? Может убрать их в sgdma можно как, я не нашел? Пока вроде только эта загвоздка осталась...
vadimuzzz
Цитата(alexPec @ Nov 6 2010, 18:44) *
Ключевое слово было "по времени нормированные" smile.gif По таймингам там жестко как-то.

и что? nios тут как slave, тайминги извне задаются, все как у вас сейчас. ну, вам видней.
Цитата
А все-таки, SOP/eop, empty - куда цеплять? Или для stream->memory нафиг не нужны? В memory->stream понятно, там в дескрипторе бит выставляется, если при чтении видит бит - формирует sop/eop, для синхронизации удобно. Не сталкивались с этим? Может убрать их в sgdma можно как, я не нашел? Пока вроде только эта загвоздка осталась...

посмотрите в адаптерах www.altera.com/literature/hb/qts/qts_qii54021.pdf, там есть разные приблуды, чтобы эти сигналы вставлять/выбрасывать. сами эти сигналы нужны (теоретически), именно на их основе и генерируются прерывания и т.п. ну и длина выборки, иначе (без eop) он быстро память переполнит
alexPec
Цитата(vadimuzzz @ Nov 6 2010, 17:45) *
и что? nios тут как slave, тайминги извне задаются, все как у вас сейчас. ну, вам видней.

посмотрите в адаптерах www.altera.com/literature/hb/qts/qts_qii54021.pdf, там есть разные приблуды, чтобы эти сигналы вставлять/выбрасывать. сами эти сигналы нужны (теоретически), именно на их основе и генерируются прерывания и т.п. ну и длина выборки, иначе (без eop) он быстро память переполнит

В смысле переполнит? Не должен. Клок с ацп 4 МГц, клок DMA 80 МГц, фифо на 128 отсчетов, неужто с шиной так все плохо?
vadimuzzz
Цитата(alexPec @ Nov 6 2010, 20:55) *
В смысле переполнит? Не должен. Клок с ацп 4 МГц, клок DMA 80 МГц, фифо на 128 отсчетов, неужто с шиной так все плохо?

а причем здесь FIFO? ее размер может быть и меньше размера выборки(пакета). как в том же TSE (я не к тому, что так обязательно делать - просто если ресурс жмет, размер буфера можно у уменьшить). переполниться может память, в которую sgdma пишет. если eop не придет, sgdma будет писать до посинения
alexPec
Цитата(vadimuzzz @ Nov 6 2010, 18:25) *
переполниться может память, в которую sgdma пишет. если eop не придет, sgdma будет писать до посинения

ВООООТ! А я как раз дошел до программирования дескрипторов. biggrin.gif Мне надо записать-то фиксированное количество байт, EOP,как я говорил у меня нет. Я просто в construct_stream_to_mem_desc указываю конкретное количество

Цитата
length_or_eop—the number of bytes for the transfer. If set to zero (0x0), the transfer continues
until an EOP signal is received from the Avalon-ST interface.


Вопрос остался такой: как сделать такой дескриптор (последний), чтоб дма после него остановился?

До этого делал дескрипторы для LCD - там-то такого вопроса не возникало, там останавливать дма не надо.

UPD: Вопрос по дескрипторам снимается, оказывается процедуры dma сами ставят бит OWNED_BY_HW (что-то такое) в первых дескрипторах - 1, в последнем -0, что означает, что descriptor chain закончился.

Запустил дма для АЦП! На первый взгляд работает!!! biggrin.gif

Прокоментируйте если не сложно рисунок сигнал тапа - работа dma. первая строчка - адрес записи слова из дма, вторая - данные записи, третья - входные данные дма, четвертая - строб записи дма(если я правильно понял - это сигнал m_write_write). Клок тапа - 80 МГц, клок АЦП - 4 МГц.
Вопросы такие:

1. Похоже что фифо для дма отдельно не нужен? Там свой фифо в компоненте дма на 128 байт.
2. Правильно я понял, слово как только приходит с АЦП почти сразу уходит в память?
3. Что за затягивание сигнала записи (обозначено квадратиком)? Связано с тем что шина занята?

Спасибо за ответы!



vadimuzzz
Цитата(alexPec @ Nov 6 2010, 23:54) *
1. Похоже что фифо для дма отдельно не нужен? Там свой фифо в компоненте дма на 128 байт.
2. Правильно я понял, слово как только приходит с АЦП почти сразу уходит в память?
3. Что за затягивание сигнала записи (обозначено квадратиком)? Связано с тем что шина занята?

1. может понадобиться, но если как в вашем случае f_вх << f_sopc, то не критично, шина успевает
2. да
3. скорее всего, да. можно добавить управляющие сигналы от др. компонентов (типа cs, valid и т.п.), тогда будет видно кто конкретно занял шину.
alexPec
Спасибо Vadimuzzz! С твоей помощью, как обычно, все заработало!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.