реклама на сайте
подробности

 
 
> АЦП+FPGA+NIOS
Dootch
сообщение Oct 17 2013, 06:36
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 12-02-10
Из: Хабаровск
Пользователь №: 55 441



Доброго времени суток. Прошу посоветовать оптимальный вариант для решения моей задачи.
Имеется 14-битный АЦП ad9649. Данные с АЦП оцифровываются с частотой 5 МГц и поступают на вход ПЛИС. В работе используется отладочная плата altera de0 с Cyclone III на борту. Для выделения полезного сигнала на фоне шума необходимо использовать метод усреднения периодического сигнала (в английской википедии Signal averaging). Период сигнала составляет 100 мс, что требует 500 000 14 битных слов в памяти для записи одной реализации. Усреднение проводится по методу экспоненциального скользящего среднего. Для работы требуется за период 200 нс извлечь из памяти 14-битное слово, сдвинуть его и сложив со вновь поступившими данными записать обратно. Сначала была мысль использовать софт-процессор, который по прерыванию от АЦП будет проводить усреднение и записывать данные в SDRAM память, которая есть на плате. Но оказалось, что на переход к обработке прерывания уходит слишком много времени.
Теперь вот не знаю как подступиться к решению задачи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andrey S
сообщение Oct 20 2013, 09:52
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 20-10-13
Пользователь №: 78 808



Если я правильно понял задачу, то исходные данные выглядят так - из сигнала последовательно берутся выборки по 500 000 слов между которыми происходит усреднение.

X - вход 500 000 слов
Y - выход 500 000 слов

Y(n) = А*X + (1 - А)*Y(n - 1)

Понятно, что у Cyclone III не хватит внутренней памяти и надо использовать внешнюю.

Почти со 100% уверенностью заявляю, что NIOS не справится с обработкой сигнала с дискретизацией 5МГц. Надо делать хардовую обработку.
В приложении мои мысли на этот счет.

На словах: нужны два компонента (чтения/записи) для доступа к SDRAM через Avalon MM (доступ следует делать с brust), работающих на частоте шины (зеленая рамка),
две FIFO которые развяжут clock АЦП и clock шины, и будут служить буфером для доступа к SDRAM, ну и собственно усредняющий блок, который берет значение с АЦП с
FIFO умножает/складыет и кладет в другое FIFO. Все пишется ручками и вставляется в SoPC, для FIFO берется MegaFunction.

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Dootch
сообщение Oct 22 2013, 12:07
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 12-02-10
Из: Хабаровск
Пользователь №: 55 441



Прикрепленное изображение
Цитата(Andrey S @ Oct 20 2013, 12:52) *
нужны два компонента (чтения/записи) для доступа к SDRAM через Avalon MM (доступ следует делать с brust), работающих на частоте шины (зеленая рамка),
две FIFO которые развяжут clock АЦП и clock шины, и будут служить буфером для доступа к SDRAM, ну и собственно усредняющий блок, который берет значение с АЦП с
FIFO умножает/складыет и кладет в другое FIFO. Все пишется ручками и вставляется в SoPC, для FIFO берется MegaFunction.


Вы правильно поняли задачу, усреднение производится именно между векторами, а не отсчетами.
По поводу вашего совета пока обдумываю, возможно не достаточно знаком с шиной Avalon. Буду читать.

Мне схема работы видится как на приложенной картинке.
Если кратко:
АЦП пишет данные поочередно в буферы. Выбор буфера осуществляют сигналы заполненности. Буфер представляет собой сдвиговый регистр длиной n слов (на картинке n=1024). После заполнения одного буфера АЦП переключается на другой, а в процессор подается сигнал о готовности порции данных. За время заполнения второго буфера проводится быстрая передача данных в процессор где все аккуратно складывается с усреднением в SDRAM.
Есть ли компонент для быстрой передачи порции данных длиной n слов в процессор?
Могу ли я так рассчитать размер буфера, что времени его заполнения хватит на обработку в софте?
Go to the top of the page
 
+Quote Post
Andrey S
сообщение Oct 22 2013, 18:06
Сообщение #4





Группа: Новичок
Сообщений: 5
Регистрация: 20-10-13
Пользователь №: 78 808



Цитата(Dootch @ Oct 22 2013, 16:07) *
Есть ли компонент для быстрой передачи порции данных длиной n слов в процессор?

Не понимаю, что значит передать порцию данных длиной n слов в процессор... Процессор берет данные из памяти загружает в регистры, выполняет операцию, записывает результат в память.

Вместо памяти он может читать из FIFO, к которой вы сделаете avalon slave интерфейс (без brust, это проще чем мастер, если решитесь - я подскажу).
Прикрепленное изображение

Можно обойтись одним FIFO, скажем 2048 слов, начинаете читать из него когда в нем больше половины заполнено в этом случаи вы гарантировано можете последовательно прочитать 1024 слова не тратя время на опрос на наличие слова в очереди при каждом чтении.

Т.е. описываете устройство с avalon slave интерфейсом для доступа к регистрам, у которого внутри FIFO куда пишутся данные с АЦП.
Мин. набор регистров:
control - здесь либо ресет, либо разрешение на захвата данный с АЦП, чтобы иметь возможность управлять стартом
status - флаг - число слов в очереди больше половины, флаг - очередь заполнена (в этом случаи пиши пропал, проц. не успевает)
read_data - отсюда читается слово из очереди.

В nios примерно след:
CODE

while (1) {
if ( iord(reg_status) & FIFO_FULL ) {
Panik!!!
}

if ( iord(reg_status) & FIFO_HALF_FULL ) {
for ( int i = 0; i < 1024; i++ ) {
int x = iord(reg_read_data);
int y = ...

y = ( a * x + b * y ) >> ...;

y в память...
}
}
}

Если АЦП знаковое расширение знака лучше сделать в хардваре при чтении из FIFO, что бы проц. сэкономить.

Как писалось выше при 100МГц у вас есть 20 тактов на отсчет, что очень немного. Само собой в цикле никаких вызовов функций, принтфов, арифметика целочисленная, полная оптимизация, на SDRAM включенный кэш. Если процессор справится, то никакие другие задачи он уже не потянет. Какова последующая обработка, после фильтрации?...

Цитата(Dootch @ Oct 22 2013, 16:07) *
Могу ли я так рассчитать размер буфера, что времени его заполнения хватит на обработку в софте?

С включенным кэшем при чтении из SDRAM задержка будет только при чтении первого слова, последующие будут в кэше и так каждые 500000. Т.е. длина очереди должна скомпенсировать это время, я думаю что 1024 хватит за глаза.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dootch   АЦП+FPGA+NIOS   Oct 17 2013, 06:36
- - lekintr   Напишите отдельный модуль, который забирает данные...   Oct 17 2013, 07:12
|- - Dootch   Цитата(lekintr @ Oct 17 2013, 10:12) Напи...   Oct 17 2013, 08:15
- - Golikov A.   не селен в альтерах, но по сути вам предлагают сд...   Oct 17 2013, 17:37
|- - Golikov A.   Цитата(Andrey S @ Oct 20 2013, 13:52) X -...   Oct 20 2013, 11:27
||- - Andrey S   Цитата(Golikov A. @ Oct 20 2013, 15:27) Я...   Oct 20 2013, 13:09
- - Golikov A.   Не надо хранить 2 вектора по 500 000 слов. надо ...   Oct 22 2013, 20:59
- - Dootch   Пошерстил литературу, кажется начинаю разбираться ...   Oct 29 2013, 07:36
- - Andrey S   Avalon-ST - это Avalon Streaming Interfaces, нужен...   Oct 29 2013, 18:38
- - Dootch   Andrey S, большое спасибо за полезную литературу и...   Oct 30 2013, 10:06
- - DASM   Зачем вам программно дергать регистр ? Делайте апп...   Oct 30 2013, 11:10
|- - Dootch   Цитата(DASM @ Oct 30 2013, 14:10) Зачем в...   Oct 30 2013, 11:34
- - DASM   Я уж непомню что там с шинами, но сравнивать скоро...   Oct 30 2013, 12:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016