VHDL: ¿cómo se ejecuta un proceso simultáneamente con otros procesos y componentes mientras se ejecuta de forma secuencial?

4

Tal como lo dice el título, ¿cómo ocurre esto? Estoy tratando de envolver mi cabeza en torno a los procesos frente a los componentes y no entiendo cómo funciona este mecanismo. Puede que esta no sea una pregunta adecuada, así que, por favor, ayúdame a formularla para que sea más específica, pero realmente necesito entender este concepto para seguir avanzando en mi diseño.

Por ejemplo:

count: process (x)
  variable cnt : integer := -1;
begin
  cnt:=cnt+1;

  if (cnt > '9') then
    cnt:=0;
    OVERFLOW <= '1';
  endif;
end process;

Entiendo que la instrucción if depende de la instrucción de incremento anterior. También entiendo por qué el orden es importante (lógicamente tiene sentido, verifico la condición después de la actualización), pero lo que no tiene sentido para mí es sin ningún tipo de mecanismo de reloj ni ningún otro mecanismo secuencial, cómo OVERFLOW (que es una señal en esto) ejemplo, no se muestra) ¿se actualiza su valor simultáneamente con todas las otras señales en el diseño cuando depende de que se actualice primero cnt? Además, cualquier otra señal otra que tenga procesos implícitos asociados con OVERFLOW se asigna de manera simultánea, lo que las hace dependientes de cnt por proxy también.

    
pregunta SRM

2 respuestas

3

Las señales siempre se evalúan de forma concurrente. Las variables son realmente solo una conveniencia para hacer cálculos o usarse como ayudantes en loops o genera. En general, contienen evaluaciones combinatorias o se utilizan como iteradores. En ese sentido, producen síntesis, pero la secuencia en su asignación no se sintetiza per se, nunca harán un cambio de señal más de una vez en una sola pasada de un proceso (las señales conservan el último valor asignado a ellas en un proceso).

Esta frase que uso "un solo paso de un proceso" suena muy académica y no transmite correctamente su relación con el hardware (el hardware en este contexto es básicamente puertas lógicas y chanclas). El proceso se evalúa cuando cambia cualquier señal en su lista de sensibilidad. Lo que esto significa en el hardware es que las entradas a un bloque combinatorio cambiaron, por lo tanto, es posible que las salidas o salidas de este bloque también cambien. Una señal puede asignarse varias veces en un proceso, pero esta es solo una manera de codificar la prioridad en las evaluaciones (al describir cómo funciona el bloque combinatorio), no los cambios reales en las salidas de manera secuencial. Por eso se dice que las señales conservan la última asignación en un proceso.

La mejor manera de entender todo esto es ver cómo los bloques digitales que puede ver en un esquema están codificados en vhdl (o el idioma de su preferencia). Cuando aprendas a usarlo y comienzas a usar variables como "ayudantes", verás por qué son lo que son, por qué no son lo mismo que las señales y por qué la secuencia en su asignación dentro de los procesos no se sintetiza como tal.

    
respondido por el apalopohapa
1

Esta es una pregunta difícil de responder. No porque la respuesta sea difícil, sino porque requiere que retuerzas tu cerebro de una manera que es difícil de describir.

Lo más importante a recordar es que una vez que se coloca en el hardware, todo se ejecuta simultáneamente. Incluso si está escrito como si fuera secuencial.

La segunda cosa es que incluso si está escribiendo lógica secuencial, aún se ejecuta al mismo tiempo. En este caso, la lógica que resulta de su código se comportará de la misma manera que su código secuencial, pero en sí misma no será secuencial. Por supuesto, esto puede resultar en un código que no se puede convertir en lógica digital. Cuando escribimos VHDL hay dos tipos de código: sintetizable y simulable. El código sintetizable se puede convertir en un FPGA o ASIC. Mientras que el código simulable solo se puede ejecutar en un simulador y no puede generar hardware válido.

El código simulable es útil para bancos de pruebas y similares. Otras cosas que hacen que el código no sea sintetizable son ciertas declaraciones de espera, algunos accesos a archivos y el uso de tipos de datos que no son compatibles con la síntesis. El código simulable se ejecuta de forma secuencial, no concurrente.

Finalmente, tu código es muy incorrecto. La lista de sensibilidad es incorrecta. No está sincronizado (no es una lógica síncrona), y una vez que OVERFLOW alcance un nivel alto, nunca volverá a bajar.

Si su código se convirtiera en lógica, se optimizaría hasta "OVERFLOW < = '1'". Dado que no tiene reloj, se asume que cnt va de -1 a 9 en un instante, lo que hace que se configure OVERFLOW de inmediato.

    
respondido por el user3624

Lea otras preguntas en las etiquetas