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

 
 
 
Reply to this topicStart new topic
> Некорректное присваивание выходному порту
sqrt(2)
сообщение Nov 29 2016, 07:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 20-07-16
Пользователь №: 92 633



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

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

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Timmy
сообщение Nov 29 2016, 08:22
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 786
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это.
Go to the top of the page
 
+Quote Post
sqrt(2)
сообщение Nov 29 2016, 08:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 20-07-16
Пользователь №: 92 633



Цитата(Timmy @ Nov 29 2016, 11:22) *
Вероятно, к o_data снаружи ещё один драйвер с нулями подсоединен. В моделсиме есть команда просмотра всех драйверов сигнала, так что легко найти, что это.

Точно. Оказалось, что я сбрасывал в ноль эти сигналы и на топ уровне, и в самом фильтре (имеется в виду сбрасывал по reset'у) и так как раньше с таким не сталкивался, то даже и не подумал о таком варианте. Спасибо!
Go to the top of the page
 
+Quote Post
Мур
сообщение Mar 7 2017, 08:10
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 651
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Народ, подскажите!
Как сделать в месте объявления сигналов выбор разрядности счетчика после 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В
Go to the top of the page
 
+Quote Post
KalashKS
сообщение Mar 7 2017, 08:44
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 186
Регистрация: 7-02-11
Пользователь №: 62 755



В лоб - написать функцию максимума из двух величин. Или использовать 2008-й VHDL, там она, если не ошибаюсь, по умолчанию есть.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd March 2017 - 20:14
Рейтинг@Mail.ru


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