Перейти к содержанию
    

Реализация БПФ на ПЛИС

Прошу прощения, у меня просто возникли очень сложные дела, их нужно было решить, поэтому пропал. Коэффициенты я заполнил, блок-схема в процессе, надеюсь в понедельник вечером представить результаты. Еще раз дико извиняюсь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот исправленный БПФ-алгоритм и недоделанная схема, может завтра довершу ее, если получится, а сейчас уже поздно...

FFT.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоп, стоп! С блок-схемой притормозите - к сожалению, Вы опять рисуете схему электрическую принципиальную, к тому же опять намудрили с мультиплексорами. Я вечером нарисую блок-схему, а Вы ее доработаете - так, думаю, лучше будет, иначе зря потратите кучу времени.

 

С коэффициентами на 6-м этапе, увы, ошиблись. Какие бы Вы там коэффициенты написали бы, если бы я Вас не предостерег от возможной ошибки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот блок-схема БПФ. Вам нужно дорисовать к ней интерфейс с внешним миром. После этого начнем прорабатывать реализацию блоков БПФ.

 

Что с коэффициентами на 6-м этапе? Есть хоть какие-нибудь соображения?

 

Теперь немного про вашу схему.

 

Вы так и не вынесли умножители на поворачивающие множители за пределы бабочки. Почему? Поверьте мне наслово (убедитесь при реализации нашего БПФ), что удобнее их вынести.

 

Вы почему-то нарисовали бабочку, которая получает за такт только половину данных. Почему? Почему Вы не хотите дать ей сразу все 4 точки?

Если сделать 4-х точечную бабочку, получающую данные за 2 такта, то получится усложнение всей схемы БПФ и самой бабочки. При однотактовой 4-х Т.Б. мы получаем выигрыш по быстродействию перед схемой с 2-х Т.Б. больше чем в 3 раза, а реализовав БПФ на 4-х точечной 2-х тактовой бабочке, мы получаем выигрыш менее чем в 2 раза. По моему мнению это нерационально.

 

Если уж Вы стали рисовать 2-х тактовую 4-х ТБ, то демультиплексор из 2 в 3 ненужен, даже несмотря на то, что данные подаются еще и на 2-х ТБ :). Нужен обычный мультиплексор 2 в один (поскольку данные нужно брать то из одной памяти, то из другой). Мы ведь этот ляп уже обсуждали. Почему Вы его снова допустили?

FFT_Diagram.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот, что подразумевалось под блок-схемой=)) Спасибо, понял... Алгоритм переделал, по крайней мере я думаю, что так должно быть. А как дать бабочке сразу 4 отсчета, я просто не представляю это возможным, кроме как через задержку на один так два из них.

Мы ведь этот ляп уже обсуждали. Почему Вы его снова допустили?

Мы обсуждали ляп про переключение шины.

Нужен обычный мультиплексор 2 в один (поскольку данные нужно брать то из одной памяти, то из другой)

Вы предлагаете подключать данные еще и к 2-х Т.Б. всегда?

Вот блок-схема БПФ. Вам нужно дорисовать к ней интерфейс с внешним миром.

Не знаю, то ли вы от меня ожидали, но вот вроде так, строго не судите, просто очень сложно все это не в живую обсуждать, а вот так по написанному понять чужие мысли...

FFT.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...строго не судите, просто очень сложно все это не в живую обсуждать...

 

Я Вас понимаю.

 

Алгоритм переделал, по крайней мере я думаю, что так должно быть.

 

Увы, не так :) Если Вы внимательно посмотрите на предыдущие этапы, то заметите следующее. На первом этапе 1 группа из 512-ти бабочек, на втором этапе – 4 одинаковых группы по 128 бабочек и т.д. В каждой группе нулевая бабочка (будем считать с 0) имеет все коэффициенты W0. Так вот на 6-ом этапе у нас получается 1024 группы по 1 бабочке в каждой – она 0-ая и единственная. Так что все коэффициенты у нее W0. При классическом (как наш) прореживании по частоте на последнем этапе нет умножений (в смысле, что умножаем все на W0 = 1). При прореживании по времени, умножение отсутствует на первом этапе.

 

