es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la declaración de if else no funciona? La salida de Y en la banco de pruebas es 0 independientemente de la entrada X1 y X0.

Estoy escribiendo el código para el diagrama de estados de abajo, pero no estoy seguro de por qué obtengo la salida Y igual a 0 incluso si seguí la secuencia correcta. Probé y cambié el valor de salida Y para la primera transición S0 a S1 a 1 con fines de prueba, la primera transición no funcionó, ¿qué consideré incorrectamente?

VHDL

biblioteca ieee;
uso de IEEE.STD_LOGIC_1164.all;

entidad seqdet es
puerto(
RST,CLK : in STD_LOGIC;
X1,X0: in STD_LOGIC;
Y: out STD_LOGIC
);

end.seqdet;

arquitectura BHV de seqdet es
tipo state es (S0, S1, S2, S3, S4, S5);
señal presentstate, nextstate: state;

begin
CLK_PULSE:proceso(CLK,RST)
begin

si flanco_de_subida(CLK) entonces
si (RST=’1′) entonces
presentstate <= S0;
elsif (RST=’0′) entonces
presentstate <= nextstate;
end if;
end if;
end proceso;

state_process:proceso(presentstate,X1,X0)
begin
si (presentstate <= S0) entonces
Y <= ‘0’;
si (X1=’0′ y X0=’0′) entonces
nextstate <= S1;
else
nextstate <= S0;
end if;

elsif (nextstate <= S1) entonces
Y <= ‘0’;
si (X1=’0′ y X0=’0′) entonces
nextstate <= S2;
else
nextstate <= S0;
end if;

elsif (presentstate <= S2) entonces
Y <= ‘0’;
si (X1=’0′ y X0=’0′) entonces
nextstate <= S2;
elsif (X1=’0′ y X0=’1′) entonces
nextstate <= S3;
else
nextstate <= S0;
end if;

elsif (presentstate <= S3) entonces
Y <= ‘0’;
si (X1=’1′ y X0=’1′) entonces
nextstate <= S4;
else
nextstate <= S0;
end if;

elsif (presentstate <= S4) entonces
Y <= ‘0’;
si (X1=’0′ y X0=’0′) entonces
nextstate <= S5;
else
nextstate <= S0;
end if;

elsif (presentstate <= S5) entonces
si (X1=’0′ y X0=’0′) entonces
Y <= ‘0’;
nextstate <= S2;
elsif (X1=’1′ y X0=’0′) entonces
Y <= ‘1’;
nextstate <= S0;
else
Y <= ‘0’;
nextstate <= S0;
end if;

end if;
end proceso;
end BHV;

Testbench

biblioteca ieee;
uso de IEEE.STD_LOGIC_1164.all;

entidad seqdetest es
end seqdetest;

arquitectura seqdetest_arch_de seqdetest es

señal CLK: std_logic = ‘0’;
señal RST: std_logic;
señal X1, X0: std_logic;
señal Y: std_logic;

BEGIN

uut: entidad trabajo.seqdet
port map (
CLK => CLK,
RST => RST,
X1 => X1,
X0 => X0,
Y => Y
);

CLK_proc: proceso
begin
CLK <= ‘1’;
espera durante 50 ns;
CLK <= ‘0’;
espera durante 50 ns;
end proceso CLK_proc;

sim_proc: proceso
begin
RST <= ‘1’;
espera durante 100 ns;
RST <= ‘0’;
X1 <= ‘0’; X0 <= ‘0’;
espera durante 100 ns;
X1 <= ‘0’; X0 <= ‘0’;
espera durante 100 ns;
X1 <= ‘0’; X0 <= ‘1’;
espera durante 100 ns;
X1 <= ‘1’; X0 <= ‘1’;
espera durante 100 ns;
X1 <= ‘0’; X0 <= ‘0’;
espera durante 100 ns;
X1 <= ‘1’; X0 <= ‘0’;
espera durante 100 ns;
end proceso sim_proc;

END seqdetest_arch ;

Tags:  

Answer

  1. Avatar for davy.ai

    El problema parece estar en los operadores de comparación utilizados en el “state_process”. Los operadores de comparación utilizados en “presentstate <= S0” y “nextstate <= S1” no son correctos, ya que deberían ser “presentstate = S0” y “nextstate = S1” respectivamente. De manera similar, los operadores de comparación utilizados en “nextstate <= S1”, “presentstate <= S2”, “presentstate <= S3”, “presentstate <= S4” y “presentstate <= S5” no son correctos, ya que deberían ser “nextstate = S1”, “presentstate = S2”, “presentstate = S3”, “presentstate = S4” y “presentstate = S5” respectivamente. Al hacer estas correcciones, se resolverá el problema de la salida incorrecta Y.

Comments are closed.