Освоение инстанцирования port map в VHDL: практическое руководство
В VHDL модуль — это самодостаточная единица, которая общается с внешним миром через свою сущность (entity). Клаузула port map инстанцирования соединяет формальные порты сущности с сигналами в окружающем дизайне.
Модули, сущности и тестбенчи
Когда мы разрабатываем для ПЛИС или ASIC, логика дизайна живет в модулях, имеющих четко определенные входные и выходные порты. Модуль, не имеющий портов, является тестбенчем — оберткой симуляции, которая подает стимулы на устройство под тестом (DUT), но никогда не появляется на физическом чипе.
В более ранних статьях мы писали весь VHDL в одном файле, что удобно для быстрых экспериментов, но не подходит для производственных дизайнов. Разделение DUT от его тестбенча улучшает читаемость, повторное использование и делает иерархию симуляции ясной.
Общие соглашения об именовании
Многие команды следуют простой схеме: файл дизайна — MyModule.vhd, а его тестбенч — MyModuleTb.vhd. Архитектура DUT часто называется rtl (register-transfer level), а архитектура тестбенча — sim. Это соглашение мгновенно говорит вам, предназначен ли файл для синтеза или для симуляции.
VHDL синтаксис для инстанцирования port map
Определите интерфейс модуля с ключевым словом entity:
entity <entity_name> is port( <entity_signal_name> : in|out|inout <signal_type>; ... ); end entity;
Инстанцируйте модуль в другом VHDL-файле с явным port map:
<label> : entity <library_name>.<entity_name>(<architecture_name>) port map( <entity_signal_name> => <local_signal_name>, ... );
<label> появляется в иерархии симулятора, <library_name> по умолчанию work, и каждый формальный порт должен быть связан с локальным сигналом.
Практический пример: 4-к-1 MUX
Ниже приведен полный тестбенч и пара DUT, реализующий 4-к-1 мультиплексер с использованием беззнаковых 8-битных сигналов.
Код тестбенча
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T15_PortMapTb is end entity; architecture sim of T15_PortMapTb is signal Sig1 : unsigned(7 downto 0) := x"AA"; signal Sig2 : unsigned(7 downto 0) := x"BB"; signal Sig3 : unsigned(7 downto 0) := x"CC"; signal Sig4 : unsigned(7 downto 0) := x"DD"; signal Sel : unsigned(1 downto 0) := (others => '0'); signal Output : unsigned(7 downto 0); begin -- Instantiate the MUX with architecture rtl i_Mux1 : entity work.T15_Mux(rtl) port map( Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output); -- Stimulus process process is begin wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= "UU"; wait; end process; end architecture;
Код модуля
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T15_Mux is port( -- Inputs Sig1 : in unsigned(7 downto 0); Sig2 : in unsigned(7 downto 0); Sig3 : in unsigned(7 downto 0); Sig4 : in unsigned(7 downto 0); Sel : in unsigned(1 downto 0); -- Output Output : out unsigned(7 downto 0) ); end entity; architecture rtl of T15_Mux is begin process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output <= Sig1; when "01" => Output <= Sig2; when "10" => Output <= Sig3; when "11" => Output <= Sig4; when others => Output <= (others => 'X'); end case; end process; end architecture;
Анализ волновой формы
Запуск тестбенча в ModelSim производит волновую форму, соответствующую ожидаемому поведению MUX. Снимок волновой формы ниже подтверждает, что DUT корректно переключается между четырьмя входными сигналами по мере изменения Sel.
Ключевые выводы
- Модули раскрывают входы и выходы через порты своей
entity. - Тестбенчи не содержат портов и предназначены исключительно для симуляции.
- Явное отображение портов — самый прозрачный способ инстанцирования VHDL-модуля.
- Последовательное именование (например,
rtlдля DUT,simдля тестбенча) улучшает читаемость между проектами.
Переходите к следующему уроку для более глубоких знаний о паттернах дизайна VHDL.
VHDL
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Создание списков строк в VHDL: лучшие практики и пример
- Создание Tcl-управляемого тестбенча для VHDL-модуля кодового замка
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство