Está especificando WAIT ON x,y
en su proceso final junto con AFTER
en la asignación a z
. Estos combinados con su otro proceso provocan este retraso.
No soy una persona con VHDL (nunca lo usé), pero por lo que puedo decir de una breve lectura de this , this y esto que proporciona explicaciones de las declaraciones VHDL wait
y after
y process
respectivamente, sucederá lo siguiente.
En t = 0:
-
z
se calcula como x+y
, que al principio es 0 + 0 = 0. Pero este valor aún no está asignado (debido a la declaración AFTER
). Se asignará en t = ahora + 30ns.
-
a
se establece en 20 usando una asignación de bloqueo , lo que significa que dentro de ese proceso se calcula antes de w
, x
o y
.
- El siguiente
w
se establece en 10. Pero al mismo tiempo, se calculan (pero aún no se asignan) el siguiente valor para x
y y
. Estos se basan en el valor antiguo de w
y el nuevo valor de a
. Como resultado, los valores calculados son x
será 20 + 0 = 20 y y
será 20-0 = 20.
- El proceso superior suspende los cálculos ahora hasta que
z
cambie.
- El proceso inferior suspende los cálculos ahora hasta que cambien
x
y y
.
En t = 10ns
- El valor de
x
ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
- Esto activa
z
para calcularse como x+y
= 20 + 0 = 20. Pero aún no asigna el valor. En su lugar, lo programa para t = ahora + 30 = 40ns.
En t = 20ns
- El valor de
y
ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
-
y
acaba de cambiar, lo que significa que el proceso final se activa nuevamente. Esto significa que el valor de z
se calcula como x+y
, que es 20 + 20 = 40. Pero esto no se asignará hasta que t = ahora + 30 = 50ns debido a la declaración AFTER
.
- Debido a que un nuevo valor para
z
se acaba de calcular y programar para t = 50ns, el valor calculado en t = 10ns que se programó para aplicarse en t-40ns se cancela.
En t = 30ns
- El valor de
z
calculado al principio ahora se asigna porque el retraso de 30 ns está arriba. Entonces z
se establece en 0.
-
A
z
solo se le ha asignado un valor, lo que significa que la lista de sensibilidad para el proceso principal ahora está activada.
- Se calculan los nuevos valores para
a
, w
, x
, y
.
...
En t = 50ns
-
A
z
se le asigna el valor que se calculó en t = 20ns. En otras palabras, solo ahora z
se convierte en 40.
Básicamente, AFTER
hace que los valores se calculen Inmediatamente , pero no se asignen para el retraso especificado. Además, si aún no se han asignado valores calculados previamente antes de que se calcule el siguiente valor, se cancela y nunca se asigna.
z
se calcula para que sea 40 en t = 20ns, pero dado que hay un retraso de 30ns especificado, el valor no se actualiza hasta que t = 20 + 30 = 50ns.
Este tipo de retrasos no se usan en síntesis reales, sino que se usan para simular retrasos de propagación para identificar problemas de tiempo o condiciones de carrera. A menos que tenga una razón específica para usarlos (es decir, hacer un banco de pruebas), no los use. No es así como se utiliza HDL para la síntesis: en su lugar, debería estar usando la sincronización de borde del reloj.