Soy nuevo en VHDL, así que solo tengo una pregunta para preguntar por qué esto produce un error. Tengo una ALU definida en VHDL:
c <= a + b WHEN opc="0111"
ELSE a - b WHEN opc="1000"
ELSE -a WHEN opc="1011"
ELSE -b WHEN opc="0001"
ELSE ABS(a) WHEN opc="1110"
ELSE ABS (b) WHEN opc="1010"
ELSE NOT a WHEN opc="0010"
ELSE NOT b WHEN opc="1100"
ELSE a AND b WHEN opc="0100"
ELSE a OR b WHEN opc="0110"
ELSE a XOR b WHEN opc="0101"
(esta es la arquitectura)
Pero luego quiero hacerlo sincrónico,
PROCESS (clock)
BEGIN
IF(rising_edge(clock)) THEN
c <= a + b WHEN opc="0101"
ELSE a - b WHEN opc="1000"
ELSE -a WHEN opc="1011"
ELSE -b WHEN opc="0001"
ELSE ABS(a) WHEN opc="1110"
ELSE ABS (b) WHEN opc="1010"
ELSE NOT a WHEN opc="0010"
ELSE NOT b WHEN opc="1100"
ELSE a AND b WHEN opc="0100"
ELSE a OR b WHEN opc="0110"
ELSE a XOR b WHEN opc="0111"
END IF
END PROCESS;
Esto no funciona, aparece con varios errores como:
';' expected.
Keyword "end" expected.
Así que ahora he cambiado mi código a:
PROCESS (clock)
BEGIN
IF(rising_edge(clock)) THEN
CASE opc IS
WHEN "0101" => c <= a+b;
WHEN "1000" => c <= a-b;
WHEN "1011" => c <= -a;
WHEN "0001" => c <= -b;
WHEN "1110" => c <= ABS(a);
WHEN "1010" => c <= ABS(b);
WHEN "0010" => c <= NOT a;
WHEN "1100" => c <= NOT b;
WHEN "0100" => c <= a AND b;
WHEN "0110" => c <= a OR b;
WHEN "0111" => c <= a XOR b;
END CASE;
END IF;
END PROCESS;
Y esto no produce ningún error. Pero, ¿por qué el código original que funcionó cuando se puso en un proceso no funciona a menos que use la declaración del caso?
Gracias de antemano.