Перейти к содержанию
    

Реализация КИХ фильтра VHDL

Это наверное, лучший вариант, IMHO.

Может знающие поправят...

 

ИМХО лучший вариант это взять фильтр порядка этак 128 го и потратить дня 2/3 на его описание всеми способами которые придумаете. Тогда точно будете знать с чем едят фиры на фпга по ресурсу, скорости и т.д. Высшей магии тут нет, формула свертки фира всегда одна и таже, разные только реализации %)

 

потом на написание фира с нуля будет уходить минут 5 и никакие генераторы не будут нужны %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитал. Там описывается возможность реализации фильтра через Матлдаб Simulink.

Но для этого требуется пакет с библиотекой Xilinx blockset

 

Не подскажете где ее можно взять. Нужна ли лицензия?

У меня Матлаб 7.01

фтопку.... испоганит пол кристалла ....

 

проше и правильнее написать ручками код , а не блочками в симулинке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В АctiveHDL тоже встроен КИХ-генератор - выдает модели на VHDL, которые хорошо синтезируются.

Хотя и без умножителей, но тактовая частота - очень высокая.

Здесь его описание http://kanyevsky.kpi.ua/VHDLlabenglish/szcz01fir.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ох уж эти начинающие разработчики, класса "Лентяй". Не желают даже книжку открыть и немного подумать.

Да еще и придумывают, что то что надо сделать, должно быть сложнее чем они могут найти в примерах.

Уж что может быть проще

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. Но прекрасно ложится и в плисы где таковые отстутствуют. Единственное, в этом случае следует уменьшить разрядность сумматоров до необходимой, дабы не кушать лишних ресурсов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

 

Работаем с 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже оптимальнее идти в сторону Xilinx Mathlab/Simulink.

Они формируют читаемый код на VHDL (если я правильно понял)

А это мне и надо.

 

вам шашечки или ехать ? давно бы уже разобрались в вопросе.

 

Как уже говорил все схемы фиров работают на основе уравнения свертки, при любой структуре фильтра вы вычисляете именно ее. Остальное всего лишь вопросы производительности/ресурса/латентности. Все это легко решается на уровне логики здравого смысла. В качестве отправной точки возьмите фильтр Михаил_K . Вот шаги вашего исследования :

1. Положите что тактовая/символьная = 1. Соберите фильтр Михаил_K и сделайте его фильтр в лоб, сравните размеры/призводительность. Затем переведите фильтр с дсп слайсов на обычную логику, опять сравните.

2. Оптимизируйте фильтр, уменьшите количество умножений (в данном случае это можно сделать), сравните результат.

3. Оптимизируйте фильтр, уменьшите количество используемых регистров (это тоже можно сделать если инвертировать фильтр), сравните результат.

4. положите что тактовая/символьная = 8. Переведите фир на использование МАС ячеек и дерева сумматоров, сравните результат

5. Оптимизируйте фильтр, замените дерево сумматоров на цепь сумматоров, сравните результат.

6. Оптимизируйте фильтр, уменьшите количество логики за счет блочной/распределенной памяти, сравните результат.

 

7. И последнее положите тактовая/символьная переменная и/или неравномерная (в модемах с цифровой петлей по тактовой сплошь и рядом) и сравните результаты.

 

Вся оптимизация лежит на виду, надо только немного подумать и поработать. После этого тему "FIR для чайников" можно закрывать. Удачи !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, уяснил. Путь примерно понятен. Попробую разобраться.

 

Если не сложно подскажите please одну из ошибку в коде от Михаил_K

 

Компилятор (Quartus 5) выдает.

 

Error: VHDL syntax error at Basic_FIR_Primitives.vhd(38) near text "Coefs"; expecting "begin", or a declaration statement,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил в коде. Неужели сам не смог поправить? Может стоит начать с изучения VHDL?

 

Спасибо.

Мог. Как то заклинило..

Там где constant Coefs : integer_vector(0 to ORDER-1) = еще constant Coefs : integer_vector(0 to ORDER-1) :=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Мог. Как то заклинило..

Там где constant Coefs : integer_vector(0 to ORDER-1) = еще constant Coefs : integer_vector(0 to ORDER-1) :=

 

А еще строчечку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем Спасибо.

Логику работы (по представленному коду) более менее уяснил. Почему там дерево сумматоров, а не общий сумматор? Наверное так выгоднее по ресурсам.

По пунктам оптимизации. Если, что не так прошу поправить.

2. Количество умножителей определяется количеством коэффициентов (констант). Количество констант - 1 это порядок. Порядок определяется задачей.

3. Инвертировать фильтр. Не совсем понятно, что это.

4. Что такое МАС ячейки?

5. Дерево сумматоров на цепь сумматоров. Это попробую..

 

Главный вопрос. Как получить коэффициенты в виде

-23, -92 , -141, -84, 117, 379, 501, 270, -348...?

Матлаб формирует

-7.8594357282846056E-002;

2.8705948408687953E-001; ...

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему там дерево сумматоров, а не общий сумматор? Наверное так выгоднее по ресурсам.

 

сделайте общий, отсинтезируйте, сравните ресурсы, времянку, задержку фильтра. спросить ответ легче, но лучше получить его самому %)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С коэффициентами прояснилось.

MAC - это встроенные умножители (если я правильно понял).

Не во всех FPGA они есть, но выход думаю найдется.

 

Спасибо. Уже легче.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

MAC - это встроенные умножители (если я правильно понял).

Не во всех FPGA они есть, но выход думаю найдется.

 

MAC это умножитель с выходным аккумулятором. И совсем не обязательно делать MAC ячейку на аппаратном умножителе, можно на логике или на памяти.... Все зависит от условий и требований. Если вы до конца пройдете путь что я описал и нигде не схалявите, вы поймете где и когда имеет смысл использовать то или иное. Желаю удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня другой вопрос, написал фильтр на verilog. Регистр сдвига сделан на двухпортовой памяти, коэффициенты так же хранятся в двухпортовой памяти.

Количество коэффициентов, TAPS = 120.

Входные данные и коэффициенты имеют разрядность = 32. Какую разрядность должен иметь MAC? И как правильно сделать усечение для получения 32 битного результата на выходе.

 

P.S. Максимальная разрядность MAC расчитывается (разр. коэфф. + разрядность входа) + log2(TAPS) ??? У меня сделано так, на выход подаю старшие 32 бита MAC. В итоге имею на выходе фильтра дрейфующую в небольших пределах постоянку. Как победить?

post-29246-1341989598_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...