Около "когда": синтаксическая ошибка в VHDL

Я пытаюсь написать код для симуляции схемы с двумя буферами с тремя состояниями и подтягивающим резистором в VHDL. Ниже мой код:

library ieee;
use ieee.std_logic_1164.all;

entity PullUpResistor is
port (
A, S, B, T : IN std_logic;  -- select one of these four inputs
TriOut : OUT std_logic -- output (no ";" after last port)
);
end entity PullUpResistor;

architecture behavioral of PullUpResistor is
begin
process(A, S, B, T) is
when (S = '1') and (T = '0') => TriOut <= A;
when (S = '0') and (T = '1') => TriOut <= B;
when (S = '0') and (T = '0') => TriOut <= 'H';
when (S = '1') and (T = '1') => TriOut <= 'X';
end process;
end architecture behavioral;

Я получаю ошибку компилятора near "when": syntax error на линии 14, которая является when (S = '1') and (T = '0') => TriOut <= A; линия. Я не могу понять, в чем заключается синтаксическая ошибка.

Любая помощь будет принята с благодарностью.

Благодарю.

1 ответ

Решение

Две вещи. Здесь нет is нужно после process, И что более важно, when не может быть использовано таким образом. Вы можете делать то, что хотите одновременно:

TriOut <=
  A when S = '1' and T = '0' else
  B when S = '0' and T = '1' else
  ...

или в процессе:

process (A, S, B, T)
begin
  if S = '1' and T = '0' then
    TriOut <= A;
  elsif ...

(или с VHDL-2008, комбинация двух.)

Вы, кажется, используете when как будто это в случае заявления. Имея это в виду, вы также можете сделать (в процессе):

sel <= S & T;

case sel is
  when "10" =>
    TriOut <= A;
  when "01" =>
    TriOut <= B;
  ...

То, что вы не можете сделать, это смешивать и сочетать.

Другие вопросы по тегам