El código VHDL funciona bien en ModelSim y el comportamiento extraño en Altera FPGA

0

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

    
pregunta Alessio

1 respuesta

2

Hay varios problemas en tu código:

1)
PRESENT_STATE no está en la lista de sensibilidad del proceso listen . Debería ser, de lo contrario, la simulación te da otros resultados como en hardware.

2) SGN_IN no es una entrada de su FSM. No hay transición que dependa de esta señal. La lista de señales en la lista de sensibilidad no las promueve a las entradas. Esta lista es solo para simuladores e ignorada por las herramientas de síntesis.

3) Debido a que está utilizando SGN_IN en la lista de sensibilidad, parece que funciona correctamente en la simulación, pero esto es solo la suerte de 2 errores que resultan en el resultado de simulación correcto :). Su FSM también haría la transición si SGN_IN se cambia a X o L , porque la señal cambió, pero supongo que desea verificar las transiciones 1-0 / 0-1, ¿verdad?

listen: process(PRESENT_STATE, SGN_IN) is
begin
  NEXT_STATE <= PRESENT_STATE;
  Y          <= '0';

  case PRESENT_STATE is
    when ST0 =>
      if (SGN_IN = '1') then
        NEXT_STATE <= ST1;
      end if;
    when ST1 =>
      Y <= '1'; 
      if (SGN_IN = '0') then
        NEXT_STATE <= ST0;
      end if;
  end case;
end process listen;
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas