VHDL Estado de algoritmo de salida

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

entity ASM is
port(clk, rst, A, B: in std_logic;
    Z:buffer std_logic_vector(1 downto 0));
end ASM;

architecture asm1 of ASM is
type t_state is(T0,T1,T2,T3);
signal current_state, next_state:t_state;

begin
memory:process(clk,rst)
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)
begin
case current_state is
    when T0=>if(A='1' and B='0')then
                next_state<=T1;
                else
                next_state<=T0;
                end if;

    when T1=>if(A='1'and B='1')then 
                next_state<=T2;
                else
                next_state<=T3;
                end if;

    when T2=> next_state<=T0;

    when T3=> next_state<=T0;

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

output_decoder:process(clk,A,B,Z)
begin
if (clk'event and clk='1')then
case(current_state) is
    when T0=> if(A='1'and B='0')then
                Z<="00";
                end if;

    when T1=> if(A='1'and B='1')then
                Z<="10";
                else
                Z<="11";
                end if;

    when T2=> Z<="10";

    when T3=> Z<="11";

end case;
end if;
end process;
end asm1;

Hola, estoy intentando mostrar la forma de onda de salida en modelsim, pero con este código, no pude obtener la salida de Z, la salida de Z no muestra nada.

Código de Testbench:

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

entity ASM_tb is
end ASM_tb;

architecture behave of ASM_tb is
component ASM is
port(clk, rst, A, B: in std_logic;
    Z:buffer std_logic_vector(1 downto 0));
end component;

signal clk: std_logic :='0';
signal rst : std_logic;
signal A,B: std_logic;
signal Z: std_logic_vector(1 downto 0);
constant clk_period: time := 40ns;

begin
uut: ASM port map (clk,rst,A,B);


clk_process:process
begin
clk<='0';
wait for clk_period/2; 
clk<='1';
wait for clk_period/2;
end process;

-- Stimulus process
stimulus: process
begin        
A<='0';
B<='0';
wait for 20 ns;
A<='0';
B<='1';
wait for 20 ns;
A<='1';
B<='0';
wait for 20 ns;
A<='1';
B<='1';
wait for 20 ns;
A<='1';
B<='1';
wait for 20 ns;
A<='1';
B<='0';
wait for 20 ns;
end process;

end behave;
    
pregunta Yap YiXien

1 respuesta

4

Algunos problemas con tu código:

1) Banco de pruebas: no está inicializando la señal de restablecimiento ni la está llevando a un estado válido durante la simulación. Soluciona esto.

2) Banco de pruebas: su período de reloj es de 40 ns, pero su banco de pruebas espera 20 ns para cambiar las entradas. Esto es más rápido que el sistema puede responder a los cambios. Probablemente no es lo que quieres hacer para verificaciones básicas de comportamiento. Sugiero cambiar las declaraciones de espera de 20 ns a "esperar hasta el aumento de cobertura (clk); esperar a 1 ps;"

3) Código ASM: el siguiente proceso de decodificador debe tener A, B y current_state en la lista de sensibilidad. Generalmente, si se trata de un proceso no bloqueado, desea tener todos los estímulos de entrada en la lista de sensibilidad, de lo contrario, está creando pestañas transparentes. Si necesita registros (lo que no hace en este caso), conviértalo en un proceso cronometrado.

4) Código ASM: en su proceso de decodificador de salida, lo único que necesita en la lista de sensibilidad es la señal del reloj. En general, si es un proceso cronometrado, solo necesita el reloj en la lista de sensibilidad (quizás también una señal de reinicio si desea un reinicio asíncrono, pero evito los reinicios asíncronos a menos que sea absolutamente necesario). Creo que esto no es absolutamente necesario, sino más bien una cosa estilística.

5) Código ASM: Generalmente, desearía inicializar todas las señales de salida a ALGO. Sugiero crear una señal interna para su puerto Z de salida, inicializarla en el área de declaración, usar la señal en todos los lugares en que esté utilizando Z y luego agregar una línea a la parte inferior del archivo que asigna Ztmp a Z.

6) Código ASM: También, lo que dijo asdfex: Inicialice su señal de estado actual.

Espero que ayude.

    
respondido por el user2913869

Lea otras preguntas en las etiquetas