Jump to content
    

Библиотека MATH_COMPLEX.all и FFT на VHDL

да он и с - работает, вы просто поглядите у вас наверняка констраин на клок не сходиться.

 

схема берет 4 операнда

по парно подает их на суматоры, выходы с них на умножители, а выходы с них на сумматор.

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

Share this post


Link to post
Share on other sites

да он и с - работает, вы просто поглядите у вас наверняка констраин на клок не сходиться.

 

схема берет 4 операнда

по парно подает их на суматоры, выходы с них на умножители, а выходы с них на сумматор.

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

Кажется разобрался. Все должно работать. Просто функция resize беря младшие биты всегда выдаст 0, если 1 (еденицы) в результате стоят выше 16 бит. Например выражение (1024 - (-1024)*1024) тоесть типа (a_im_in - b_im_in)*w_im даст 2097152 - 1000000000000000000000 после resize даст 0.

В этом случае незнаю как правильно поступиь. Даже если все операции делать в максимальной размерности всеравно результат привести к нрмальной размерности с помощью resize не удастся.

Посоветуйте please чего нибудь. В смысле как привести результат из большой размерности (например 28 бит) в 16 бит не потеряв информацию?

Share this post


Link to post
Share on other sites

не потеряв информацию только архивированием%), но это вам не подходит...

 

Внимание вопрос, а почему вы вообще берете младшие биты? Это же в корне не правильно!

 

 

Вам знакома математика с фиксированной точкой? Вам надо переходит на нее, и нормировать результаты на каждом шаге. Отбрасывая младшие разряды, вы будете фактически округлять результат. Внимательно следя за рязрядностью можно обеспечить приемлемую точность вычислений не раздувая битность. Обеспечить 100% точность без раздувания разрядности в разы невозможно!

 

 

Share this post


Link to post
Share on other sites

Вам знакома математика с фиксированной точкой? Вам надо переходит на нее, и нормировать результаты на каждом шаге. Отбрасывая младшие разряды, вы будете фактически округлять результат. Внимательно следя за рязрядностью можно обеспечить приемлемую точность вычислений не раздувая битность. Обеспечить 100% точность без раздувания разрядности в разы невозможно!

Нормировать это как?

Взять старшие биты не проблема. Но это будет грубовато.

Share this post


Link to post
Share on other sites

ну нет...

 

есть же масса вариантов.

 

к примеру

бинарный код

4*4 = 16;

b100 * b100 == b10000 = b1 * 2^4 = 1 * 2^b100 -> 1 бит на число, и 3 бита на порядок = 4 бита

а в исходном варианте 3 бита + 3 бита = 5 бит, а в общем случае 6 бит.

 

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

 

Брать старшую часть - грубо, но более правильно, главное учитывать сколько нулей вы отбросили, чтобы при сложении порядки были выровнены.

 

Это общая теория, а в частности БПФ так:

 

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

 

 

напишите реальные значения коэффициентов.

 

Share this post


Link to post
Share on other sites

Нормировать это как?

Взять старшие биты не проблема. Но это будет грубовато.

 

Любопытно, а как по вашему мнению resize должна была решить эту "проблему"? Ведь все равно, к примеру, 32-х битный результат вы собирались с помощью resize "привести" к 16-ти битному.

Share this post


Link to post
Share on other sites

напишите реальные значения коэффициентов.

Где-то так:

    -- поворачивающие множители
    -- round(cos(2*pi*n/8)*1024)
    -- round(sin(2*pi*n/8)*1024)
    -- n = 0...3
    -- реал
    constant c_w_r_8_0  : integer := 1024;    
    constant c_w_r_8_1  : integer := 724;    
    constant c_w_r_8_2  : integer := 0;    
    constant c_w_r_8_3  : integer := -724;    
    -- мним
    constant c_w_i_8_0  : integer := 0;    
    constant c_w_i_8_1  : integer := -724;    
    constant c_w_i_8_2  : integer := -1024;    
    constant c_w_i_8_3  : integer := -724;

12 бит на кэффициенты 16 бит на данные (хотя наверняка можно тоже 12).

Отсюда точность не более 12 бит

Edited by Acvarif

Share this post


Link to post
Share on other sites

ох.... ну вот это что такое?

round(cos(2*pi*n/8)*1024), какая математическая теория времен Фурье могла привести к появлению множителя 2 в 10?

 

это не что иное как число с фиксированной точкой

 

косинус меняется от -1 до +1, но как представить в целых 0.5? домножили на 1024, получили 512, но после произведения всех операций надо бы для возврата точности обратно разделить на 1024.

 

и того ваш коэффициент

1 бит - знак

