Golikov 0 February 12, 2014 Posted February 12, 2014 · Report post да он и с - работает, вы просто поглядите у вас наверняка констраин на клок не сходиться. схема берет 4 операнда по парно подает их на суматоры, выходы с них на умножители, а выходы с них на сумматор. Результат на каждом элементе появляется не сразу после падания операндов а через некоторое время, и в результате выше длинное выражение просто не успевает сформироваться к вашему очередному клоку. При этом не забывайте что операция вычитания требует еще перевода в доп код, то есть дополнительных действий, что опять же увеличивает время появления ответа, а также биты переноса.... Quote Share this post Link to post Share on other sites More sharing options...
acvarif 0 February 12, 2014 Posted February 12, 2014 · Report post да он и с - работает, вы просто поглядите у вас наверняка констраин на клок не сходиться. схема берет 4 операнда по парно подает их на суматоры, выходы с них на умножители, а выходы с них на сумматор. Результат на каждом элементе появляется не сразу после падания операндов а через некоторое время, и в результате выше длинное выражение просто не успевает сформироваться к вашему очередному клоку. При этом не забывайте что операция вычитания требует еще перевода в доп код, то есть дополнительных действий, что опять же увеличивает время появления ответа, а также биты переноса.... Кажется разобрался. Все должно работать. Просто функция resize беря младшие биты всегда выдаст 0, если 1 (еденицы) в результате стоят выше 16 бит. Например выражение (1024 - (-1024)*1024) тоесть типа (a_im_in - b_im_in)*w_im даст 2097152 - 1000000000000000000000 после resize даст 0. В этом случае незнаю как правильно поступиь. Даже если все операции делать в максимальной размерности всеравно результат привести к нрмальной размерности с помощью resize не удастся. Посоветуйте please чего нибудь. В смысле как привести результат из большой размерности (например 28 бит) в 16 бит не потеряв информацию? Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 12, 2014 Posted February 12, 2014 · Report post не потеряв информацию только архивированием%), но это вам не подходит... Внимание вопрос, а почему вы вообще берете младшие биты? Это же в корне не правильно! Вам знакома математика с фиксированной точкой? Вам надо переходит на нее, и нормировать результаты на каждом шаге. Отбрасывая младшие разряды, вы будете фактически округлять результат. Внимательно следя за рязрядностью можно обеспечить приемлемую точность вычислений не раздувая битность. Обеспечить 100% точность без раздувания разрядности в разы невозможно! Quote Share this post Link to post Share on other sites More sharing options...
acvarif 0 February 12, 2014 Posted February 12, 2014 · Report post Вам знакома математика с фиксированной точкой? Вам надо переходит на нее, и нормировать результаты на каждом шаге. Отбрасывая младшие разряды, вы будете фактически округлять результат. Внимательно следя за рязрядностью можно обеспечить приемлемую точность вычислений не раздувая битность. Обеспечить 100% точность без раздувания разрядности в разы невозможно! Нормировать это как? Взять старшие биты не проблема. Но это будет грубовато. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 12, 2014 Posted February 12, 2014 · Report post ну нет... есть же масса вариантов. к примеру бинарный код 4*4 = 16; b100 * b100 == b10000 = b1 * 2^4 = 1 * 2^b100 -> 1 бит на число, и 3 бита на порядок = 4 бита а в исходном варианте 3 бита + 3 бита = 5 бит, а в общем случае 6 бит. то есть можно выносить порядок. Потом можно определить допустимую точность на каждом шаге, младшие биты нулить, это будет позволять увеличивать порядок. Брать старшую часть - грубо, но более правильно, главное учитывать сколько нулей вы отбросили, чтобы при сложении порядки были выровнены. Это общая теория, а в частности БПФ так: коэффициенты там не больше единицы, потому разрядность не должна расти, берут несколько доп битов для увеличения точности, и все, все остальное откидывают сохраняя разрядность. напишите реальные значения коэффициентов. Quote Share this post Link to post Share on other sites More sharing options...
Sefo 0 February 12, 2014 Posted February 12, 2014 · Report post Нормировать это как? Взять старшие биты не проблема. Но это будет грубовато. Любопытно, а как по вашему мнению resize должна была решить эту "проблему"? Ведь все равно, к примеру, 32-х битный результат вы собирались с помощью resize "привести" к 16-ти битному. Quote Share this post Link to post Share on other sites More sharing options...
acvarif 0 February 12, 2014 Posted February 12, 2014 (edited) · Report post напишите реальные значения коэффициентов. Где-то так: -- поворачивающие множители -- 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 February 12, 2014 by Acvarif Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 12, 2014 Posted February 12, 2014 · Report post ох.... ну вот это что такое? 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 бит, и правильно их округляя Quote Share this post Link to post Share on other sites More sharing options...
acvarif 0 February 13, 2014 Posted February 13, 2014 (edited) · Report post ... это не что иное как число с фиксированной точкой... Спасибо за пояснение. Примерно так и сделал. Все получилось. На вычисление БПФ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 February 13, 2014 by Acvarif Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 23 February 14, 2014 Posted February 14, 2014 · Report post При этом не забывайте что операция вычитания требует еще перевода в доп код, то есть дополнительных действий, что опять же увеличивает время появления ответа, а также биты переноса....Вы бредите. Больше комментариев не будет. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 14, 2014 Posted February 14, 2014 · Report post Вы бредите. Больше комментариев не будет. Возможно, я же не Бог чтобы знать все. Зря стесняетесь комментариев, скажите что не прав, объясните и всем будет лучше. Возможно я не правильно выразился, и хотел сказать только что если взять схему сумматора, то для вычитания надо операнд перевести в доп код, и потому если у вас есть A, которую вы и складываете и вычитаете одновременно, вам понадобиться 2 схемы и одна из них, та что вычитает будет работать подольше. Я могу быть не прав, поправьте, но в любом случае выражение с огромным количеством действий рассчитывается долго, и может не смочь сделать это за 1 такт, даже если каждый из модулей в этом выражении делает это за 1 так. Только и всего что хотел сказать. Простите за нанесенный вам удар мои незнанием;) Quote Share this post Link to post Share on other sites More sharing options...
Timmy 1 February 14, 2014 Posted February 14, 2014 · Report post Возможно, я же не Бог чтобы знать все. Зря стесняетесь комментариев, скажите что не прав, объясните и всем будет лучше. А зачем объяснять, просто просматривайте иногда technology map, чтобы посмотреть, во что синтезировалась ваша программа и как это работает, и вопросов не будет. Да, в FPGA сложение и вычитание занимает одинаковое время. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 14, 2014 Posted February 14, 2014 · Report post я же не ТС, у меня и схемы нет которую смотреть)... когда буду такое делать, посмотрю. Quote Share this post Link to post Share on other sites More sharing options...
acvarif 0 February 21, 2014 Posted February 21, 2014 (edited) · Report post Ради уменьшения объема 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 February 21, 2014 by Acvarif Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 February 21, 2014 Posted February 21, 2014 · Report post мне просто интересно, а вы написали модуль работы с цифрами со знаком? Как вы их использовать то будите? самый простой способ если вы хотите иметь целую и дробную часть, писать их в 2 числа с пробелом. 12.34 = 12 34. Точка - это условность Quote Share this post Link to post Share on other sites More sharing options...