Исправляйте...

 

А как дать бабочке сразу 4 отсчета, я просто не представляю это возможным, кроме как через задержку на один так два из них.

 

Принципиально, это ничем не отличается от того, чтобы подавать 2 отсчета одновременно, или 3, или 5. Что именно Вас смущает в том, чтобы подавать одновременно больше 2-х отсчетов?

 

Мы обсуждали ляп про переключение шины.

 

Здесь все тоже самое. :)

 

Вы предлагаете подключать данные еще и к 2-х Т.Б. всегда?

 

У Вас все равно не получится ничего не подать на вход 2-х точечной бабочки. Внутри ПЛИС нет логических ячеек с Z-состоянием на выходе (Quartus на этом прекратит синтез с ошибкой). Но даже в обычной схеме, если вы выход микросхемы А переведете в Z-состояние, то на входе микросхемы Б, на который приходит провод с выхода микросхемы А, не будет "ничего" – микр. Б все равно будет как-то "интерпретировать" то, что будет наводится на входную ножку :) Поэтому все равно, что Вы подадите на 2-х точечную бабочку когда она не нужна – специальную константу, случайные сигнал или то же, что и на 4-х Т.Б. Вам все равно придется поставить мультиплексор, который будет выбирать откуда брать результат – с 2-х или 4-х Т.Б.

 

Про блок-схему напишу днем или вечером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил.

Вас смущает в том, чтобы подавать одновременно больше 2-х отсчетов?

Да, меня это смущает, как из памяти сразу считать 4 отсчета, где мы возьмем такую память? Если только сами напишем...

FFT_2048.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь про блок-схему.

 

Если бы там нужно было только лишь нарисовать АЦП и три зеленые линии, то я не стал бы Вас просить это делать - это нарисовать можно меньше чем за минуту. :)

 

Я хотел, чтобы Вы немножко подумали как подключить АЦП к БПФ.

 

Блок-схема она не просто так рисуется – это первое приближение реализации. Она определяет макроблоки (модули) проекта и их взаимодействие. От того, насколько мы удачно разделим устройство на макроблоки зависит простота и удобство дальнейшего проектирования, реализации и отладки. Блок-схема не должна углубляться в детали реализации, но и не может от них абстрагироваться совсем – она должна учитывать реализацию, но в первом приближении. Блок-схема не расписывает детально все сигналы, соединяющие блоки, но она определяет структуру интерфейсов между ними. Макроблок, в свою очередь, не должен быть "перегружен начинкой". Грубо говоря, блок-схему БПФ можно свести и к 2-м квадратам "Память" и "Бабочка", двунаправленной стрелки между ними, стрелки на вход от АЦП и стрелки на выход. Но от такой блок-схемы не будет никакой помощи в реализации. Наоборот возникнет множество вопросов вроде "как это реализовать?", "куда это поместить?" (в "Бабочку" или в "Память"), "как это состыковать?" и т.д. и т.п.

 

Давайте представим, что было бы, если бы я не нарисовал блок управления. Возможны два варианта.

 

1) Я бы не нарисовал вообще ничего из управления, ни блок, ни управляющие сигналы (красные линии). В этом случае каждый блок должен был бы содержать свое собственное управление, работающее независимо от остальных блоков. БПФ смог бы работать только по очень жесткой временной диаграмме. Это все реализуемо, но ... Получаем много дублирующего кода, отсутствие какой-либо гибкости, сложность модификации, повышенную сложность стыковки блоков при сборке воедино, неудобство и повышенную сложность отладки, сложность в использовании блока в другом проекте.

 

2) Я бы не нарисовал блок управления, но нарисовал бы управляющие сигналы от блока к блоку. Этот вариант гораздо лучше 1-го. В некоторых системах такое распределенное управление бывает даже весьма выгодным и удобным, но в нашем случае оно хуже, чем централизованное. В нашем случае операции в блоках настолько детерминированы, набор их настолько ограничен, а взаимодействия между блоками настолько стационарны, что удобнее управлять всем этим из одного места. При попытке сделать в БПФ распределенное управление, мы столкнемся с трудностью его распределения по блокам.

 