1 бит - число

10 бит - десятичные разряды

 

12.10

 

данные у вас 16 бит, 1 бит знак, 15 бит данные,

сумма таких чисел может увеличиться максимум на 1 бит, то есть 1 бит знак, 16 бит данные.

перемножая с 12.10 мы получаем числа вида

 

1 бит знак 17 бит данные, 10 бит десятичные разряды

28.10

 

сумма чисел такого размера не больше чем на 1 разряд большего слагаемого, то есть 29.10

 

то есть после произведения вы получаете результат с 1 знаком, 28 битами данных, и 10 битами после запятой, чтобы получить реальный результат, вам надо сдвинуть его на 10 бит, и получить 18 бит данных, и 1 бит знак.

 

вот, значит после того как вы сделаете все ваши операции вам надо брать не 16 младших, и не 16 старших, а 19 средних разрядов, сдвинутых на 10, но так вы выбросите все десятичные разряды, а дотянув данные в таком виде до конца, получите неплохую точность.

 

ну и опять же перемножая числа вида

29.10, вы будите получать числа вида 57.20, то есть десятичная часть тоже растет, и вот такого рода перемножения надо нормировать обратно, откидывая 10 бит, и правильно их округляя

Share this post


Link to post
Share on other sites

... это не что иное как число с фиксированной точкой...

Спасибо за пояснение. Примерно так и сделал. Все получилось. На вычисление БПФ8 понадобилось всего 9 тактов.

Код с диаграммой тут http://dfiles.ru/files/c4oqsy1b5. Может кому будет интересно. Думаю на базе кода вполне можно сворганить универсальный БПФ на любое разумное количество точек по потоковой схеме http://dsp-book.narod.ru/RG10.pdf Конечно же потоковый алгоритм довольно ресурсоемкий но применив разного рода оптимизации (уменьшение количества умножителей в бабочке, например как здесь http://eee.guc.edu.eg/Courses/Electronics/...M%20systems.pdf и т.п.) можно уменьшать ресурсы.

Edited by Acvarif

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Вы бредите. Больше комментариев не будет.

Возможно, я же не Бог чтобы знать все. Зря стесняетесь комментариев, скажите что не прав, объясните и всем будет лучше.

 

 

Возможно я не правильно выразился, и хотел сказать только что если взять схему сумматора, то для вычитания надо операнд перевести в доп код, и потому если у вас есть A, которую вы и складываете и вычитаете одновременно, вам понадобиться 2 схемы и одна из них, та что вычитает будет работать подольше.

 

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

 

Простите за нанесенный вам удар мои незнанием;)

Share this post


Link to post
Share on other sites

Возможно, я же не Бог чтобы знать все. Зря стесняетесь комментариев, скажите что не прав, объясните и всем будет лучше.

А зачем объяснять, просто просматривайте иногда technology map, чтобы посмотреть, во что синтезировалась ваша программа и как это работает, и вопросов не будет. Да, в FPGA сложение и вычитание занимает одинаковое время.

Share this post


Link to post
Share on other sites

Ради уменьшения объема fft пытаюсь коэффициенты и входной поток данных разместить в RAM. Для коэффициентов применил простую RAM с файлом инициализации

entity fft_koef is
    generic 
    (
        DATA_WIDTH : integer := 12;
        ADDR_WIDTH : integer := 4
    );

    port 
    (
        clk        : in std_logic;
        addr    : in std_logic_vector (0 to ADDR_WIDTH - 1);
        q_re    : out std_logic_vector((DATA_WIDTH -1) downto 0)
    );

end fft_koef;

architecture behavioral of fft_koef is

    subtype word_re is signed((DATA_WIDTH-1) downto 0);
    type memory_re is array(2**ADDR_WIDTH-1 downto 0) of word_re;

    signal rom_re : memory_re;

    attribute ram_init_file : string;
    attribute ram_init_file of rom_re :

    signal is "Re.mif";


begin

    process(clk)
    begin
    if(rising_edge(clk)) then
        q_re <= rom_re(conv_integer(addr));
    end if;

end process;

end architecture behavioral;

Прблема возникла при формировании файла инициализации Re.mif - он не позволяет в себя писать цифры со знаком. Только unsigned decimal. Как можно изменить это свойство и редактировать объем файла?

Edited by Acvarif

Share this post


Link to post
Share on other sites

мне просто интересно, а вы написали модуль работы с цифрами со знаком? Как вы их использовать то будите?

 

самый простой способ если вы хотите иметь целую и дробную часть, писать их в 2 числа с пробелом.

12.34 = 12 34. Точка - это условность

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.

×
×
  • Create New...