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

Освоение оператора Case-When в VHDL: эффективный дизайн мультиплексора

Оператор Case-When направляет VHDL-программ по одному из нескольких путей на основе сигнала, переменной или выражения. Он предлагает более чистую, более читаемую альтернативу длинным цепочкам if-then-elsif-else, особенно при обработке множественных дискретных значений.

Многие языки программирования используют конструкции вроде switch или case; в VHDL конструкция case является основой для построения мультиплексоров и другой логики выбора.

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

Базовый синтаксис

Каноническая структура оператора case:

case <expression> is when <choice> => -- code for this branch when <choice> => -- code for this branch ... end case;

<expression> обычно является сигналом или переменной. Хотя case может содержать много ветвей when, только одна будет выполнена во время симуляции.

Каждый <choice> может быть:

Практическое упражнение: построение 4-к-1 мультиплексора

Ниже приведен полный VHDL-код, демонстрирующий 4-к-1 мультиплексор, реализованный с помощью обоих подходов if-then-elsif и case.

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T14_CaseWhenTb is end entity; architecture sim of T14_CaseWhenTb 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 Output1 : unsigned(7 downto 0); signal Output2 : unsigned(7 downto 0); begin -- Stimuli for the selector signal 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; -- MUX using if-then-else process(Sel, Sig1, Sig2, Sig3, Sig4) is begin if Sel = "00" then Output1 <= Sig1; elsif Sel = "01" then Output1 <= Sig2; elsif Sel = "10" then Output1 <= Sig3; elsif Sel = "11" then Output1 <= Sig4; else Output1 <= (others => 'X'); end if; end process; -- Equivalent MUX using a case statement process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output2 <= Sig1; when "01" => Output2 <= Sig2; when "10" => Output2 <= Sig3; when "11" => Output2 <= Sig4; when others => Output2 <= (others => 'X'); end case; end process; end architecture; 

После запуска симуляции в ModelSim волновая форма показывает идентичное поведение для Output1 и Output2. Когда селектор Sel принимает неопределенное значение (например, "UU"), клауза when others => выдает 'X', сигнализируя о неизвестном состоянии.

Вывод консоли содержит следующее предупреждение в 50 нс, указывающее на сравнение с метазначением:

VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb

Ключевые выводы

Переходите к следующему уроку для более продвинутых концепций VHDL.

VHDL

  1. Пример процедуры VHDL: инкремент std_logic_vector
  2. Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
  3. Создание списков строк в VHDL: лучшие практики и пример
  4. Корректное завершение симуляции VHDL-тестбенча
  5. Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
  6. Генерация случайных чисел в VHDL: от Uniform к OSVVM
  7. Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
  8. Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
  9. Освоение функций VHDL: практическое руководство по эффективному дизайну
  10. Освоение техник шлифовального станка для режущих инструментов: практическое руководство