Несоответствие двунаправленной шины VHDL

#vhdl

#vhdl

Вопрос:

у меня есть модуль с 16-битной входной шиной. В моем объекте верхнего уровня я хочу подключить только 4 из них (также без двунаправленных). Их прямое подключение, конечно, приводит к ошибке

 port map( IO16bit => IO4bit )
  

итак, я подключил m через внутренний сигнал

 signal temp : std_logic_vector (15 downto 0);
port map(IO16bit => temp);
IO4bit <= temp(3 downto 0);
  

но теперь я получаю сообщение об ошибке:
Узлы с тремя состояниями напрямую не управляют выводами верхнего уровня
и не преобразуют разветвление в элемент ИЛИ

здесь я потерял двунаправленность. Как я могу это решить?

Ответ №1:

Вы можете использовать диапазон в port map , а затем подключить оставшийся к dummy подобному:

 signal dummy : std_logic_vector(15 downto 4) := (others => 'Z');
...
port map(
  IO16bit( 3 downto 0) => IO4bit,
  IO16bit(15 downto 4) => dummy,
...
  

Это будет скомпилировано для моделирования, но вы должны убедиться, что выбранный вами инструмент синтеза также может принимать конструкцию и правильно ее обрабатывать. Часто возникает проблема с наличием внутренних inout портов в синтезируемом дизайне.

Комментарии:

1. Или даже IO16bit(15 downto 4) => open, без фиктивного сигнала. Если вы используете фиктивный сигнал, используйте его (others => 'Z') для предотвращения сбоев шины

2. @BrianDrummond: при использовании open вместо dummy then ModelSim выдается ошибка «Формальный «az_io» не должен быть связан с OPEN, когда подэлементы связаны по отдельности.». Хороший момент Z для фиктивного.