Problemas de sincronización y diseño de tuberías

2

Estamos trabajando en un procesador canalizado escrito en VHDL, y tenemos algunos problemas con el tiempo, la sincronización y los registros en el simulador (el código no necesita ser sintetizable, porque lo vamos a ejecutar solo en el simulador) .

Imagina que tenemos dos etapas de procesador, A y B, con un registro de canalización en el medio:

  • La etapa A del procesador es combinatoria y no depende del reloj
  • El registro de tubería R, es un registro y, por lo tanto, cambia su estado en el flanco ascendente del reloj.
  • La etapa B del procesador es una etapa compleja y tiene su propia máquina de estado y, por lo tanto, cambia su estado y realiza operaciones dentro de un proceso VHDL, gobernado por el flanco ascendente del reloj.

La configuración sería la siguiente

   _______   ___   _______
   |     |   | |   |     |
---|  A  |---|R|---|  B  |---
   |_____|   |_|   |_____|

Con esta configuración, hay un problema de tiempo:

  • t = 0: A obtiene datos y realiza sus operaciones
  • t = 1: en el flanco ascendente, R actualiza sus datos con la salida de A.
  • t = 2: en el flanco ascendente, B obtiene los valores de R, actualiza su estado y da una salida.

Nos gustaría que B cambiara su estado y generara una salida en t = 1, pero también necesitamos el registro en el medio para que funcione la tubería.

Una solución sería actualizar el registro R en el flanco descendente. Pero entonces, estamos asumiendo que todas las etapas del procesador se ejecutan en medio ciclo de reloj, y la otra mitad es un poco inútil.

¿Cómo suele resolverse este problema en canalizaciones?

    
pregunta markmb

1 respuesta

1

Después de hablar con varias personas, creo que encontramos la solución adecuada al problema.

La etapa B, que tiene su propia máquina de estados, no debe tener un proceso VHDL activado en el flanco ascendente. Debe tener el estado de la máquina de estado como una señal que se almacena en el registro R.

En más detalle, estas nuevas señales deben agregarse:

  • stat : estado actual de la máquina de estado, salida de R, entrada a B
  • state_next : siguiente estado de la máquina de estado, entrada a R, salida desde B

Lo que significa que el estado se cambia para state_next cada flanco ascendente, y B ahora puede trabajar sin un proceso.

    
respondido por el markmb

Lea otras preguntas en las etiquetas