реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> FIR фильтр на VHDL с помощью fdatool, проблемы с быстродействием
_Anatoliy
сообщение Jul 1 2013, 06:05
Сообщение #16


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(mr.alexeevas @ Jul 1 2013, 05:35) *
Да, умножителей)
Думаю так и сделаю, но пока не получается подключить аппаратный умножитель, т.к. умножение происходит внутри цикла в вашем фильтре. Я новичок в этом деле, всего пару месяцев работаю с ПЛИС на VHDL.

Ключевое слово generate.Осваивайте.
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 1 2013, 11:43
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Цитата(_Anatoliy @ Jul 1 2013, 10:05) *
Ключевое слово generate.Осваивайте.

Не понимаю, как в той структуре можно использовать generate. Если вносить под процесс, то quartus ругается, что он ожидает loop, если процесс убрать, то проблема с объявлением переменных. К тому же, не понимаю, как тогда испрользовать rising_edge
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 1 2013, 11:49
Сообщение #18


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(mr.alexeevas @ Jul 1 2013, 14:43) *
Не понимаю, как в той структуре можно использовать generate. Если вносить под процесс, то quartus ругается, что он ожидает loop, если процесс убрать, то проблема с объявлением переменных. К тому же, не понимаю, как тогда испрользовать rising_edge

пример на основе компаратора
Количество разрядов сравниваемых данных (чисел) компаратора задается в GENERIC

Описание портов:
CLK – тактовая частота;
RESET − асинхронный сброс;
А, В – сравниваемые N-разрядные данные;
ALB, AGB, ALEB, AGEB, AEB, ANEB – результаты сравнения чисел А и В;
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity comp is
GENERIC(width: INTEGER:=3);
Port ( CLK: in STD_LOGIC;
RESET: in STD_LOGIC;
A, B: in STD_LOGIC_VECTOR(width downto 0);
ALB, AGB: out STD_LOGIC;
ALEB, AGEB: out STD_LOGIC;
AEB, ANEB: out STD_LOGIC );
end comp;

architecture Behavioral of comp is
begin
process(CLK,RESET)
begin
  if (RESET = '1') then
      ALB  <= '0';
      AGB  <= '0';
      ALEB <= '0';
      AGEB <= '0';
      AEB  <= '0';
      ANEB <= '0';
  elsif (CLK'event and CLK ='1') then  
    if ( A < B ) then ALB <= '1';
    else ALB <= '0';
    end if;
  if ( A > B ) then AGB <= '1';
    else AGB <= '0';
    end if;
  if ( A <= B ) then ALEB <= '1';
    else ALEB <= '0';
    end if;
  if ( A >= B ) then AGEB <= '1';
    else AGEB <= '0';
    end if;
  if ( A = B ) then AEB <= '1';
    else AEB <= '0';
    end if;
  if ( A /= B ) then ANEB <= '1';
    else ANEB <= '0';
    end if;  end if;
end process;

end Behavioral;


или конкретней формулируйте вопросы...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 1 2013, 12:10
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Цитата(Maverick @ Jul 1 2013, 15:49) *
или конкретней формулируйте вопросы...


Речь идет об использовании generate, а не generic.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 1 2013, 12:21
Сообщение #20


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(mr.alexeevas @ Jul 1 2013, 15:10) *
Речь идет об использовании generate, а не generic.

не внимательно прочитал...
вот тут ответ


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 1 2013, 12:21
Сообщение #21


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(mr.alexeevas @ Jul 1 2013, 13:43) *
Не понимаю, как в той структуре можно использовать generate. Если вносить под процесс, то quartus ругается, что он ожидает loop, если процесс убрать, то проблема с объявлением переменных. К тому же, не понимаю, как тогда испрользовать rising_edge

Код
BEGIN
m1 : for i in 0 to N-1 generate
mul: Dmull port map (
        clk => clk,
        a => std_logic_vector(SumA1a(i)),
        b => std_logic_vector(CoeffDiff(i)),
        p => SumA2V(i));
end generate m1;


Вот пример подключения умножителя для Xilinx.Объявляете его после BEGIN. N - количество умножителей.
rising_edge тут не нужен - на перемножитель клок подаётся.
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 1 2013, 12:51
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Спасибо, разобрался. Действительно, быстродействие в 250 МГц получается легко. Осталось разобраться, как сделать так, чтобы матлаб коэффициенты выдавал в приемлемом виде. bb-offtopic.gif
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 1 2013, 13:11
Сообщение #23


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(mr.alexeevas @ Jul 1 2013, 14:51) *
Спасибо, разобрался. Действительно, быстродействие в 250 МГц получается легко. Осталось разобраться, как сделать так, чтобы матлаб коэффициенты выдавал в приемлемом виде. bb-offtopic.gif

Я скрипт писал для этого.

Из FDA Tool делаете экспорт в WorkSpace и запускаете скрипт.
Прикрепленные файлы
Прикрепленный файл  ConvertCoeff2FilterFormII.rar ( 249 байт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 2 2013, 04:53
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Цитата(_Anatoliy @ Jul 1 2013, 17:11) *
Я скрипт писал для этого.

Из FDA Tool делаете экспорт в WorkSpace и запускаете скрипт.


Я свой почти доделал, но интересно будет ваш изучить, спасибо) a14.gif
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 2 2013, 10:36
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Цитата(_Anatoliy @ Jul 1 2013, 16:21) *
Код
BEGIN
m1 : for i in 0 to N-1 generate
mul: Dmull port map (
        clk => clk,
        a => std_logic_vector(SumA1a(i)),
        b => std_logic_vector(CoeffDiff(i)),
        p => SumA2V(i));
end generate m1;


Вот пример подключения умножителя для Xilinx.Объявляете его после BEGIN. N - количество умножителей.
rising_edge тут не нужен - на перемножитель клок подаётся.


Сделал фильтр, все компилится, стал проверять в симулинке АЧХ и вообще как фильтрует, а фильтр ничего не хочет делать. Выдает то, что поступает на вход. Ниже то, что наработал. Не пойму в чем ошибка.



Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE IEEE.numeric_std.ALL;
use work.FilterPak.all;

ENTITY FilterFormII IS
   PORT( clk                    :   IN    std_logic;
          clken            :   IN    std_logic;
            reset                    :   IN    std_logic;
         filter_in            :   IN    std_logic_vector(POW_IN-1 DOWNTO 0);
         filter_out            :   OUT   std_logic_vector(POW_OUT-1 DOWNTO 0)
         );

END;

ARCHITECTURE rtl OF FilterFormII IS
COMPONENT mult

    PORT
(      aclr        : IN STD_LOGIC;
        clken        : IN STD_LOGIC;    
        clock        : IN STD_LOGIC;
        dataa        : IN signed (9 DOWNTO 0);
        datab        : IN signed (15 DOWNTO 0);
        result    : OUT signed (25 DOWNTO 0)
    );
END COMPONENT;
    TYPE regmul_pipeline_type IS ARRAY (NATURAL range <>) OF signed(POW_IN+POW_COEFF-1 DOWNTO 0);
    TYPE regsum_pipeline_type IS ARRAY (NATURAL range <>) OF signed(POW_SUMM-1 DOWNTO 0);
    TYPE coeff_type IS ARRAY (NATURAL range <>) OF signed(POW_COEFF-1 DOWNTO 0);
    signal reg_mul : regmul_pipeline_type(N_COEFF-1 DOWNTO 0):= (OTHERS => (OTHERS => '0'));
    signal reg_sum : regsum_pipeline_type(FILTER_ORDER+1 DOWNTO 0):= (OTHERS => (OTHERS => '0'));
    signal input : signed(POW_IN-1 DOWNTO 0);


BEGIN

input <= signed(filter_in);


multiple:        for i in 0 to N_COEFF-2 generate
mult_inst: mult port map
         (aclr    => not reset ,
           clken    => clken,
            clock => clk,
            dataa => input,
            datab => coeff(i),
            result => reg_mul(i) );
            
    --        reg_mul(i) <= input * coeff(i);
            reg_sum(i) <= resize(reg_sum(i+1),POW_SUMM) + resize(reg_mul(i),POW_SUMM);
            reg_sum(FILTER_ORDER-i) <= resize(reg_sum(FILTER_ORDER+1-i),POW_SUMM) + resize(reg_mul(i),POW_SUMM);
        end generate;
        
b2v_inst : mult
  PORT MAP(clock => clk,
            clken    => clken,
            aclr    => not reset,
            dataa => input,
            datab => coeff(N_COEFF-1),
            result =>  reg_mul(N_COEFF-1)
         );
        
    --    reg_mul(N_COEFF-1) <= input * coeff(N_COEFF-1);
        reg_sum(N_COEFF-1) <= resize(reg_sum(N_COEFF),POW_SUMM) + resize(reg_mul(N_COEFF-1),POW_SUMM);

filter_out <=std_logic_vector( resize(reg_sum(0)(POW_SUMM-1 DOWNTO POW_POINT),POW_OUT));

END rtl;


Код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.std_logic_unsigned.all;
USE IEEE.numeric_std.ALL;

package FilterPak is
    constant POW_IN            : natural := 10;--разрядность входных данных
    constant POW_OUT         : natural := 10;--разрядность выходных данных
    constant POW_COEFF        : natural := 16;--разрядность коэффициентов
    constant POW_SUMM        : natural := 28;--разрядность сумматоров
    constant POW_POINT        : natural := 10;--позиция точки
    constant FILTER_ORDER    : natural := 64; --порядок фильтра чётный(общее число коэффициентов = FILTER_ORDER+1)
    constant N_COEFF         : natural := FILTER_ORDER/2+1;
    TYPE coeff_type IS ARRAY (NATURAL range <>) OF signed(POW_COEFF-1 DOWNTO 0);
    constant coeff             : coeff_type(0 TO N_COEFF-1) := (
to_signed(   -48, POW_COEFF),
to_signed(   -22, POW_COEFF),
to_signed(    80, POW_COEFF),
to_signed(   -22, POW_COEFF),
to_signed(   -98, POW_COEFF),
to_signed(    58, POW_COEFF),
to_signed(   134, POW_COEFF),
to_signed(  -140, POW_COEFF),
to_signed(  -134, POW_COEFF),
to_signed(   244, POW_COEFF),
to_signed(    98, POW_COEFF),
to_signed(  -370, POW_COEFF),
to_signed(     2, POW_COEFF),
to_signed(   494, POW_COEFF),
to_signed(  -180, POW_COEFF),
to_signed(  -588, POW_COEFF),
to_signed(   446, POW_COEFF),
to_signed(   610, POW_COEFF),
to_signed(  -800, POW_COEFF),
to_signed(  -510, POW_COEFF),
to_signed(  1228, POW_COEFF),
to_signed(   228, POW_COEFF),
to_signed( -1698, POW_COEFF),
to_signed(   310, POW_COEFF),
to_signed(  2176, POW_COEFF),
to_signed( -1226, POW_COEFF),
to_signed( -2612, POW_COEFF),
to_signed(  2806, POW_COEFF),
to_signed(  2966, POW_COEFF),
to_signed( -6086, POW_COEFF),
to_signed( -3194, POW_COEFF),
to_signed( 20562, POW_COEFF),
to_signed( 36042, POW_COEFF)

);
end package FilterPak;
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 2 2013, 12:30
Сообщение #26


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(mr.alexeevas @ Jul 2 2013, 11:36) *

Вникать сейчас времени нет.Навскидку - клок вы только на перемножители подали?Это не правильно.
Go to the top of the page
 
+Quote Post
mr.alexeevas
сообщение Jul 3 2013, 04:53
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668



Цитата(_Anatoliy @ Jul 2 2013, 16:30) *
Вникать сейчас времени нет.Навскидку - клок вы только на перемножители подали?Это не правильно.


Да, только на перемножители. Но если сделать промежуточные регистры, быстродействие падает до 6 МГц (
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016