Estoy intentando escribir una máquina de estado en VHDL que escaneará un teclado 4x4. Quiero que keyP esté en 0 al inicio y después de un reinicio. También quiero que la columna se establezca en "1111" al inicio y después de un reinicio.
Como no estoy completamente versado en la programación VHDL, estoy seguro de que es solo un error de sintaxis estúpido. El error que recibo es:
Error (10818): No se puede inferir el registro para "Col [0]" en Lab_7_Keypad.vhd (39) porque no mantiene su valor fuera del límite del reloj
y lo mismo para Col [1] Col [2] Col [3] y para keyP también.
Aquí está mi código para el comienzo de todo. ¿Puede alguien darme una idea de dónde me he equivocado?
ENTITY Lab_7_Keypad IS
PORT(
nReset : IN STD_LOGIC;
clk : IN STD_LOGIC;
row : IN STD_LOGIC_VECTOR (3 downto 0);
Col : OUT STD_LOGIC_VECTOR (3 downto 0);
data : OUT STD_LOGIC_VECTOR (3 downto 0);
keyP : OUT STD_LOGIC);
END Lab_7_Keypad;
ARCHITECTURE a OF Lab_7_Keypad IS
TYPE STATE_TYPE IS ( Col1Set, Col2Set, Col3Set, Col4Set );
SIGNAL coltest : STATE_TYPE;
BEGIN
PROCESS (clk, nReset )
BEGIN
keyP <= '0';
Col <= "1111";
IF nReset = '0' THEN -- asynch Reset to zero
coltest <= Col1Set;
Col <="1111";
keyP <= '0';
ELSIF clk'EVENT AND clk = '1' THEN -- triggers on PGT
CASE coltest IS
WHEN Col1Set =>
Col <="1110";
CASE row IS
WHEN "1110"=>--row 1
data <= "0001";
keyP <= '1';
WHEN "1101"=>--row 2
data <= "0100";
keyP <= '1';
WHEN "1011"=>--row 3
data <= "0111";
keyP <= '1';
WHEN "0111"=>--row 4
data <= "1110";
keyP <= '1';
WHEN OTHERS => coltest <= Col2Set;
END CASE;
--Continues for another couple Case statements for the extra columns