dak 0 6 июля, 2016 Опубликовано 6 июля, 2016 (изменено) · Жалоба Здравствуйте. Имеется массив из 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,разумеется. Впрочем, это не дало нужного эффекта. Подскажите,пожалуйста,как быть. Изменено 6 июля, 2016 пользователем dak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 июля, 2016 Опубликовано 7 июля, 2016 · Жалоба Весь код выложите. Без L1_rom_bank_lib.types это даже в синтезатор не загнать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться