generando señal de reloj para testbench en VHDL

2

Me pregunto por qué la primera asignación de una señal de reloj en VHDL no funciona como la segunda. Apreciaría cualquier explicación sobre el comportamiento de simulación de la sentencia de asignación con retraso. Gracias.

Primera versión: (solo produce picos a 50 ns de separación)

clk <= '0', (not clk) after 50 ns;

Segunda versión: (produce una onda cuadrada del período de tiempo 100 ns como se esperaba)

signal clk : std_logic:='0';
begin
 clk <= not clk after 50 ns;
    
pregunta Neha Karanjkar

1 respuesta

4

Al omitir la cláusula "después" de la primera asignación en su secuencia de asignaciones (conocida como forma de onda), está implícitamente implicando "después de 1 ciclo delta". Los ciclos delta son la clave de cómo se realiza la simulación VHDL. Se puede pensar en un ciclo delta como un retraso infinitesimalmente pequeño, pero en realidad eso es una simplificación total. Por lo tanto, en su caso, este retraso infinitamente pequeño es la razón por la cual no ve que la duración positiva del ciclo del reloj dure mucho, aunque este comportamiento variará ligeramente con diferentes simuladores.

Le sugiero que realice una lectura adicional sobre los ciclos delta y que siga leyendo el manual de su simulador para comprender su implementación.

Editar:

Una declaración concurrente se evalúa cada vez que cambia una señal en el lado derecho. Puede ser útil pensar en declaraciones concurrentes como estas en su forma de proceso equivalente. Una declaración concurrente es equivalente a un proceso que es sensible a las señales a las que hace referencia en el lado derecho de la declaración. Si no hay señales a las que se hace referencia, entonces es equivalente a un proceso con una lista de sensibilidad vacía y una declaración de espera final.

El ejemplo "clk < = '0', no clk después de 50ns" se evalúa cada vez que cambia clk, clk se programará con '0' después de un ciclo delta y "not clk" (es decir, '1') después 50ns. En 50ns, clk ha cambiado y, por lo tanto, la declaración se evalúa nuevamente, momento en el que clk se programa con '0' después de un ciclo delta y "no clk" 50ns más tarde. Por lo tanto, la duración entre cuando clk es '1' y '0' es un ciclo delta.

El ejemplo "clk < = '0', '1' after 50ns" solo se evalúa una vez porque no hay señales en el lado derecho para que sea sensible. Por lo tanto, clk está programado con '0' después de un ciclo delta y '1' después de 50 ns, momento en el que no se programan más cambios.

    
respondido por el Amoch

Lea otras preguntas en las etiquetas