Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Использование констант и generic map в VHDL для гибкого дизайна модулей

Создание повторно используемых модулей — краеугольный камень эффективного VHDL-дизайна, но незначительные вариации часто требуют дублирования кода. Обобщенные параметры (generics) и generic maps решают это, позволяя конфигурировать параметры модуля во время компиляции, сохраняя ваш код DRY и поддерживаемым.

Константы помогают избежать жесткого кодирования одного и того же значения повторно. Они идеальны для определения ширин векторов сигналов или других параметров времени компиляции, и даже могут быть отображены на обобщенные константы. В отличие от сигналов или переменных, значение константы неизменно после élaborации, обеспечивая согласованность во всем дизайне.

Эта статья является частью серии базовых уроков VHDL.

В нашем предыдущем уроке мы построили 4-входной мультиплексер с шириной шины 8 бит. Если вам теперь нужен похожий MUX с другой шириной, копирование и вставка всего модуля — не единственный вариант.

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

Ниже приведен синтаксис для объявления константы в VHDL:

constant <constant_name> : <type> := <value>;

Константы могут появляться рядом с сигналами в декларативной части файла или с переменными внутри процесса.

Чтобы раскрыть константу модулю, используйте ключевое слово generic в объявлении сущности:

entity <entity_name> is generic( <entity_constant_name> : <type> [:= default_value]; ... ); port( <entity_signal_name> : in|out|inout <type>; ... ); end entity;

Инстанцируйте обобщенный модуль в другом месте, используя generic map и port map:

<label> : entity <library_name>.<entity_name>(<architecture_name>) generic map( <entity_constant_name> => <value_or_constant>, ... ) port map( <entity_signal_name> => <local_signal_name>, ... );

Упражнение

В этом видео-уроке мы пройдем через создание и инстанцирование обобщенного 4-входного модуля MUX в VHDL.

Тестбенч — Generic MUX

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T16_GenericMapTb is end entity; architecture sim of T16_GenericMapTb is constant DataWidth : integer := 8; signal Sig1 : signed(DataWidth-1 downto 0) := x"AA"; signal Sig2 : signed(DataWidth-1 downto 0) := x"BB"; signal Sig3 : signed(DataWidth-1 downto 0) := x"CC"; signal Sig4 : signed(DataWidth-1 downto 0) := x"DD"; signal Sel : signed(1 downto 0) := (others => '0'); signal Output : signed(DataWidth-1 downto 0); begin i_Mux1 : entity work.T16_GenericMux(rtl) generic map(DataWidth => DataWidth) port map( Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output ); 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;

Модуль Generic MUX

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T16_GenericMux is generic(DataWidth : integer); port( -- Inputs Sig1 : in signed(DataWidth-1 downto 0); Sig2 : in signed(DataWidth-1 downto 0); Sig3 : in signed(DataWidth-1 downto 0); Sig4 : in signed(DataWidth-1 downto 0); Sel : in signed(1 downto 0); -- Output Output : out signed(DataWidth-1 downto 0) ); end entity; architecture rtl of T16_GenericMux 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 после запуска симуляции (увеличена на временной шкале):

Использование констант и generic map в VHDL для гибкого дизайна модулей

Анализ

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

Использование констант и generic map в VHDL для гибкого дизайна модулей

Выводы

Переходите к следующему уроку »

VHDL

  1. Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
  2. Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
  3. Освоение функций VHDL: практическое руководство по эффективному дизайну
  4. Использование процедур в VHDL: упростите свой дизайн с повторно используемым кодом
  5. Использование констант и generic map в VHDL для гибкого дизайна модулей
  6. Освоение инстанцирования port map в VHDL: практическое руководство
  7. Освоение оператора Case-When в VHDL: эффективный дизайн мультиплексора
  8. Освоение типов signed и unsigned в VHDL: практическое руководство
  9. Бесплатный симулятор и редактор VHDL: руководство для студентов
  10. Микроконтроллеры PIC18: особенности, производительность и руководство по использованию