Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: сложение двух 16 битных чисел
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
StasK
Есть проект на ATF1508AS (128 макроселл) для снятия 4096 чисел данных с 14 битного АЦП, запись в SRAM, потом считывание, все по командам контроллера. На каждое число есть 4 такта, частота - 2 МГц. Как реализовать усреднение по 2, 4, 8, 16. 34? Т.е. при первом считывании каждую i-ую точку сдвинуть на соответствующее кол-во разрядов вправо и записать в SRAM, на каждой следующей i-ой точке надо считать i-ое данное с SRAM, сложить со сдвинутым текущим i-ым и опять записать в SRAM. Возможно-ли это сделать на данном устройстве? Может поставить еще одну ПЛИС или DSP для суммирования? Большого опыта работы с ПЛИС нет.
Спасибо.
rezident
Вы хотите организовать фильтр типа SMA (простое скользящее среднее)?
Посмотрите по ссылке http://www.may.nnov.ru/mak/DSP/chSMA.shtml
StasK
Цитата(rezident @ Sep 14 2008, 23:44) *
Вы хотите организовать фильтр типа SMA (простое скользящее среднее)?
Посмотрите по ссылке http://www.may.nnov.ru/mak/DSP/chSMA.shtml


Нет. Мне надо не SMA: Y[i] = (X[i] + X[i-1] + ... X[i - (N - 1)])/N, а
Y[i] = X1[i]/N + X2[i]/N + ... XN[i]/N, где i=[0:4095].
Т.е. я бы назвал это усреднением векторов, но наверняка есть стандартное название.
Maverick
Цитата(StasK @ Sep 15 2008, 02:17) *
Нет. Мне надо не SMA: Y[i] = (X[i] + X[i-1] + ... X[i - (N - 1)])/N, а
Y[i] = X1[i]/N + X2[i]/N + ... XN[i]/N, где i=[0:4095].
Т.е. я бы назвал это усреднением векторов, но наверняка есть стандартное название.


Если N равен степени двойки тогда
1. Можно поставить суматор, который будет находить сумму X[i] + X[i-1] + ... X[i - (N - 1)], а потом производиться соответствующая операция сдвига на N разрядов.
2. Можно производить соответствующий сдвиг на N разрядов с каждым Х[i], а потом находить их сумму.

п. 1 и п. 2 это равноценны
mse
Цитата(Maverick @ Sep 15 2008, 09:35) *
п. 1 и п. 2 это равноценны

Нискажите ;О) Если сперва всё сложить, а потом сдвинуть, а то и округлить, то ошибка будет 1МЗР(±0,5МЗР при округлении). А если сперва сдвинуть, а потом сложить, то... сами понимаете, в какие ворота можно не влезть... ;О) Ну и ресурсы тоже таво... разные.
Maverick
Цитата(mse @ Sep 15 2008, 09:35) *
Нискажите ;О) Если сперва всё сложить, а потом сдвинуть, а то и округлить, то ошибка будет 1МЗР(±0,5МЗР при округлении). А если сперва сдвинуть, а потом сложить, то... сами понимаете, в какие ворота можно не влезть... ;О) Ну и ресурсы тоже таво... разные.


С первым замечанием еще могу согласиться, а вот со вторым "Ну и ресурсы тоже таво... разные" позвольте не согласиться smile.gif Ресурсы для ПЛИС, на мой взгляд, будут одинаковыми, просто последовательность операций иная.
mse
Цитата(Maverick @ Sep 15 2008, 10:54) *
С первым замечанием еще могу согласиться, а вот со вторым "Ну и ресурсы тоже таво... разные" не могу согласиться smile.gif Ресурсы для ПЛИС будут одинаковыми, просто последовательность операций иная.

Ну почему? ;О) В "точном" случае сумматор будет на всю длину вектора (Win+12), а если сперва усекать, а потом суммировать, то сумматор будет только в ширину выходного вектора. Мельчь, конешно, но тем не менее. ;О)
Intekus
Цитата
Нет. Мне надо не SMA: Y[i] = (X[i] + X[i-1] + ... X[i - (N - 1)])/N, а
Y[i] = X1[i]/N + X2[i]/N + ... XN[i]/N, где i=[0:4095].
Т.е. я бы назвал это усреднением векторов, но наверняка есть стандартное название.

А можно словами пояснить в чём отличие? Непонятна двойная индексация в вашем варианте - что значит, например, XN[i]?
mse
Цитата(Intekus @ Sep 15 2008, 11:00) *
А можно словами пояснить в чём отличие?

См пост №5.
Maverick
Цитата(mse @ Sep 15 2008, 10:00) *
Ну почему? ;О) В "точном" случае сумматор будет на всю длину вектора (Win+12), а если сперва усекать, а потом суммировать, то сумматор будет только в ширину выходного вектора. Мельчь, конешно, но тем не менее. ;О)


Согласен, просто с точки зрения построения цифровой схемы одинаково. smile.gif А разрядность сумматора, я не учитывал sad.gif
Splice
Что точно можно сказать, деление на N не кратное двум, сожрёт много ресурсов. Пару месяцев назад делал на EPF10K100Е вычисления над 16-ти битными числами пару сложений и умножений, сожрало треть ёмкости.
EvgenyNik
А не подойдёт ли Вам такой вариант?
Y[i] = (X[i] - Y[i-1])/N + Y[i-1] - это простейший рекурсивный НЧ-фильтр первого порядка, цифровой эквивалент аналогового ФНЧ на R и C.
Если N - кратно степени 2, то ресурсов минимум и помнить кучу выборок не надо.
Если не кратно, то можно реализовать в несколько параллельных /N1, /N2, /N3 - каждый из которых кратен степени 2 и складывать результаты.
Чтобы сразу не терять в точности на отбрасывании младших бит, исходному X[i] добавить младших нулевых битов, а потом сдвинуть на их кол-во результат.
Прикрепил результат моделирования.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.