¿Hay un caso de VHDL de orden preferido / cuándo y las declaraciones de levantamiento / caída en los procesos?

1

¿Qué inconvenientes hay en poner mi control de aumento de cobertura dentro de un bloque de caso / cuándo?

Tengo VHDL que usa código similar al primer ejemplo a continuación, simula correctamente y es sintetizable. Sin embargo, no se comporta de acuerdo con la simulación.

process ( clk_in, rx0_busy, reset_n, spi_cs_n, spi_sclk, tx_state )

begin   
    case tx_state is
        when ( RESET )=>
            if ( rising_edge( clk_in ) ) then 
...

¿Es mejor escribir VHDL más como abajo, con el borde del reloj manejando la caja / cuándo? Si es así, ¿por qué?

process ( clk_in, rx0_busy, reset_n, spi_cs_n, spi_sclk, tx_state )

begin   
    if ( rising_edge( clk_in ) ) then 
        case tx_state is
             when ( RESET )=>
...
    
pregunta schadjo

2 respuestas

2

Estas son dos descripciones de circuitos diferentes:

En el primer supuesto, mux1 recibe una señal tx_state asíncrona en el primero y luego se evalúa con un sistema síncrono (REG1)

El segundo, en el flanco ascendente del reloj, cada entrada evaluada, luego se alimenta a un multiplexor. En este caso, mux4 tiene un tiempo de ~ 1 / clock_speed para evaluar la salida .

simular este circuito : esquema creado usando CircuitLab

¡La diferencia de implementación!

si implementa el primero, por ejemplo, suponga que tiene un "data_from_pin", entonces el compilador debería preocuparse por el retraso (retraso entre data_from_pin y tx_state y ...), el compilador conoce el tx_state pin es asíncrono y puede cambiar antes de que el reloj se acerque varias veces , la sincronización del sistema debe ser exactamente cierta.

El primer circuito genera muchas restricciones de tiempo y advertencias para la asignación, el lugar y la ruta,

Pero el segundo circuito sabe que cada temporización de salida se basa en un reloj antiguo y todas las entradas son estables para la evaluación de la nueva máquina de estado.

    
respondido por el M KS
3

Si bien el primer ejemplo puede ser sintácticamente correcto, nunca he visto la lógica del reloj dentro de nada que no sea un IF / ELSE que seleccione entre restablecer y reloj.

Desde el punto de vista de la legibilidad es mucho mejor tener un "if rising_edge" que incluya toda la lógica síncrona para el proceso, de modo que pueda saber inmediatamente que es realmente síncrono.

Además, su lista de sensibilidad solo necesita incluir la entrada del reloj, ya que si es realmente un sistema síncrono, todas las demás variables solo importan cuando cambia el reloj. Si el proceso necesita un reinicio asíncrono, entonces el reinicio también debe estar en la lista de sensibilidad.

    
respondido por el crj11

Lea otras preguntas en las etiquetas