Освоение оператора 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> может быть:
- Одиночным значением, например,
when "11" => - Диапазоном, например,
when 5 to 10 => - Списком значений, например,
when 1|3|5 => - Ключевым словом
others, которое соответствует любому значению, не перечисленному явно.
Практическое упражнение: построение 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
Ключевые выводы
- Используйте операторы
caseдля замены длинных цепочекif-then-elsifдля лучшей читаемости. - Реализуйте путь по умолчанию с
when others =>для обработки неожиданных значений. - Мультиплексоры наиболее чисто выражаются с конструкциями
caseв VHDL.
Переходите к следующему уроку для более продвинутых концепций VHDL.
VHDL
- Пример процедуры VHDL: инкремент std_logic_vector
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Создание списков строк в VHDL: лучшие практики и пример
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство