Jump to content

    
Sign in to follow this  
ZED

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

Recommended Posts

Все вроде понял, т.е. мы сразу после АЦП добавляем знаковыми разрядами до 17 разрядов и гоним в паямть с 17 разрядными словами и уже работаем с 17 разрядными данными.

Share this post


Link to post
Share on other sites

Да. :cheers:

 

Ура! Ттеперь можно перейти к умножителям. :)

 

Вы хотели на коэффициенты заложить 12 разрядов. У коэффициентов БПФ диапазон Re и Im частей от -1.0 до +1.0. Как Вы думаете, какое 12-ти разрядное число лучше поставить в соответствовие -1.0 и какое в соответствие +1.0? И почему?

 

Опыт бабочки должен Вам помочь.

Share this post


Link to post
Share on other sites

1.0 это 2047

 

-1.0 это -2047

 

Чтобы не увеличивать разрядность:

 

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

Share this post


Link to post
Share on other sites

Давайте пока так начнем. Впроцессе реализации сами догадаетесь, почему это не самый лучший вариант. Хотя так тоже можно. Кстати, надеюсь, что написав

Чтобы не увеличивать разрядность

Вы имели ввиду разрядность коэффициентов.

 

Все данные с бабочки мы направим на блок комплексных умножителей. В этом блоке будет 4 умножителя, один из которых всегда умножает на (1.0 + j0). Такой подход удобен т.к. все данные (все 4 точки) идут единым путем и каждый блок нашего БПФ сам заботится о том, чтобы одни данные не "отстали"/"опередили" другие.

 

Итак:

 

1) жду от Вас код блока комплексных умножителей

 

2) код самого комплексного умножителя.

Share this post


Link to post
Share on other sites

Хорошо. Код внимательно посмотрю завтра - навскидку, вместо

 

entity complex_multiplier is
generic (b_size: natural := 17;
	 w_size: natural := 12
);
port (
	y_re: in std_logic_vector(b_size downto 0);
	y_im: in std_logic_vector(b_size downto 0);
...

 

наверное должно было быть

 

entity complex_multiplier is
generic (b_size: natural := 17;
	 w_size: natural := 12
);
port (
	y_re: in std_logic_vector(b_size-1 downto 0);
	y_im: in std_logic_vector(b_size-1 downto 0);
...

 

Присланное закрывает пункт 2, а что с пунктом 1 ? Где блок умножителей согласно блоксхеме?

Share this post


Link to post
Share on other sites
вроде умножает=))

 

Я Вас попрошу серьезнее относиться к результатам симуляции. Ни черта он у Вас не умножает.

 

Результат должен был быть 58593 + j 0, а у Вас в 2 раза меньше.

 

Вопрос на засыпку - Вы уже на нем засыпались :), но теперь, надеюсь, ответите правильно:

 

Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k?

Share this post


Link to post
Share on other sites
Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k?

 

n+k

 

Вот, теперь выдает то, что нужно...

Блок умножителей я так понимаю лучше сделать компонентами...

 

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

complex_multiplier.rar

block_multipliers.rar

Share this post


Link to post
Share on other sites

По-моему что для знаковых, что для беззнаковых произведение будет размерности n+k, только для знаковых старшие два разряда знаковые. Если вы это имеете ввиду, то можно сказать, что для знаковых размерность будет n + k -1.

Share this post


Link to post
Share on other sites
только для знаковых старшие два разряда знаковые

 

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

 

Формат числа с разрядами от X(0) до X(n-1) включительно в дополнительном коде такой

 

(-(2^(n-1))*X(n-1) + (2^(n-2))*X(n-2) + ... (2^1)*X(1) + (2^0)*X(0).

 

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

 

И "расширение знаком" это очень условное название - это не значит, что после расширения знаком у Вас в числе стало n знаковых разрядов :)

 

Если следовать вашей логике, то формат результата умножения 2-х знаковых чисел получается такой

 

(-(2^(n+k-1)))*X(n+k-1) - (2^(n+k-2))*X(n+k-2) + ... (2^1)*X(1) + (2^0)*X(0). Надеюсь очевидно, к чему это приведет :)

 

 

 

 

Опишите, пожалуйста, математическим выражением то, что делают ваши умножители. Попробуйте подставить в эту формулу значение, которое Вы выбрали в качестве 1.0 (т.е. 2047) и проанализируйте, что же получается не совсем честно и какую интерпретацию это имеет с точки зрения БПФ?

Edited by Sefo

Share this post


Link to post
Share on other sites

Честно говоря я не совсем понял, в дополнительном коде для числа с разрядностью n:

 

модуль числа:

(2^(n-2))*X(n-2) + (2^(n-3))*X(n-3) + ... +(2^1)*X(1) + (2^0)*X(0);

 

X(n-1) - знаковый разряд;

 

знак числа:

0 - если число положительное;

1- если число отрицательное.

 

Кроме того для отрицательных чисел все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

 

Расширение знаком предполагает, знак представляют два разряда, например расширим число на один знаковый разряд, тогда разрядность увеличивается на 1 и становится n+1:

 

X(n) и X(n-1) - знаковые разряды;

 

знак числа:

00 - если число положительное;

11- если число отрицательное.

Для отрицательных чисел все остается по-прежнему: все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

Edited by ZED

Share this post


Link to post
Share on other sites
Sefo

 

Как Вы думаете, какое 12-ти разрядное число лучше поставить в соответствовие -1.0 и какое в соответствие +1.0

 

ZED

 

1.0 это 2047

 

-1.0 это -2047

 

Сорри, я всю ветку не читал, но это место бросилось в глаза. Диапазон -1 ... +1 представить нельзя. Можно представить только -1 ... (1-1LSB).

-1 = 0x800

0 = 0

(1-1LSB) = 0x7FF

Share this post


Link to post
Share on other sites
Сорри, я всю ветку не читал, но это место бросилось в глаза. Диапазон -1 ... +1 представить нельзя. Можно представить только -1 ... (1-1LSB).

-1 = 0x800

0 = 0

(1-1LSB) = 0x7FF

 

Тут Вы не правы. Если Вы берете 12-ти разрядное знаковое число, то Вы не сможете в -1...1 представить как -2048 ... +2048 т.к. у знакового 12-ти разрядного числа диапазон значений -2048 ... 2047, но Вам совершенно никто не мешает принять за -1 -2047, а за +1 +2047. Равно как и представить -1 ... +1 диапазоном -2000 ... +2000. Такой выбор имеет некоторые "неудобства", но он ничему не противоречит. (про неудобства мы поговорим позже - я бы предпочел, чтобы ZED сам их увидел). Вас никто не обязывает использовать весь диапазон значений 12-ти разрядного числа для представления диапазона от -1.0 до +1.0.

 

модуль числа:

(2^(n-2))*X(n-2) + (2^(n-3))*X(n-3) + ... +(2^1)*X(1) + (2^0)*X(0);

 

X(n-1) - знаковый разряд;

 

знак числа:

0 - если число положительное;

1- если число отрицательное.

 

Кроме того для отрицательных чисел все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

 

Расширение знаком предполагает, знак представляют два разряда ...

 

:( Да... Вы меня не на шутку огорчили... Придется с дополнительным кодом, да и вообще со способами представления чисел разобраться.

 

Пока почитайте вот это http://en.wikipedia.org/wiki/Two's_complement (только именно эту статью на английском - аналогичная на русском языке полная фигня) Вечером постараюсь прокомментировать все ваши заблуждения относительно двух знаковых разрядов и пр.

 

Любопытно стало где Вы учитесь и на какую специальность?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this