¡¡Advertencia !! Latch tiene un comportamiento inseguro (vhdl)

0

¿la advertencia afectará el resultado de salida? ¿Por qué sucede esta advertencia? Este es mi código

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ASM is
port(clk, rst: in std_logic;
    I   :in std_logic;
    Z1: out std_logic;
    Z2: out std_logic);
end ASM;

architecture behave of ASM is

type t_state is(T0,T1,T2,T3,T4,T5,T6);
signal next_state:t_state;
signal current_state:t_state:=T0;
signal out1: std_logic; 

begin
clock:process(clk,rst,I)
begin
    if(rst='1')then
        current_state<=T0;
    elsif(clk'event and clk='1') then
        current_state<=next_state;
    end if;
end process;

next_state_decoder:process(current_state,I)
begin
case current_state is
    when T0=> if (I='0')then
                    next_state<=T1; 
                    out1<='1';
                else
                    next_state<=T0;
                end if;

    when T1=> if (I='1') then
                    next_state<=T2;
                end if;

    when T2=> if(I='0')then
                    out1<='0';
                    next_state<=T3;
                else
                    next_state<=T0;
                end if;

    when T3=> if(I='0')then
                    out1<='0';
                    next_state<=T4;
                else
                    next_state<=T0;
                end if; 

    when T4=> if(I='0')then
                    out1<='0';
                    next_state<=T5;
                else
                    next_state<=T0;
                end if; 

    when T5=> if(I='0')then
                    out1<='0';
                    next_state<=T6;
                else
                    next_state<=T0;
                end if;

    when T6=> if(I='0')then
                    out1<='0';
                    next_state<=T0;
                end if;

    when others=>NULL;
 end case;  
end process;

Z1<=out1;
Z2<=I;  
end behave;
    
pregunta Yap YiXien

1 respuesta

2

Usted acaba de escribir un VHDL descuidado como lo mencionó Brian Drummond en los comentarios, hay un estado en su proceso sin bloqueo, lo que lleva a pestillos (tanto next_state como out1 se enganchan en los flancos de I). Intenta lo siguiente:

p_main:process(clk, rst)
  variable r_current_state:
begin
case r_current_state is
    if(rst='1')then
        r_current_state:=T0;
        out1 <= '1';
    elsif(clk'event and clk='1') then
      case r_current_state is
        when T0=> if (I='0')then
                        r_current_state:=T1;
                        out1<='1';
                    end if;

        when T1=> if (I='1') then
                        r_current_state:=T2;
                    end if;

        when T2=> if(I='0')then
                        out1<='0';
                        r_current_state:=T3;
                    else
                        r_current_state:=T0;
                    end if;

        when T3=> if(I='0')then
                        out1<='0';
                        r_current_state:=T4;
                    else
                        r_current_state:=T0;
                    end if;

        when T4=> if(I='0')then
                        out1<='0';
                        r_current_state:=T5;
                    else
                        r_current_state:=T0;
                    end if;

        when T5=> if(I='0')then
                        out1<='0';
                        r_current_state:=T6;
                    else
                        r_current_state:=T0;
                    end if;

        when T6=> if(I='0')then
                        out1<='0';
                        r_current_state:=T0;
                    end if;

        when others=>NULL;
      end case;
    end if;
end process;

Z1<=out1;
Z2<=I;

También, olvídate de las máquinas de estado de dos procesos. Ensucian las cosas demasiado rápido.

Tenga en cuenta que el código que proporcioné es funcionalmente diferente de lo que escribió, ya que out1 solo cambiará en los bordes ascendentes de clk, en lugar de en cada cambio de I.

    
respondido por el DonFusili

Lea otras preguntas en las etiquetas