pregunta de tiempo VHDL

-2
ENTITY top IS END top;

ARCHITECTURE example OF top IS
  SIGNAL w,x,y,z : integer := 0; -- initialised to 0 (zero)
BEGIN
  p1 : PROCESS(z)
    VARIABLE a : integer := 0; -- initialised to 0 (zero)
  BEGIN
      a := a + 20;
      w <= w + 10;
      x <= a + w AFTER 10 ns;
      y <= a - w AFTER 20 ns;
 END PROCESS;

 p2: PROCESS
 BEGIN
     z <= (x + y) AFTER 30 ns;

     WAIT ON x,y;
 END PROCESS;
END example;

pregunta: ¿por qué z se eleva a 40 a 50 ns en lugar de a 40 ns? Si cambia z a z < = x DESPUÉS DE 30 ns; , ¿por qué la primera actualización de z tiene lugar a las 40 ns?

    
pregunta Yicheng Yang

2 respuestas

2

El problema es que usted especificó un retraso inercial en la asignación de z . Si usa un transporte en su lugar, entonces z cambiará después de 40 ns. Obtienes un retraso de transporte con la palabra clave transport :

z <= TRANSPORT (x + y) AFTER 30 ns;

Con un retraso inercial, las actualizaciones de señal programadas se perderán / anularán si se programa una nueva actualización dentro del tiempo de espera.

    
respondido por el Martin Zabel
3

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:

  1. 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.
  2. 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 .
  3. 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.
  4. El proceso superior suspende los cálculos ahora hasta que z cambie.
  5. El proceso inferior suspende los cálculos ahora hasta que cambien x y y .

En t = 10ns

  1. El valor de x ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
  2. 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

  1. El valor de y ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
  2. 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 .
  3. 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

  1. El valor de z calculado al principio ahora se asigna porque el retraso de 30 ns está arriba. Entonces z se establece en 0.
  2. A z solo se le ha asignado un valor, lo que significa que la lista de sensibilidad para el proceso principal ahora está activada.
  3. Se calculan los nuevos valores para a , w , x , y .

...

En t = 50ns

  1. 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.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas