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

Некорректное присваивание выходному порту

Здравствуйте.

 

Проблема представлена на картинке. На выход данные идут с 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;

post-92633-1480405854_thumb.png

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


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

Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это.

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


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

Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это.

Точно. Оказалось, что я сбрасывал в ноль эти сигналы и на топ уровне, и в самом фильтре (имеется в виду сбрасывал по reset'у) и так как раньше с таким не сталкивался, то даже и не подумал о таком варианте. Спасибо!

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


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

Народ, подскажите!

Как сделать в месте объявления сигналов выбор разрядности счетчика после 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В

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


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

В лоб - написать функцию максимума из двух величин. Или использовать 2008-й VHDL, там она, если не ошибаюсь, по умолчанию есть.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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