VHDL ¿cómo hacer que un proceso con lista de sensibilidad espere?

0

Me gustaría un proceso para escuchar los cambios en una señal, pero no antes de las 20 ns. ¿Cómo puedo lograr eso?
No parece posible usar sentencias de espera en un proceso de este tipo, lo cual tiene sentido ya que tiene una lista de sensibilidad.
Lo que realmente estoy tratando de lograr es un banco de pruebas que cambia una señal por tiempo indefinido y otra por 5 ns después de que la señal esté lista = '1'. Pero no sé exactamente cuándo sucederá eso. Solo sé que antes de las 20 ns, el sistema aún se está reiniciando y, por lo tanto, no debería escuchar los cambios preparados antes de las 20 ns, porque luego obtendría errores. Las alternativas al enfoque en la pregunta son bienvenidas.

    
pregunta Yuri Borges

2 respuestas

2

Para mucho código de testbench, no utilizamos procesos de bucle y procesamos listas de sensibilidad para buscar cosas. En su lugar, utilizamos esperar para encontrar eventos.

TestProc : process 
begin
  Out1 <= '1' ; -- Steady 1 after this point.

  -- Find Reset as it deactivates
  -- a better alternative than waiting for an ad-hoc amount of time
  if Reset /= ACTIVE then
    wait until Reset = ACTIVE ; 
  end if; 
  wait until Reset /= ACTIVE ; 

  -- find ready at a level 1
  if ready /= '1' then 
    wait until ready = '1' ; 
  end if ; 
  Out2 <= '1' after 5 ns ; 

  -- find a rising edge of Clock
  -- Assumes that clock always transitions from 0 to 1 
  wait until Clk = '1' ; 
  Out2 <= '0' after 5 ns ; 
  ...

  -- Also find a rising edge of Clock
  -- rising_edge is extra work for the simulator and probably not necessary here
  wait until rising_edge(Clk) ; 
  Out2 <= '1' after 5 ns ; 
  ...

  std.env.stop ; -- stop the testbench
end process TestProc ; 

Si está buscando un modelo de comportamiento que conduzca Out1 a un valor estático, pero invierta Out2 5 ns cada vez que Ready se eleva a 1, puede hacer lo siguiente:

signal Out2 : std_logic := '0' ; 
. . . 
FollowReady : process  
begin 
  -- initialization 
  Out1 <= '1' ; 
  wait for 20 ns ; 

  -- looping process like behavior
  loop 
    -- Ready is a design signal.  Only detect a 0 to 1 change
    wait until rising_edge(Ready) ;
    Out2 <= not Out2 after 5 ns ; 
  end loop ; 
end process ; 
    
respondido por el Jim Lewis
1

Para evitar un proceso con una lista de sensibilidad y una declaración de espera, puede simplemente hacer algo como eso:

Método 1:

Proceso 1 (Sin lista de sensibilidad) que contiene lo siguiente:

Out1 <= '1';
wait for 20 ns;
Out1 <= '0';
wait;

Proceso 2 (el que tiene una lista de sensibilidad) que contiene esto:

if Ready = '1' then
  -- track signal changes
else
  -- stay idle
end if;

Método 2:

Si su código VHDL se va a sintetizar, probaría algo diferente, también utilizando dos procesos diferentes.

Supone que los cambios en la señal que está siguiendo no son más rápidos que su reloj.

El proceso 1 detecta cambios en la señal:

edge_detector : process (Clk, Reset_n) 
    begin

    if Reset_n = '0' then  
        edge_detected <='0';
        old_s_signal <='0';  
    elsif rising_edge(Clk) then   
            if old_s_signal='1' and s_signal='0' then
                edge_detected<='1';
            else
                edge_detected<='0';
            end if; 
            old_s_signal<=s_signal;   
    end if;  
end process;

El proceso 2 espera 20 ns y luego toma medidas cuando se ve un cambio en la señal:

tracker : process (Clk, Reset_n)   

variable cpt_wait : integer;  

begin

if Reset_n = '0' then 
    cpt_wait := '0';  
    -- initialize all other variables and signals assigned in this process here
elsif rising_edge(Clk) then   
        if cpt_wait = NB_OF_TCLK_TO_MAKE_20_NS then  
            if edge_detected = '1' then
                -- track changes    
            end if;
        else 
           cpt_wait := cpt_wait + 1;   
        end if;
 end if;   

end process;
    
respondido por el DylanM

Lea otras preguntas en las etiquetas