des00 25 13 ноября, 2009 Опубликовано 13 ноября, 2009 · Жалоба Это наверное, лучший вариант, IMHO. Может знающие поправят... ИМХО лучший вариант это взять фильтр порядка этак 128 го и потратить дня 2/3 на его описание всеми способами которые придумаете. Тогда точно будете знать с чем едят фиры на фпга по ресурсу, скорости и т.д. Высшей магии тут нет, формула свертки фира всегда одна и таже, разные только реализации %) потом на написание фира с нуля будет уходить минут 5 и никакие генераторы не будут нужны %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Костян 0 13 ноября, 2009 Опубликовано 13 ноября, 2009 · Жалоба Прочитал. Там описывается возможность реализации фильтра через Матлдаб Simulink. Но для этого требуется пакет с библиотекой Xilinx blockset Не подскажете где ее можно взять. Нужна ли лицензия? У меня Матлаб 7.01 фтопку.... испоганит пол кристалла .... проше и правильнее написать ручками код , а не блочками в симулинке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aser 0 14 ноября, 2009 Опубликовано 14 ноября, 2009 · Жалоба В АctiveHDL тоже встроен КИХ-генератор - выдает модели на VHDL, которые хорошо синтезируются. Хотя и без умножителей, но тактовая частота - очень высокая. Здесь его описание http://kanyevsky.kpi.ua/VHDLlabenglish/szcz01fir.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzis 0 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Ох уж эти начинающие разработчики, класса "Лентяй". Не желают даже книжку открыть и немного подумать. Да еще и придумывают, что то что надо сделать, должно быть сложнее чем они могут найти в примерах. Уж что может быть проще library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity Basic_FIR_Primitives is generic (Order : integer := 32; CoefSize : integer :=16; DataSize : integer := 16); port( CLK : in STD_LOGIC; Ce : in STD_LOGIC; D : in STD_LOGIC_VECTOR(DataSize-1 downto 0); Q : out STD_LOGIC_vector(47 downto 0) ); end Basic_FIR_Primitives; --}} End of automatically maintained section architecture behavioural of Basic_FIR_Primitives is type Coefs_type is array(integer range <>) of std_logic_vector(CoefSize-1 downto 0); signal Int_Coefs : Coefs_type(0 to Order-1); type Pipe_Type is array(integer range <>) of std_logic_vector(DataSize-1 downto 0); signal PipeLine : Pipe_Type(0 to Order*2-1); type MultResType is array(integer range <>) of std_logic_vector(CoefSize+DataSize-1 downto 0); signal MultRes : MultResType(0 to Order-1); type integer_vector is array (integer range<>) of integer; constant Coefs : integer_vector(0 to ORDER-1) := (-23, -92 , -141, -84, 117, 379, 501, 270, -348, -1084, -1405, -767, 1046, 3693, 6336, 7987, 7987, 6336, 3693, 1046, -767, -1405, -1084, -348, 270, 501, 379, 117, -84, -141, -92, -23); type slv48_array : is array (integer range<>) of std_logic_vector(47 downto 0); signal AddRes : slv48_array(0 to Order-1); begin process (CLK) begin if (CLK'Event and CLK = '1') then if (Ce = '1') then for a in 0 to order-1 loop Int_Coefs(a)<=conv_std_logic_vector(Coefs(a),CoefSize); end loop; for a in 1 to order*2-1 loop PipeLine(a)<=PipeLine(a-1); end loop; PipeLine(0)<=D; for a in 0 to order-1 loop MultRes(a)<=signed(PipeLine(a*2+1)) * signed(Int_Coefs(a)); end loop; AddRes(0)<=sxt(MultRes(0),48); for a in 1 to order-1 loop AddRes(a)<=signed(MultRes(a)) + signed(AddRes(a-1)); end loop; end if; end if; end process; Q<=AddRes(order-1); end behavioural; Фильтр заточен под архитектуру Xilinx с использованием DSP48. Но прекрасно ложится и в плисы где таковые отстутствуют. Единственное, в этом случае следует уменьшить разрядность сумматоров до необходимой, дабы не кушать лишних ресурсов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Спасибо. Работаем с Altera and Xilinx. Поэтому без разницы. Похоже оптимальнее идти в сторону Xilinx Mathlab/Simulink. Они формируют читаемый код на VHDL (если я правильно понял) А это мне и надо. Нашел System Generator for DSP 8.1 Service Pack 1 Release Date: 4/14/2006 Вот только придется разобраться с какой версией ISE он правильно работает и что нужно для его правильной работы (деньги или пилюля), а также какая нужна версия Mathlab/Simulink. Synplicity когда то пользовался но всеравно возвратился к ISE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Похоже оптимальнее идти в сторону Xilinx Mathlab/Simulink. Они формируют читаемый код на VHDL (если я правильно понял) А это мне и надо. вам шашечки или ехать ? давно бы уже разобрались в вопросе. Как уже говорил все схемы фиров работают на основе уравнения свертки, при любой структуре фильтра вы вычисляете именно ее. Остальное всего лишь вопросы производительности/ресурса/латентности. Все это легко решается на уровне логики здравого смысла. В качестве отправной точки возьмите фильтр Михаил_K . Вот шаги вашего исследования : 1. Положите что тактовая/символьная = 1. Соберите фильтр Михаил_K и сделайте его фильтр в лоб, сравните размеры/призводительность. Затем переведите фильтр с дсп слайсов на обычную логику, опять сравните. 2. Оптимизируйте фильтр, уменьшите количество умножений (в данном случае это можно сделать), сравните результат. 3. Оптимизируйте фильтр, уменьшите количество используемых регистров (это тоже можно сделать если инвертировать фильтр), сравните результат. 4. положите что тактовая/символьная = 8. Переведите фир на использование МАС ячеек и дерева сумматоров, сравните результат 5. Оптимизируйте фильтр, замените дерево сумматоров на цепь сумматоров, сравните результат. 6. Оптимизируйте фильтр, уменьшите количество логики за счет блочной/распределенной памяти, сравните результат. 7. И последнее положите тактовая/символьная переменная и/или неравномерная (в модемах с цифровой петлей по тактовой сплошь и рядом) и сравните результаты. Вся оптимизация лежит на виду, надо только немного подумать и поработать. После этого тему "FIR для чайников" можно закрывать. Удачи !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Да, уяснил. Путь примерно понятен. Попробую разобраться. Если не сложно подскажите please одну из ошибку в коде от Михаил_K Компилятор (Quartus 5) выдает. Error: VHDL syntax error at Basic_FIR_Primitives.vhd(38) near text "Coefs"; expecting "begin", or a declaration statement, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzis 0 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Исправил в коде. Неужели сам не смог поправить? Может стоит начать с изучения VHDL? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Исправил в коде. Неужели сам не смог поправить? Может стоит начать с изучения VHDL? Спасибо. Мог. Как то заклинило.. Там где constant Coefs : integer_vector(0 to ORDER-1) = еще constant Coefs : integer_vector(0 to ORDER-1) := Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 16 ноября, 2009 Опубликовано 16 ноября, 2009 · Жалоба Спасибо. Мог. Как то заклинило.. Там где constant Coefs : integer_vector(0 to ORDER-1) = еще constant Coefs : integer_vector(0 to ORDER-1) := А еще строчечку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Всем Спасибо. Логику работы (по представленному коду) более менее уяснил. Почему там дерево сумматоров, а не общий сумматор? Наверное так выгоднее по ресурсам. По пунктам оптимизации. Если, что не так прошу поправить. 2. Количество умножителей определяется количеством коэффициентов (констант). Количество констант - 1 это порядок. Порядок определяется задачей. 3. Инвертировать фильтр. Не совсем понятно, что это. 4. Что такое МАС ячейки? 5. Дерево сумматоров на цепь сумматоров. Это попробую.. Главный вопрос. Как получить коэффициенты в виде -23, -92 , -141, -84, 117, 379, 501, 270, -348...? Матлаб формирует -7.8594357282846056E-002; 2.8705948408687953E-001; ... Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Почему там дерево сумматоров, а не общий сумматор? Наверное так выгоднее по ресурсам. сделайте общий, отсинтезируйте, сравните ресурсы, времянку, задержку фильтра. спросить ответ легче, но лучше получить его самому %) 2. Количество умножителей определяется количеством коэффициентов (констант). Количество констант - 1 это порядок. Порядок определяется задачей. от фильтра зависит, иногда можно и почикать кол-во умножителей (как в примере Михаил_K), естественно заплатив за это свою цену. 3. Инвертировать фильтр. Не совсем понятно, что это. если бы вы шли по пути изучения фиров что я указал, то в процессе оптимизации фира (уменьшения ресурса) вы бы поняли что это значит. 4. Что такое МАС ячейки? ну это уже совсем по ламерски, можно было и у гугла спросить. Multiply Accumulate Главный вопрос. Как получить коэффициенты в виде -23, -92 , -141, -84, 117, 379, 501, 270, -348...? Матлаб формирует -7.8594357282846056E-002; 2.8705948408687953E-001; ... ну это же элементарно %) http://electronix.ru/forum/index.php?showtopic=69036 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба С коэффициентами прояснилось. MAC - это встроенные умножители (если я правильно понял). Не во всех FPGA они есть, но выход думаю найдется. Спасибо. Уже легче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба MAC - это встроенные умножители (если я правильно понял). Не во всех FPGA они есть, но выход думаю найдется. MAC это умножитель с выходным аккумулятором. И совсем не обязательно делать MAC ячейку на аппаратном умножителе, можно на логике или на памяти.... Все зависит от условий и требований. Если вы до конца пройдете путь что я описал и нигде не схалявите, вы поймете где и когда имеет смысл использовать то или иное. Желаю удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба У меня другой вопрос, написал фильтр на verilog. Регистр сдвига сделан на двухпортовой памяти, коэффициенты так же хранятся в двухпортовой памяти. Количество коэффициентов, TAPS = 120. Входные данные и коэффициенты имеют разрядность = 32. Какую разрядность должен иметь MAC? И как правильно сделать усечение для получения 32 битного результата на выходе. P.S. Максимальная разрядность MAC расчитывается (разр. коэфф. + разрядность входа) + log2(TAPS) ??? У меня сделано так, на выход подаю старшие 32 бита MAC. В итоге имею на выходе фильтра дрейфующую в небольших пределах постоянку. Как победить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться