|
FIR фильтр на VHDL с помощью fdatool, проблемы с быстродействием |
|
|
|
Jul 1 2013, 11:43
|

Участник

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

|
Цитата(_Anatoliy @ Jul 1 2013, 10:05)  Ключевое слово generate.Осваивайте. Не понимаю, как в той структуре можно использовать generate. Если вносить под процесс, то quartus ругается, что он ожидает loop, если процесс убрать, то проблема с объявлением переменных. К тому же, не понимаю, как тогда испрользовать rising_edge
|
|
|
|
|
Jul 1 2013, 11:49
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 1 2013, 12:10
|

Участник

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

|
Цитата(Maverick @ Jul 1 2013, 15:49)  или конкретней формулируйте вопросы... Речь идет об использовании generate, а не generic.
|
|
|
|
|
Jul 1 2013, 12: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 тут не нужен - на перемножитель клок подаётся.
|
|
|
|
|
Jul 2 2013, 04:53
|

Участник

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

|
Цитата(_Anatoliy @ Jul 1 2013, 17:11)  Я скрипт писал для этого.
Из FDA Tool делаете экспорт в WorkSpace и запускаете скрипт. Я свой почти доделал, но интересно будет ваш изучить, спасибо)
|
|
|
|
|
Jul 2 2013, 10:36
|

Участник

Группа: Участник
Сообщений: 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;
|
|
|
|
|
Jul 3 2013, 04:53
|

Участник

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

|
Цитата(_Anatoliy @ Jul 2 2013, 16:30)  Вникать сейчас времени нет.Навскидку - клок вы только на перемножители подали?Это не правильно. Да, только на перемножители. Но если сделать промежуточные регистры, быстродействие падает до 6 МГц (
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|