Идем дальше.

 

На моей блок-схеме потоки данных, обозначенные синими линиями, одинаковые. Из памяти в бабочку мы передаем 4 точки всегда (2-х Т.Б. может рассматриваться либо как частный случай, когда из 4 точек используются только 2, а можно сделать и две 2-х ТБ – они ведь очень маленькие и сверх простые и схема БПФ нам это позволяет, но об этом позже), из бабочки в умножители тоже 4 точки всегда (неважно, что один из 4-х умножит. физически будет там отсутствовать за перманентной равностью коэффициента 1), из умножителей в память тоже возвращается 4 точки всегда. Мало того, точки-то комплексные!

 

И тут Вы... , извините,... "втыкаете" АЦП прямо в память! :) Неужели он у Вас выдает комплексный сигнал и по 4 точки за раз?!

 

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

 

Насчет памяти не смущайтесь :) когда подойдем к ее реализации все станет ясно.

 

 

Предлагаю параллельно с подключением АЦП заняться уже и самой бабочкой.

 

Сколько разрядов на данные и сколько на коэффициенты Вы предполагаете?

 

Напишите, пожалуйста VHDL код 4-х точечной бабочки (не забудьте, умножение на доворачивающие множители в нее не входит). Если что-то не ясно, не стесняйтесь, спрашивайте сразу.

Изменено пользователем Sefo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь про блок-схему.

 

Я хотел, чтобы Вы немножко подумали как подключить АЦП к БПФ.

 

А кто с утра еще не пЪян,

тот, извините , не улан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Добавил блок квадратурной дискретизации.

 

Сколько разрядов на данные и сколько на коэффициенты Вы предполагаете?

На данные 16 разрядов, на коэффициенты - 12.

 

Напишите, пожалуйста VHDL код 4-х точечной бабочки (не забудьте, умножение на доворачивающие множители в нее не входит).

Попробовал, прилагаю, не забыл :biggrin:

 

Если что-то не ясно, не стесняйтесь, спрашивайте сразу.

Спасибо!

FFT_2048.RAR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После просмотра и синтеза вашего кода в Квартусе у меня появились следующие вопросы:

 

1) Зачем Вы поставили регистры на входе?

 

2) Зачем Вы используете тип integer? Тем более, что разрядность входных данных у Вас задана через параметр, а диапазон значений integer жестко фиксирован.

 

3)Просинтезируйте (просто отдельным проектом только butterfly_complex.vhd) и посмотрите в RTL Viewer во что превращается ваш код. Проанализируйте, во что Квартус его превратил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем Вы поставили регистры на входе?

Да, действительно, все CONV_INTEGER нужно вынести за процесс...

Зачем Вы используете тип integer? Тем более, что разрядность входных данных у Вас задана через параметр, а диапазон значений integer жестко фиксирован.

Квартус сам разберется складывать целые числа, а потом просто переведет их в std_logic_vector нужной нам размерности, лишнее уберет...

Просинтезируйте (просто отдельным проектом только butterfly_complex.vhd) и посмотрите в RTL Viewer во что превращается ваш код. Проанализируйте, во что Квартус его превратил.

Если вынести за процесс конвертацию в integer? то синтезирует следующее:

165067.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В том то и дело, что Квартус плохо разобрался как сложить числа. Посмотрите внимательно, чтобы сложить 4 числа нужно всего 3 сумматора, а Квартус вставил еще и четвертый. Спрашивается зачем? Можно предположить, что для округления, но попробуйте при симуляции задать на вход 1,1,1,0 или -2,-2,-2,-1. На одном из выходов (где чистое сложение) в первом случае будет 3/4 = 0.75, что при округлении должно дать 1, а у Вас будет 0, во втором случае -7/4 = -1.75, что при округлении должно давать -2, а у Вас будет -1. Спрашивается зачем нужны четвертые сумматоры, если дробная часть не округляется, а отбрасывается? "Честный" код без integer и без округлений после синтеза занимает в 1.6 раз меньше места.

Изменено пользователем Sefo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...