sqrt(2) 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба Здравствуйте. Проблема представлена на картинке. На выход данные идут с add(50). Видно, что в этом самом add(50) данные хранятся как надо, без всяких X. Однако на выходе уже видим, что все,что не соответствует нулям выдается как X. add объявлен как signed, o_data как std_logic_vector. При этом размерности их не совпадают, поэтому на выход подаю add(50) усеченной раззрядности, округляя при этом: if add(coeffs_num-1)(10) = '1' then o_data <= std_logic_vector(add(coeffs_num-1)(30 downto 11) + 1); else o_data <= std_logic_vector(add(coeffs_num-1)(30 downto 11)); end if; Подозреваю, что дело именно в этом, но не могу понять в чем конкретно проблема и как её исправить. Весь код блока, на всякий случай: library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; entity fir_filter_quad is generic ( coeffs_width : integer := 16; din_width : integer := 20; coeffs_num : integer := 51; pipe_stages : integer := 3 ); port ( i_clk : in std_logic; i_arst : in std_logic; i_data : in std_logic_vector (9 downto 0); o_data : out std_logic_vector (19 downto 0) ); end fir_filter_quad; architecture arch of fir_filter_quad is type coeff_type is array (coeffs_num-1 downto 0) of signed (coeffs_width-1 downto 0); --память для хранения коэффициентов фильтра constant coeffs : coeff_type := ( x"0016", x"000c", x"ff6b", x"fdec", x"fc43", x"fc16", x"fe5e", x"01b7", x"02f7", x"0086", x"fcf0", x"fcc5", x"0118", x"050d", x"02ed", x"fbed", x"f89c", x"ff0b", x"094c", x"09a4", x"fb1c", x"ec52", x"f4b9", x"1bb9", x"4b96", x"6137", x"4b96", x"1bb9", x"f4b9", x"ec52", x"fb1c", x"09a4", x"094c", x"ff0b", x"f89c", x"fbed", x"02ed", x"050d", x"0118", x"fcc5", x"fcf0", x"0086", x"02f7", x"01b7", x"fe5e", x"fc16", x"fc43", x"fdec", x"ff6b", x"000c", x"0016" ); signal data_reg : signed (9 downto 0); --регистр для входных данных type pipe_type is array (pipe_stages-1 downto 0) of signed (9 downto 0); --тип данных конвейера signal pipe : pipe_type; type mult_type is array (coeffs_num-1 downto 0) of signed (25 downto 0); --тип данных для умножителей signal mult : mult_type; type add_type is array (coeffs_num-1 downto 0) of signed (30 downto 0); --тип данных для сумматоров signal add : add_type; constant ZERO : signed (30 downto 0) := (others=>'0'); begin process(i_clk, i_arst) begin if i_arst = '1' then data_reg <= (others=>'0'); o_data <= (others=>'0'); pipe <= (others=>(others=>'0')); mult <= (others=>(others=>'0')); add <= (others=>(others=>'0')); elsif rising_edge(i_clk) then data_reg <= signed(i_data); pipe <= pipe(pipe_stages-2 downto 0) & data_reg; for I in coeffs_num-1 downto 0 loop mult(I) <= pipe(pipe_stages-1) * coeffs(coeffs_num-1-I); if (I = 0) then add(I) <= ZERO + mult(0); else add(I) <= mult(I) + add(I-1); end if; end loop; if add(coeffs_num-1)(10) = '1' then o_data <= std_logic_vector(add(coeffs_num-1)(30 downto 11) + 1); else o_data <= std_logic_vector(add(coeffs_num-1)(30 downto 11)); end if; end if; end process; end arch; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sqrt(2) 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это. Точно. Оказалось, что я сбрасывал в ноль эти сигналы и на топ уровне, и в самом фильтре (имеется в виду сбрасывал по reset'у) и так как раньше с таким не сталкивался, то даже и не подумал о таком варианте. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 7 марта, 2017 Опубликовано 7 марта, 2017 · Жалоба Народ, подскажите! Как сделать в месте объявления сигналов выбор разрядности счетчика после architecture xxxxx_body , если он должен выбрать большее значение из двух параметров, описанных в GENERIC? Например. entity xxxxx_avt is generic( MARRAYA : integer := 64; -- memory MARRAYB : integer := 32; -- memory BUS_WIDTH : integer := 16 -- word width ); port ( ....... architecture xxxxx_body of xxxxx_avt is signal cnt_conv_s : STD_LOGIC_VECTOR (log2(MEMARRAY)-1 downto 0); где параметр MEMARRAY должен быть выбран наибольший из MARRAYA или MARRAYВ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KalashKS 0 7 марта, 2017 Опубликовано 7 марта, 2017 · Жалоба В лоб - написать функцию максимума из двух величин. Или использовать 2008-й VHDL, там она, если не ошибаюсь, по умолчанию есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться