He intentado escribir una máquina de estados finitos en código VHDL para un procesador simple de 16 bits que estoy implementando en una placa Altera DE1. En la Máquina de estados finitos, tengo una declaración CASE
que maneja las diferentes instrucciones de 16 bits, que son traídas al FSM por un STD_LOGIC_VECTOR de 16 bits. Sin embargo, estoy teniendo un pequeño problema en el estado de decodificación donde la máquina de estados finitos decodifica las instrucciones. Una de las instrucciones es un ADD que toma dos registros como operandos y un tercero como el registro de destino. Sin embargo, también tengo una instrucción ADD que toma un registro y un valor inmediato de 5 bits como operandos y un segundo registro para el destino. Mi problema es que en la declaración CASE
, necesito poder diferenciar entre las dos instrucciones ADD diferentes. Entonces, pensé que si utilizaba valores comodín como "-" o "X" en la declaración CASE
, podría diferenciar entre los dos con solo dos casos en lugar de enumerar todas las posibles combinaciones de registro/valor inmediato. Por ejemplo:VHDL STD_LOGIC_VECTOR Valores comodín
CASE IR IS --(IR stands for "Instruction Register")
WHEN "0001------0-----" => (Go to 3-register add);
WHEN "0001------1-----" => (Go to 2-register/immediate value add);
WHEN OTHERS => (Do whatever);
END CASE;
Estos no son los únicos dos instrucciones que tengo, acabo de poner estos dos para hacer este post un poco más corto. Cuando compilo y ejecuto este código, el procesador deja de ejecutarse cuando llega al estado de "decodificación". Además, Quartus da muchas, muchas advertencias que dicen cosas como "advertencia de elección VHDL en LC3FSM.vhd (37): opción ignorada que contiene meta-valor" "0001 ------ 0 -----" "" Yo soy sin saber cómo lograr esto. REALMENTE no y probablemente no necesite definir cada combinación de 16 bits, y espero que haya una forma de usar comodines en un STD_LOGIC_VECTOR para minimizar el número de combinaciones que tendré que definir.
¿Alguien sabe cómo lograr esto?
Gracias
Ajá, muchas gracias, Paul Seeb por su sugerencia. Después de que hice la pregunta ayer, pensé en usar una declaración 'CASE' para cada código de operación, y luego usar una instrucción' IF' para hacer las otras comparaciones necesarias. Sin embargo, su primer método hace que el código sea un poco más corto, así que lo utilicé. Gracias, también Mark Thompson por su sugerencia, también. –