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

 
 
23 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации
Azatot
сообщение Mar 18 2009, 19:02
Сообщение #76


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

Группа: Участник
Сообщений: 108
Регистрация: 31-01-08
Из: Москва
Пользователь №: 34 633



Господа,так ведь же есть уже готовые БПФ ядра и у Xilinx, и у Altera. Лично пользуюсь Xilinx ядром, вроде, не плохо получается. В своем проекте мы вешаем на вход АЦП и потоком гоняем 1024 точки.
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 18 2009, 19:44
Сообщение #77


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



В данном случае преследуются учебные цели. Понятно, что для работы, если есть готовое IP и, к тому же, бесплатно, то глупо им не воспользоваться. Но для ПЛИС довольно много полезных и бесплатных IP, вроде БПФ, включено в состав средств разработки, а если ASIC надо делать? Увы, для ASIC IP задорма никто не дает. Я вот, однажды делал БПФ для ASIC. Там нужна была небольшая постобработка результатов их анализ и формирование выборок из спектра по заданным критериям - большую чать этого довеска удалось встроить прямо в последнюю стадию БПФ и задействовав вычислительные ресурсы самого БПФ. Получился существенный выигрыш и по быстродействию и площадь здорово сэкономили. С покупным IP так удачно не получилось бы.

В общем, надо пользоваться готовым IP там, где это можно, но хороший инженер должен уметь реализовать это IP и сам.

Так что я очень поддерживаю желание ZEDa собрать свой собственный "велосипед" свомим руками.
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 19 2009, 19:09
Сообщение #78


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Ну я так и имел ввиду:

Код
signal A : std_logic_vector(n-1 downto 0);
signal B : std_logic_vector(n-1 downto 0);
signal SUM_buf : std_logic_vector(n downto 0);
signal SUM : std_logic_vector(n downto 0);

SUM_buf <= resize(A, n+1) -  resize(B, n+1) + '1'
SUM <= SUM_buf(n downto 1);


resize расширяет число знаковым разрядом, соответственно при сложении/вычитании 4 отсчетов resize(OTSCHOT, n+2), а потом отбрасываем.

Понятно, спасибо, в том числе и за поддержку.
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 19 2009, 20:00
Сообщение #79


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



Теперь мне не очень понятно, поняли ли Вы меня правильно. smile.gif

Код

CODE
signal A : std_logic_vector(n-1 downto 0);
signal B : std_logic_vector(n-1 downto 0);
signal SUM_buf : std_logic_vector(n downto 0);
signal SUM : std_logic_vector(n-1 downto 0);

SUM_buf <= resize(A, n+1) - resize(B, n+1) + '1'
SUM <= SUM_buf(n downto 1);


в случае A = (2^n)-1 и B = -(2^n) даст неверный результат.

Вы симулировать пробовали? Если да, то выложите полный проект, чтобы было видно как именно Вы это делали. Если нет, то просимулируйте... и выложите полный проект, чтобы было видно как именно Вы это делали smile.gif

Сообщение отредактировал Sefo - Mar 19 2009, 20:00
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 21 2009, 17:03
Сообщение #80


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Чего-то не симулируется, квартус лагает, вот проект:
Код
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity summator is
    generic (b_size: natural := 16
             );
    
    port(A: in std_logic_vector(b_size - 1 downto 0);
         B: in std_logic_vector(b_size - 1 downto 0);
         SUM: out std_logic_vector(b_size - 1 downto 0)
        );
end entity summator;


architecture beh_summator of summator is

signal A_sig : std_logic_vector(b_size downto 0);
signal B_sig : std_logic_vector(b_size downto 0);
signal SUM_buf : std_logic_vector(b_size downto 0);

begin
A_sig <= (0 => A(b_size-1)) & A;
B_sig <= (0 => B(b_size-1)) & B;
SUM_buf <= A_sig - B_sig + '1';
SUM <= SUM_buf(b_size downto 1);

end beh_summator;
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 21 2009, 19:13
Сообщение #81


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



Что значит не симулируется? Под проектом я понимаю все квартусовские файлы.
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 21 2009, 20:12
Сообщение #82


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Цитата
Что значит не симулируется?

Временная диаграмма не работает - выдает одни иксы: XXXXXXX и т.д. Что-то с Квартусом или компом, я его стабильно раз в неделю переставляю. А может и я что-то не так делаю...
Проект прикрепляю.
Прикрепленные файлы
Прикрепленный файл  summator.rar ( 440.25 килобайт ) Кол-во скачиваний: 84
 
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 22 2009, 08:35
Сообщение #83


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



