Estoy tratando de entender un comportamiento extraño (para mí) de un simple código VHDL. Me he dado cuenta de un código estúpido que funciona bien en ModelSim y no funciona en un FPGA real (Altera MAX 10).
Library IEEE;
use IEEE.std_logic_1164.all;
entity test is
port( CLOCK_50: in std_logic;
SGN_IN: in std_logic;
RESET: in std_logic;
SGN_OUT: out std_logic
);
end test;
architecture beha of test is
type state is (ST0, ST1);
signal NEXT_STATE, PRESENT_STATE: state := ST0;
signal Y: std_logic := '0';
begin
listen: process(SGN_IN) is
begin
case PRESENT_STATE is
when ST0 =>
NEXT_STATE <= ST1;
Y <= '0';
when ST1 =>
NEXT_STATE <= ST0;
Y <= '1';
end case;
end process listen;
state_output: process(CLOCK_50)
begin
if(rising_edge(CLOCK_50)) then
if(RESET = '1') then
PRESENT_STATE <= ST0;
SGN_OUT <= '0';
else
PRESENT_STATE <= NEXT_STATE;
SGN_OUT <= Y;
end if;
end if;
end process state_output;
end architecture beha;
En la simulación, el proceso 'escuchar' se activa cada vez que cambia 'SGN_IN'. El activador cambia 'NEXT_STATE' y la salida 'Y'. Si 'SGN_IN' está inactivo, el proceso nunca se ejecuta y la salida no cambia. En FPGA, el proceso 'escuchar' se ejecuta independientemente de la señal 'SGN_IN' y la señal de salida 'SGN_OUT' cambia a una frecuencia igual a \ $ F_ {clk \ _50} / 2 \ $ (la mitad del reloj de frecuencia).
¿Podría, por favor, explicarme las razones de este comportamiento? ¿Y por qué en la simulación todo funciona bien?
Gracias