|
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации |
|
|
|
Jan 18 2009, 19:19
|
Местный
  
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102

|
Доброго времени суток! Нужно реализовать алгоритм БПФ с прореживанием по частоте на ПЛИС, но при реализации возникают трудности, вот некоторые из них: - Поворачивающие множители являются числами по модулю меньше либо равно единицы: |W|<=1. Я так понял, чтобы перейти к целым числам требуется умножать их на (2^N) и то, что после запятой отсекать (N - разрядность). Нужно ли то же самое делать с входными данными (x1 и x2) или не обязательно?
- Нужно реализовать операции умножения и сложения со знаковыми числами, тут у меня такая задумка: преобразовать в integer соответствующего диапазона: от -(2^N)/2 до (2^N)/2 - 1, произвести нужные арифметические операции и преобразовать обратно std_logic_vector, код прилагается:
CODE library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all;
entity butterfly is generic (b_size: natural := 14); port ( x1, x2, w: in std_logic_vector(b_size - 1 downto 0); y1, y2: out std_logic_vector(b_size - 1 downto 0) ); end entity butterfly;
architecture behavioral of butterfly is signal x1_int, x2_int, w_int: integer range -8192 to 8191; signal y1_int: integer range -8192 to 8191; signal y2_int: integer range -134217728 to 134217727; -- Т.к. производится умножение на поворачивающий множитель begin process (CLK) is begin -- Преобразовываю в тип integer: x1_int <= conv_integer(x1); x2_int <= conv_integer(x2); w_int <= conv_integer(w); y1_int <= conv_integer(y1); y2_int <= conv_integer(y2);
-- Вычисляю бабочку и преобразовываю обратно в std_logic_vector (b_size - 1 downto 0): y1 <= conv_std_logic_vector(x1_int + x2_int, b_size); y2 <= conv_std_logic_vector((x1_int - x2_int) * w_int, b_size); end process; end architecture behavioral; Вопрос будет ли так корректно сделать или все делается совершенно по-другому? Буду рад любым вашим замечаниям, предложениям, советам и ссылкам. Заранее спасибо! P.S. На форуме я искал и не нашел ответа на свои вопросы, тем более я уверен далее появятся новые, думаю лучше, чтоб это все было в одной теме...
|
|
|
|
|
 |
Ответов
|
Jan 18 2009, 20:55
|
Местный
  
Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859

