problema con el detector de bordes

1

Tengo un problema estúpido y no entiendo cómo puedo resolverlo. En mi diseño estoy usando un detector de borde ascendente. El problema es que ActiveHDL no lo simula de la manera que espero. El código VHDL es:

process (clk_i, rst_i)
begin
    if ( rst_i = '1' ) then
        wb_IO_cyc_i_d <= '0';
        wb_IO_cyc_i_edged <= '0';  
    elsif (rising_edge(clk_i) ) then           
        wb_IO_cyc_i_d <= wb_IO_cyc_i;       
        wb_IO_cyc_i_edged <= ( not  wb_IO_cyc_i_d ) and wb_IO_cyc_i;            
    end if;
end process;

El problema es que la simulación es la siguiente  

La señal wb_IO_cyc_i_d debe retrasarse 1 ciclo de reloj, pero no lo hace. Alguien me puede decir por qué?

    
pregunta haster8558

1 respuesta

2

Como sugirió @DaveTweed, es probable que sea una condición de carrera entre el reloj y los datos. Una cosa que causará esto es un retraso del ciclo delta en el reloj dentro de su chip, como ocurriría si hiciera alguna asignación a la señal del reloj en el código RTL. Por lo tanto, asegúrese de no hacer nada como lo siguiente:

clk_i <= clk ;  -- causes delta cycle delay/skew

Si wb_IO_cyc_i proviene de testbench, es posible que desee utilizar el patrón:

wait until clk_i = '1' ; 
wb_IO_cyc_i <= '1' after tprop_delay ;  -- where tprop_delay = 20% of your clock cycle.

Inicie tprop_delay con una estimación del 20% de su ciclo de reloj, y luego actualícelo con los números reales.

    
respondido por el Jim Lewis

Lea otras preguntas en las etiquetas