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

Проблема с множеством драйверов для массива векторов

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

 

Имеется массив из 32 векторов. Одновременно должно что-то писаться только в пять из них. Номера используемых векторов не фиксированы и передаются из вне. Проблема в том,что при использовании текущего подхода синтезатор говорит мне,что он видит для каждого бита каждого вектора ситуацию множества драйверов - то есть, потенциально может возникнуть ситуация, когда все пять модулей контроля будут писать в один и тот же вектор массива.

 

 

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

library L1_rom_bank_lib;
use L1_rom_bank_lib.types.all;

ENTITY addr_controller IS
  port(
    clk :  in std_logic;
    data_current : in std_logic_vector (7 downto 0);
    data_1 : in std_logic_vector (7 downto 0);
    data_2 : in std_logic_vector (7 downto 0);
    data_3 : in std_logic_vector (7 downto 0);
    data_4 : in std_logic_vector (7 downto 0);
    addr_in : in std_logic_vector (9 downto 0);
    addr   : out mem_adr (31 downto 0)
  );
END ENTITY addr_controller;

--
ARCHITECTURE arch OF addr_controller IS
BEGIN
  process(clk)
  begin
    if rising_edge(clk) then
      if (data_current /= data_1 or data_current /= data_2 or data_current /= data_3 or data_current /= data_4) then
  addr(to_integer(unsigned(data_current))) <= addr_in;
end if;
end if;
end process;
END ARCHITECTURE arch;

 

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

 

Я подумал, что происходит это из_за отсутствия ветки ELSE, и в случае совпадения хотя бы одного из задающих векторов два модуля пишут в один и тот же вектор состояние неопределенности. Поэтому я добавил к массиву еще пять векторов, куда модули пишут в случае хотя бы одного совпадения:

 

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

library L1_rom_bank_lib;
use L1_rom_bank_lib.types.all;

ENTITY addr_controller IS
  generic(
    false_vector : integer := 33);
  port(
    clk :  in std_logic;
    data_current : in std_logic_vector (7 downto 0);
    data_1 : in std_logic_vector (7 downto 0);
    data_2 : in std_logic_vector (7 downto 0);
    data_3 : in std_logic_vector (7 downto 0);
    data_4 : in std_logic_vector (7 downto 0);
    addr_in : in std_logic_vector (9 downto 0);
    addr   : out mem_adr (36 downto 0)
  );
END ENTITY addr_controller;

--
ARCHITECTURE arch OF addr_controller IS
BEGIN
  process(clk)
  begin
    if rising_edge(clk) then
      if (data_current = data_1 or data_current = data_2 or data_current = data_3 or data_current = data_4) then
        addr(false_vector) <= (others=>'0');
      else
  addr(to_integer(unsigned(data_current))) <= addr_in;
end if;
end if;
end process;
END ARCHITECTURE arch;

 

У каждого модуля свой generic,разумеется.

 

Впрочем, это не дало нужного эффекта. Подскажите,пожалуйста,как быть.

Изменено пользователем dak

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


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

Весь код выложите. Без L1_rom_bank_lib.types это даже в синтезатор не загнать.

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


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

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

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

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

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

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

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

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

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

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