|
1. Чтобы поворачивающий множитель W, меньший единицы, преобразовать в целое число, имеющее разрядность N бит, надо выполнить следующее преобразование: round(W*(N-1)) - если число положительное, (2^N) - round(abs(W)*(N-1)) - если число отрицательное.
Правила приведены для дополнительного кода.
2. Для умножения знаковых чисел надо пользоваться специальной мегафункцией, указав ей параметр "SIGNED"
3. Если вы делаете БПФ на ПЛИС, то надо смотреть на алгоритмы по основанию 4, а не по основанию 2. Получается намного удобнее и эффективнее. Классическая бабочка - наследие от процессоров DSP, где она сделана аппаратно. Ядром алгоритма БПФ по основанию 4 является более сложный 4-х точечный БПФ, где все поворачивающие множители равны либо 1, либо -1. На ПЛИС удобно реализуется на сумматорах, можно сделать комбинаторную сехему, выполняющею этот самый 4-х точечный БПФ за один такт. Я такое делал, железно работало на частотах выше 100 МГц.
Ну, а если время на выполнение БПФа достаточно много, то можно обойтись обычным ДПФ-ом, легко реализуется, и вполне себя оправдывает, да и ошибкой квантования легче управлять - операция округления одна и выполняется она в самом конце.
|
|
|
|
Сообщений в этой теме
ZED Реализация БПФ на ПЛИС Jan 18 2009, 19:19 Builder Цитата(ZED @ Jan 18 2009, 23:19) Вопрос б... Jan 18 2009, 20:57 ZED ЦитатаСам не знаю как лучше, но все-же, а если пос... Jan 18 2009, 21:26 soldat_shveyk Я малость ошибся правильно будет так:
round(W*(2^... Jan 19 2009, 10:32 ZED ЦитатаЯ малость ошибся правильно будет так:
round(... Jan 19 2009, 16:28 soldat_shveyk Не силен в Verilog. Помочь не могу.
А не пробовали... Jan 20 2009, 07:41 ZED ЦитатаНе силен в Verilog. Помочь не могу.
А не про... Jan 20 2009, 15:42 soldat_shveyk ALTERA FFT Compiler - все основное там есть. Для м... Jan 20 2009, 19:38 ZED ЦитатаЕсли не подойдут Вам оригинальные варианты, ... Jan 20 2009, 20:28 soldat_shveyk Для ознакомительной работы в режиме OpenCore можно... Jan 21 2009, 10:33 ZED Вопрос по vhdl остается открытым, но похоже кроме ... Jan 21 2009, 18:04 soldat_shveyk Откопал у себя исходники всех альтеровских БПФ-ов,... Jan 22 2009, 08:07 ZED Буду очень признателен: zed1986@yandex.ru
Спасибо... Jan 22 2009, 19:36 ZED Возникла еще одна проблема, реализую БПФ по схеме ... Jan 30 2009, 05:06 BuTeK поделитесь рабочей коркой БПФ на почту cvik@tut.by Jan 30 2009, 05:35 ZED Цитатаподелитесь рабочей коркой БПФ на почту cvik@... Jan 31 2009, 09:16 анатолий Проще всего сначала представить данные в формате I... Feb 2 2009, 14:02 ZED Спасибо, Анатолий, я так и делал, возник вопрос ка... Feb 10 2009, 17:38 ZED В общем нужно масштабировать данные после операций... Feb 12 2009, 20:14 Sefo Как ваши дела с БПФ? Если вопрос еще актуальный и ... Feb 18 2009, 01:27 BuTeK Конечно актуально! Поделитесь информацией... О... Feb 18 2009, 05:45 ZED Вопрос еще актуальный, буду очень признателен. Осо... Feb 18 2009, 09:26 Sefo Сначала давайте определимся что мы хотим и выберем... Feb 18 2009, 15:38 ZED Не совсем понял про разделение бабочки и поворачив... Feb 18 2009, 16:34 Sefo Про разделение бабочки и поворачивающих множителей... Feb 18 2009, 16:56 ZED Хорошо, жду с нетерпением, завтра я буду вечером и... Feb 18 2009, 17:04 Sefo На рисунке показана базовая операция для БПФ с про... Feb 19 2009, 13:29 ZED Честно говоря, конечно лучше бы 4-х Т.Б. Но как с ... Feb 19 2009, 15:21 Sefo Итак, делаем более быстрый вариант с 4-х и 2-х Т.Б... Feb 19 2009, 22:36 ZED Пока никакого интерфейса я не проектировал, считал... Feb 20 2009, 17:38 Sefo Я не спроста предложил Вам пройти путь создания БП... Feb 20 2009, 19:26 ZED Вот пожалуйста, мои инсинуации: http://ifolder.ru/... Feb 20 2009, 20:50 Sefo Первые комментарии такие. Это не блок схема, а схе... Feb 21 2009, 09:07 ZED ЦитатаНепонятно назначение блока на входе памяти д... Feb 21 2009, 10:01 Sefo Но что подается на Q2 когда D подается на Q1? Feb 21 2009, 10:25 ZED На Q2 подается Z, когда D подается на Q1 Feb 21 2009, 10:42 Sefo Это ножки ПЛИС можно физически перевести в третье ... Feb 21 2009, 14:31 ZED ЦитатаЭто ножки ПЛИС можно физически перевести в т... Feb 21 2009, 16:06 Sefo Поскольку мы выбрали схему пин-понг, то двухпортов... Feb 22 2009, 10:05 ZED Не, это не учебный, ну я думаю там отсчеты будут п... Feb 22 2009, 10:44 Sefo Все внешние интерфейсы всегда определяются тем, к ... Feb 22 2009, 12:36 ZED Не, у меня первый вариант, я так понимаю, что блок... Feb 23 2009, 10:40 Sefo Только не ClockEnable, а Write_Enable. Он так же д... Feb 24 2009, 12:52 Sefo Куда же Вы пропали? Feb 27 2009, 05:11 ZED Прошу прощения, у меня просто возникли очень сложн... Feb 28 2009, 15:35 ZED Вот исправленный БПФ-алгоритм и недоделанная схема... Mar 2 2009, 20:14 Sefo Стоп, стоп! С блок-схемой притормозите - к сож... Mar 3 2009, 07:00 Sefo Вот блок-схема БПФ. Вам нужно дорисовать к ней инт... Mar 4 2009, 11:49 ZED А вот, что подразумевалось под блок-схемой=)) Спас... Mar 4 2009, 17:05 Sefo Цитата(ZED @ Mar 4 2009, 20:05) ...строго... Mar 4 2009, 23:41 ZED Исправил.
ЦитатаВас смущает в том, чтобы подавать ... Mar 6 2009, 15:20 Sefo Теперь про блок-схему.
Если бы там нужно было то... Mar 6 2009, 15:42 sazh Цитата(Sefo @ Mar 6 2009, 18:42) Теперь п... Mar 6 2009, 16:04 Sefo RE: Реализация БПФ на ПЛИС Mar 6 2009, 16:55 ZED ЦитатаВ общем, постарайтесь продумать, как его под... Mar 6 2009, 19:12 ZED Там нужно еще библиотеку добавить:
Кодuse IEEE.std... Mar 6 2009, 20:54 Sefo После просмотра и синтеза вашего кода в Квартусе у... Mar 7 2009, 14:10 ZED ЦитатаЗачем Вы поставили регистры на входе?
Да, де... Mar 7 2009, 14:22 Sefo В том то и дело, что Квартус плохо разобрался как ... Mar 7 2009, 14:36 Sefo Попробовали написать код без integer? Mar 7 2009, 15:49 ZED Попробовал, но не могу проверить (Quartus сломался... Mar 8 2009, 10:12 Sefo Кроме того, что код оказался не компилируем, разли... Mar 8 2009, 18:52 ZED Пока на ум пришло только это:
Кодlibrary IEEE;
us... Mar 8 2009, 20:21 Sefo "if" не может быть использован вне проце... Mar 8 2009, 20:50 ZED Цитата"if" не может быть использован вне... Mar 8 2009, 21:50 Sefo Когда у Вас будет возможность просинтезировать код... Mar 8 2009, 23:21 ZED Квартус синтезирует 2 сумматора, на вход одного из... Mar 9 2009, 10:43 Sefo Вот это-то и плохо. У нас обычное суммирование с п... Mar 9 2009, 12:24 ZED Если только самому как-то описывать полный суммато... Mar 9 2009, 13:22 Sefo Извиняюсь за длительную паузу. Прием очень простой... Mar 11 2009, 23:11 ZED Прошу прощения, что долго не отвечал, просто по уч... Mar 16 2009, 04:22 Sefo Ну как, разрулили? Mar 18 2009, 09:08 ZED Да, спасибо, разрулил более менее, надеюсь еще как... Mar 18 2009, 17:18 Sefo 1) Локально, это имеется ввиду внутри бабочки. В с... Mar 18 2009, 18:26 Azatot Господа,так ведь же есть уже готовые БПФ ядра и у ... Mar 18 2009, 19:02 Sefo В данном случае преследуются учебные цели. Понятно... Mar 18 2009, 19:44 ZED Ну я так и имел ввиду:
Кодsignal A : std_logi... Mar 19 2009, 19:09 Sefo Теперь мне не очень понятно, поняли ли Вы меня пра... Mar 19 2009, 20:00 ZED Чего-то не симулируется, квартус лагает, вот проек... Mar 21 2009, 17:03 Sefo Что значит не симулируется? Под проектом я понимаю... Mar 21 2009, 19:13 ZED ЦитатаЧто значит не симулируется?
Временная диагра... Mar 21 2009, 20:12 sazh Цитата(ZED @ Mar 21 2009, 23:12) Временна... Mar 22 2009, 10:20 Sefo Вы просто не тот файл смотрите. Результаты симуляц... Mar 22 2009, 08:35 ZED Вот, что у меня получилось: Mar 22 2009, 10:48 Sefo Цитата(sazh @ Mar 22 2009, 13:20) Если я ... Mar 22 2009, 11:41 ZED Да, но результат суммирования теперь увеличился на... Mar 22 2009, 12:49 Sefo Все-таки, Вы не поняли.
Округление мы уже произв... Mar 22 2009, 13:30 ZED В Москве.
Просто вы писали:
ЦитатаВ случае (A+B+C+... Mar 22 2009, 14:14 Sefo Видимо, словами "круг замкнулся" я Вас з... Mar 22 2009, 15:45 ZED Все вроде понял, т.е. мы сразу после АЦП добавляем... Mar 22 2009, 16:03 Sefo Да.
Ура! Ттеперь можно перейти к умножител... Mar 22 2009, 16:22 ZED 1.0 это 2047
-1.0 это -2047
Чтобы не увеличивать... Mar 22 2009, 16:43 Sefo Давайте пока так начнем. Впроцессе реализации сами... Mar 23 2009, 07:53 ZED Вот комплексный перемножитель, не знаю правильно л... Mar 24 2009, 15:32 Sefo Хорошо. Код внимательно посмотрю завтра - навскидк... Mar 24 2009, 19:37 Sefo Цитата(ZED @ Mar 24 2009, 18:32) вроде ум... Mar 25 2009, 11:56 ZED ЦитатаЧему равна разрядность произведения двух зна... Mar 25 2009, 17:23 Sefo Цитата(ZED @ Mar 25 2009, 20:23) n+k
Не ... Mar 25 2009, 18:12 ZED По-моему что для знаковых, что для беззнаковых пр... Mar 25 2009, 18:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|