Dos declaraciones de proceso VHDL que leen la misma señal y una la modifican

0

Digamos que tenemos dos declaraciones de proceso en VHDL que reaccionan en el mismo borde del reloj.

Al lado del reloj también tenemos, por ejemplo, la señal de reinicio. Sé que solo un proceso puede modificar la señal de restablecimiento, de lo contrario, obtenemos un error de varios controladores.

Ahora asumamos que uno de los procesos está modificando la señal y el otro la está leyendo. Que se evaluará primero. O en otras palabras, ¿se activará el cambio de señal en ambos procesos y el código funcionará como se esperaba?

Para aclarar aquí está el código VHDL.

-- First process
process (clk, reset)
begin
    if rising_edge(clk) and reset= '1' then
        -- do work
    end if;
end process;

-- Second process
process (clk)
begin
    if rising_edge(clk) then
        case reset is
            when '1' => reset <= '0';
            when '0' => reset <= '1';
        end case;
    end if;
end process;

El código es hipotético y totalmente irrelevante. Pero, ¿se ejecutará el primer proceso en cualquier otro reloj o no?

Basado en una prueba, esto sucederá. Pero puedo asumir que esto siempre sucederá o no.

Gracias de antemano.

    
pregunta Martin Tramšak

2 respuestas

3

Hay varios matices que entran en juego aquí.

  1. La simulación VHDL se divide en una fase de actualización de señal y una fase de ejecución. La fase de actualización de la señal siempre termina antes de que comience la fase de ejecución.
  2. Las asignaciones de señales se evalúan durante una fase de ejecución, pero nunca se actualizan hasta la siguiente fase de actualización de señales. Si no hay una demora en la señal, la señal se programará para actualizarse en el siguiente ciclo delta (cero en el reloj de pared, pero está ahí para ordenar). Si hay un después con un valor de tiempo mayor que 0 ns, entonces la señal se programará para actualizarse en la primera ejecución del tiempo de simulación = tiempo actual + después del valor de tiempo.

Por lo tanto, su señal de restablecimiento actualizará un ciclo delta después del reloj. La parte de "hacer trabajo" de su proceso verá restablecer exactamente un ciclo de reloj después del ciclo de reloj en el que se configuró. El modelo de simulación VHDL es estable como una roca, por lo que no habrá incertidumbre acerca de cómo se ejecuta este proceso en particular (como lo sugiere @MaximGi).

En un diseño de hardware, has reiniciado un flip-flop y luego has enviado esa señal a otras piezas de tu diseño.

Desde una perspectiva de portabilidad de síntesis, le advierto que no ponga ninguna otra lógica en la misma condición que el reloj. En su lugar, recomendaría volver a escribir su proceso de la siguiente manera. Tenga en cuenta que su proceso es correcto para la simulación, es solo que algunas de las herramientas de síntesis son complicadas.

-- First process
process (clk)
begin
    if rising_edge(clk) then
      if reset= '1' then
        -- do work
      end if ; 
    end if;
end process;

Tampoco hay necesidad de restablecer en esta lista de sensibilidad, ya que rising_edge (Clk) solo será cierto en el ciclo delta exacto en el que cambia el reloj. Solo necesita restablecer en una lista de sensibilidad cuando usa un restablecimiento asíncrono.

    
respondido por el Jim Lewis
-2

Los procesos funcionan en paralelo en vhdl. Por lo tanto, si se materializa (presionando el botón) el restablecimiento a '1', el proceso 2 se configurará en '0' en el siguiente flanco ascendente y la posibilidad de que se ejecuten las instrucciones de 'trabajo' en el proceso 1 es Totalmente aleatorio, no debes usar este diseño, es inestable. Supongo que la posibilidad será mayor si el proceso 1 se ejecuta primero, ya que se activa con el reloj y se reinicia, mientras que el proceso 1 se activa solo con el reloj. Sin embargo, todavía sugiero que cambie su diseño y ponga las instrucciones de "reinicio del restablecimiento" en el mismo proceso para la estabilidad.

    
respondido por el MaximGi

Lea otras preguntas en las etiquetas