¿Cómo se sintetiza una variable VHDL mediante herramientas de síntesis?

Conozco dos formas en que una variable VHDL se sintetiza mediante una herramienta de síntesis:

  • Variable sintetizada como lógica combinacional
  • Variable sintetizada como Latch sin querer (cuando una variable no inicializada se asigna a una señal u otra variable)

¿Cuáles son las otras formas en que se puede sintetizar una variable VHDL? (Ejemplo: ¿se puede interpretar como un FF?)

Respuestas (2)

Yo distinguiría tres posibilidades:

  1. Una variable VHDL no tiene ninguna representación de hardware. Supongamos el siguiente ejemplo

    signal a,b,c : integer;  
    ...  
    process ( clk ) is  
    variable var : integer := 0;  
    begin  
    if ( rising_edge(clk) ) then  
    var := a + b;  
    c <= var;  
    end if;  
    end process;
    

    La variable varno está realmente sintetizada como lógica combinatoria en absoluto (suponiendo que esto es lo que se quería decir en la pregunta). Es más bien el lado derecho de la asignación lo a + bque se sintetiza en hardware. Estrictamente hablando, una variable nunca se sintetiza en lógica combinatoria.

  2. Una variable simplemente contiene un resultado intermedio, que se evalúa en el mismo ciclo de reloj -> no se sintetiza hardware (esto es 1) nuevamente), o se evalúa en el siguiente ciclo de reloj -> se sintetiza un flip-flop.

  3. Uno de esos temidos pestillos se infiere en aquellos casos en los que existen ramas condicionales en las que a la variable no se le asigna un nuevo valor (dependiendo de algunas señales) ni un valor predeterminado. Por lo general, este caso sucede sin querer :-)

Sin embargo, el "temido pestillo" solo puede ocurrir fuera de un proceso cronometrado y la mayoría de las personas (según mi experiencia) en estos días no utilizan procesos no cronometrados. Entonces, el temor del pestillo ya no es un problema (en mi humilde opinión): proviene de los viejos tiempos cuando tenía que escribir su lógica combinatoria en un proceso separado para sus chanclas

Si usa el valor en una variable antes de almacenarla, obtiene el valor que se almacenó la última vez que el proceso lo almacenó (en un proceso cronometrado, el valor de un ciclo de reloj anterior). Que se sintetiza como un registro o FF.

Por supuesto, en el primer ciclo de reloj obtiene basura, a menos que haya inicializado la variable en una cláusula de reinicio.