VHDL: problema para entrar en estado

0

He codificado este estado en VHDL, pero tengo problemas para entrar en un estado determinado.

    architecture Behavioral of game is
type LIST  is ARRAY (11 downto 0) of std_logic_vector(3 downto 0);
Constant LISTEN: LIST := ("0010","0100","1000","0001","0100","0010","0010","0010","1000","0001","0010","0001"); 
begin
process(CLK)
variable prescaler: integer range 0 to 50000000;
Variable control: std_logic := '0';
variable pointer: integer range 0 to 11:=0;
variable test: std_logic:='0';
variable error: std_logic:='0';
variable top_pointer: integer range 0 to 11 := 0;
variable buttontimer:  integer range 0 to 50000000 := 0;
begin
if rising_edge (clk) then 
            if control = '0' and error = '0' then 
                winLEd <= "01";
                    if(prescaler < 49999999/1) then     
                        prescaler := prescaler + 1;     
                    else
                        prescaler := 0;
                        top_pointer := top_pointer + 1;  -- Top pointer increment
                        control := '1'; --- trigger event to get to new state
                        --test := '0';
                    end if;
            end if;     
                    if control = '1'  and error = '0' then 
                        winLEd <= "11";
                    --  test := '0';
                        if pointer > (top_pointer) then     -- If pointer is higher than toppointer, it means the sequence has to be incrementet. 
                                LED <= "0000";
                                control := '0';
                                pointer := 0;
                                test := '0';
                                error:= '0';
                        end if;
                        --if switch = "0000" then
                                if switch = LISTEN(pointer-1) and pointer<= top_pointer  then -- Checks if the switch match the sequence. 
                                    test := '1';
                                    buttontimer := buttontimer + 1;
                                    errorLed <= "01";       
                                        if switch = "0000" and test = '1' and buttontimer < 49999999/1 then
                                            pointer:= pointer +1;
                                            test := '0';
                                            errorLed <= "10";   
                                            buttontimer:= 0;
                                        end if; 

                                end if;

                                if switch /= LISTEN(pointer-1) and switch /= "0000"  then  -- if it doesn not match, error will be set high => trigger an new state. 
                                    error:= '1';        
                                end if;     
                                        if switch = "0000"  then                                
                                        Led <= LISTEN(pointer-1);  
                                          errorLed <= "11";
                                            error:= '0';
                                            control := '1';
                                        end if;

                        --end if;   
                    end if; 
                    if error = '1' then  -- stays here infinetly until board is reset. 
                                winLED <=  "10";
                                errorLed <= "00";    
                                Led <= switch;
                    end if; 

end if;                         
end process;
end Behavioral;

Estoy teniendo problemas para aumentar el puntero aquí. Listen es una matriz, que contiene diferentes patrones de 4 bits. El interruptor es el interruptor en mi FGPA, he usado errorLED para ver dónde estoy en el código, veo que estoy ingresando esta instrucción if, cuando se cambia el patrón de 4 bits.

    
pregunta Carlton Banks

1 respuesta

2

test solo es 1 cuando se ingresa este código:

if switch = LISTEN(pointer-1) and pointer<= top_pointer and test = '0' then --  Checks if the switch match the sequence. 
  test := '1';
  buttontimer := buttontimer + 1;
  errorLed <= "01";   
end if;

En esta instrucción if, el switch tiene un valor de LISTEN(pointer-1) . Luego, más abajo en el mismo proceso, el conmutador debe ser "0000" y test = '1' para alcanzar este código.

if switch = "0000" and test = '1' and buttontimer > 1  then
  pointer:= pointer +1;
  test := '0';
  errorLed <= "10";   
  buttontimer:= 0;
end if;

Por lo tanto, el código anterior solo se ingresará cuando switch = LISTEN(pointer-1) = "0000" , y buttontimer también deba cumplir su requisito, y pointer también debe cumplir su requisito (para que la prueba sea 1).

Otra nota es que, dado que restablece el valor de prueba a 0 al comienzo del ciclo de reloj, el valor de prueba no se transferirá de un ciclo de reloj a otro.

if control = '1'  and error = '0' then 
  winLEd <= "11";
  Led <= LISTEN(pointer-1);  
  test := '0'; << remove this line
  ...
end if;

EDITAR: Para recordar la prueba, en el primer bloque de código, elimine el test := '0' al principio. Ya está configurando la prueba a cero cuando se anula el cambio.

El FPGA está operando mucho más rápido de lo que tu dedo puede mover. Habrá ejecutado muchos ciclos de reloj entre usted y el interruptor. por esa razón, tendrá que recordar el valor de la prueba, de modo que cuando se desactive el interruptor, el FPGA recordará que se presionó el interruptor. Por eso sugiero la eliminación del test := '0' .

    
respondido por el stanri

Lea otras preguntas en las etiquetas