|
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации |
|
|
|
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. На форуме я искал и не нашел ответа на свои вопросы, тем более я уверен далее появятся новые, думаю лучше, чтоб это все было в одной теме...
|
|
|
|
|
 |
Ответов
|
Mar 6 2009, 15:42
|
Местный
  
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537

|
Теперь про блок-схему. Если бы там нужно было только лишь нарисовать АЦП и три зеленые линии, то я не стал бы Вас просить это делать - это нарисовать можно меньше чем за минуту.  Я хотел, чтобы Вы немножко подумали как подключить АЦП к БПФ. Блок-схема она не просто так рисуется – это первое приближение реализации. Она определяет макроблоки (модули) проекта и их взаимодействие. От того, насколько мы удачно разделим устройство на макроблоки зависит простота и удобство дальнейшего проектирования, реализации и отладки. Блок-схема не должна углубляться в детали реализации, но и не может от них абстрагироваться совсем – она должна учитывать реализацию, но в первом приближении. Блок-схема не расписывает детально все сигналы, соединяющие блоки, но она определяет структуру интерфейсов между ними. Макроблок, в свою очередь, не должен быть "перегружен начинкой". Грубо говоря, блок-схему БПФ можно свести и к 2-м квадратам "Память" и "Бабочка", двунаправленной стрелки между ними, стрелки на вход от АЦП и стрелки на выход. Но от такой блок-схемы не будет никакой помощи в реализации. Наоборот возникнет множество вопросов вроде "как это реализовать?", "куда это поместить?" (в "Бабочку" или в "Память"), "как это состыковать?" и т.д. и т.п. Давайте представим, что было бы, если бы я не нарисовал блок управления. Возможны два варианта. 1) Я бы не нарисовал вообще ничего из управления, ни блок, ни управляющие сигналы (красные линии). В этом случае каждый блок должен был бы содержать свое собственное управление, работающее независимо от остальных блоков. БПФ смог бы работать только по очень жесткой временной диаграмме. Это все реализуемо, но ... Получаем много дублирующего кода, отсутствие какой-либо гибкости, сложность модификации, повышенную сложность стыковки блоков при сборке воедино, неудобство и повышенную сложность отладки, сложность в использовании блока в другом проекте. 2) Я бы не нарисовал блок управления, но нарисовал бы управляющие сигналы от блока к блоку. Этот вариант гораздо лучше 1-го. В некоторых системах такое распределенное управление бывает даже весьма выгодным и удобным, но в нашем случае оно хуже, чем централизованное. В нашем случае операции в блоках настолько детерминированы, набор их настолько ограничен, а взаимодействия между блоками настолько стационарны, что удобнее управлять всем этим из одного места. При попытке сделать в БПФ распределенное управление, мы столкнемся с трудностью его распределения по блокам. Идем дальше. На моей блок-схеме потоки данных, обозначенные синими линиями, одинаковые. Из памяти в бабочку мы передаем 4 точки всегда (2-х Т.Б. может рассматриваться либо как частный случай, когда из 4 точек используются только 2, а можно сделать и две 2-х ТБ – они ведь очень маленькие и сверх простые и схема БПФ нам это позволяет, но об этом позже), из бабочки в умножители тоже 4 точки всегда (неважно, что один из 4-х умножит. физически будет там отсутствовать за перманентной равностью коэффициента 1), из умножителей в память тоже возвращается 4 точки всегда. Мало того, точки-то комплексные! И тут Вы... , извините,... "втыкаете" АЦП прямо в память!  Неужели он у Вас выдает комплексный сигнал и по 4 точки за раз?! В общем, постарайтесь продумать, как его подключить. И, думаю, лучше будет, если Вы накидаете несколько, пусть и сырых, вариантов, чтобы не терять зря время. Насчет памяти не смущайтесь  когда подойдем к ее реализации все станет ясно. Предлагаю параллельно с подключением АЦП заняться уже и самой бабочкой. Сколько разрядов на данные и сколько на коэффициенты Вы предполагаете? Напишите, пожалуйста VHDL код 4-х точечной бабочки (не забудьте, умножение на доворачивающие множители в нее не входит). Если что-то не ясно, не стесняйтесь, спрашивайте сразу.
Сообщение отредактировал Sefo - Mar 6 2009, 15:46
|
|
|
|
Сообщений в этой теме
ZED Реализация БПФ на ПЛИС Jan 18 2009, 19:19 soldat_shveyk 1. Чтобы поворачивающий множитель W, меньший едини... Jan 18 2009, 20:55 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 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
|
|
|