Jump to content

    
Sign in to follow this  
dak

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

Recommended Posts

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

 

Имеется массив из 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,разумеется.

 

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

Edited by dak

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this