biggrin.gif Вы просто не тот файл смотрите. Результаты симуляции лежат в каталоге db\ и называется файл summator.sim.vwf. Вообще-то этот файл Квартус Вам должен был сам показать по окончании симуляции в одном из окон репорта. Если Вы в этом файле измените формат отображения для SUM с Binary на Signed Decimal, то Вы увидите, что результат = -32768, что неверно.
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 22 2009, 10:20
Сообщение #84


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(ZED @ Mar 21 2009, 23:12) *
Временная диаграмма не работает - выдает одни иксы: XXXXXXX и т.д. Что-то с Квартусом или компом, я его стабильно раз в неделю переставляю. А может и я что-то не так делаю...
Проект прикрепляю.


Если я что то и переставляю, так это новую версию Квартуса. Чего и вам желаю.
А выдавать неопределенности (при функционале) он может, если только галочка не стоит на опции Overwrite.....
Иначе cмотрите в опции report.
Что касается Вашего сумматора, ничего сказать не могу. Потому что текст не понимаю (понятно только, что он не правильно работает. А в своих библиотеках сами копайтесь.


Цитата(Sefo @ Mar 22 2009, 11:35) *
biggrin.gif Вы просто не тот файл смотрите. Результаты симуляции лежат в каталоге db\ и называется файл summator.sim.vwf. Вообще-то этот файл Квартус Вам должен был сам показать по окончании симуляции в одном из окон репорта. Если Вы в этом файле измените формат отображения для SUM с Binary на Signed Decimal, то Вы увидите, что результат = -32768, что неверно.


Интересно, в каком семестре мы подойдем к изучению умножителей.
Иль дайте есть, иль ешьте сами.
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 22 2009, 10:48
Сообщение #85


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Вот, что у меня получилось:
Прикрепленные файлы
Прикрепленный файл  summator.rar ( 421.59 килобайт ) Кол-во скачиваний: 79
 
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 22 2009, 11:41
Сообщение #86


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



Цитата(sazh @ Mar 22 2009, 13:20) *
Если я что то и переставляю, так это новую версию Квартуса. Чего и вам желаю.
А выдавать неопределенности (при функционале) он может, если только галочка не стоит на опции Overwrite.....
Иначе cмотрите в опции report.
Что касается Вашего сумматора, ничего сказать не могу. Потому что текст не понимаю (понятно только, что он не правильно работает. А в своих библиотеках сами копайтесь.

Интересно, в каком семестре мы подойдем к изучению умножителей.
Иль дайте есть, иль ешьте сами.


А можно поинтересоваться, с чего вдруг вы тут это "ляпнули"? Как-то очень не впопад smile.gif

Цитата(sazh @ Mar 22 2009, 13:20) *
Что касается Вашего сумматора, ничего сказать не могу. Потому что текст не понимаю (понятно только, что он не правильно работает. А в своих библиотеках сами копайтесь.


Не понимаю, чего Вы так възелись на сумматор? Не хотите, не разбирайтесь - я же от Вас этого не требую... и даже не прошу этого делать! smile.gif

Цитата(sazh @ Mar 22 2009, 13:20) *
Интересно, в каком семестре мы подойдем к изучению умножителей.


Мне интересно, а Вам-то какая разница? Да, с бабочкой (точнее с ее вычитателями) несколько затянулось, но ведь задача стоит разобраться, а не как можно скорее получить код БПФ.

Цитата(sazh @ Mar 22 2009, 13:20) *
Иль дайте есть, иль ешьте сами.


Что Вы имеете ввиду?

--------- Для всех кто читает эту тему ----------

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

Я буду искренне благодарен тем, кто может дополнить написанное чем-то полезным, но...

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



Цитата(ZED @ Mar 22 2009, 13:48) *
Вот, что у меня получилось:


Теперь Вам понятно, почему при (A+B +1) >> 1 результат всегда занимает столько же разрядов, сколько операнды, а при (A-B+1) >> 1 результат может потребовать для хранения на один разряд больше, чем сами операнды?

На всякий случай привожу правильный код вычитателя.

CODE
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity subtractor is
generic (b_size: natural := 16
);

port(A: in std_logic_vector(b_size - 1 downto 0);
B: in std_logic_vector(b_size - 1 downto 0);
SUM: out std_logic_vector(b_size downto 0)
);
end entity subtractor;


architecture beh_subtractor of subtractor is

signal A_sig : std_logic_vector(b_size + 1 downto 0);
signal B_sig : std_logic_vector(b_size + 1 downto 0);
signal SUM_buf : std_logic_vector(b_size + 1 downto 0);

begin
A_sig <= (1 downto 0 => A(b_size-1)) & A;
B_sig <= (1 downto 0 => B(b_size-1)) & B;
SUM_buf <= A_sig - B_sig + '1';
SUM <= SUM_buf(b_size + 1 downto 1);

end beh_subtractor;


Сообщение отредактировал Sefo - Mar 22 2009, 11:48
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 22 2009, 12:49
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Да, но результат суммирования теперь увеличился на один разряд, я так понимаю, что полное окуругление мы произведем после умножения?
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 22 2009, 13:30
Сообщение #88


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



Все-таки, Вы не поняли. sad.gif

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

Вы в каком городе живете?
Go to the top of the page
 
+Quote Post
ZED
сообщение Mar 22 2009, 14:14
Сообщение #89


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



В Москве.
Просто вы писали:
Цитата
В случае (A+B+C+D)/4 с округлением (т.е. (A+B+C+D+2) >> 2) мы можем (и делаем) объявить внутри бабочки сигналы A_ B_ C_ D_ с разрядностью на 2 больше, чем A,B,C,D. Складываем их, прибавляем 2 (для округления) и отбросываем 2 младших разряда (т.е. /4). В этом случае, выполнив все необходимые операции, мы снова возвращаемся к разрядности такой же как и у A,B,C,D. У нас на входе разрядность n, внутри бабочки разрядность n+2, а на выходе опять n. И при этом мы нигде ничего не реряем.

Т.е. на выходе бабочки должна быть разрядность такая как и на входе.

Но тут же вы писали:
Цитата
Но при наличие вычитания и желания проделать операции с округлением результата мы в некоторых случаях сможем получить результат (именно конечный результат), для представления которого нам не хватит разрядности такой же как и у входных данных - нам потребуется на один разряд больше. (см пример в пред. сообщении) Т.е. выход будет на один разряд больше ==> выход умножителей придется сделать на 1 разряд больше ==> разрядность памяти придется увеличить на 1 разряд ==> вход бабочки тоже увеличится на 1 разряд - круг замкнулся т.к. наши данные во время вычисления БПФ "гуляют" по кругу.


Вот меня это и поставило в тупик будет ли у нас увеличиваться разрядность на каждом этапе?

И возникает вопрос стоит ли округление таких затрат?
Go to the top of the page
 
+Quote Post
Sefo
сообщение Mar 22 2009, 15:45
Сообщение #90


Местный
***

Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537



Видимо, словами "круг замкнулся" я Вас запутал.

Разрядность бабочки у нас не будет увеличиваться на каждом этапе.

Я пытался объяснить, что при наличие вычитания в операциях бабочки с округлением потребует от нас повсеместного (т.е. в каждом блоке, но не на каждом этапе ! ) увеличения разрядности на 1 поскольку диапазон значений данных с АЦП от -32768 до +32767, а при вычислениях БПФ диапазон результатов будет от -32768 до +32768 ( независимо от этапа). Такой диапазон чисел для представления требует не 16, а 17 разрядов.

Забегая вперед, кроме бабочки, в умножителе, когда -32768 Вы умножите на -1.0, то получите +32768 - это число для представления требует опять таки 17 разрядов (как видите, даже если убрать округление в бабочке, то нам все равно не избежать этой проблемы в умножителях).

Из-за этого нам нужно либо исключить число -32768 из входного потока данных с АЦП (тогда при любых вычислениях БПФ мы никогда не получим +32768 - т.е. будем всегда иметь диапазон от -32767 до +32767) либо сделать 17-ти разрядные шины данных, чтобы по ним можно было бы "гонять" +32768.

Надеюсь, теперь все встало на свои места.

Если нет, то тогда могу только предложить созвониться и обсудить это по телефону (я в Питере)- иначе мы еще долго с этим будем возиться.

Сообщение отредактировал Sefo - Mar 22 2009, 15:52
Go to the top of the page
 
+Quote Post

23 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:33
Рейтинг@Mail.ru


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