Tengo un problema estúpido y no sé cómo puedo resolverlo. En mi diseño estoy usando un detector de flanco ascendente. El problema es que ActiveHDL no lo simula de la forma que esperaba. 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 debería retrasarse 1 ciclo de reloj pero no lo hace. Alguien puede decirme porque?
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 haber hecho nada como lo siguiente:
clk_i <= clk ; -- causes delta cycle delay/skew
Si wb_IO_cyc_i proviene del banco de pruebas, 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.
Comience tprop_delay con una estimación del 20% de su ciclo de reloj, luego actualícelo con los números reales.
david tweed
wb_IO_cyc_i
en la simulación? Si sube justo antes del borde del reloj, así es como se vería la simulación. Si es una entrada asíncrona, debe pasarla por un sincronizador de 2 etapas antes de enviarla a su detector de borde.haster8558
wb_IO_cyc_i
es síncrona. Las señales en simulación son las entradas de la entidad donde está ese proceso, así que no entiendo ese resultado. Elwb_IO_cyc_i_d
tiene que ser retrasado. Me equivoco ?