diferencia entre el uso de la lógica de restablecimiento frente a los valores iniciales en las señales

2

Digamos que tengo una señal, puedo asignar un valor inicial de cero O puedo ponerlo en cero al RESTABLECER. He visto a mis compañeros de trabajo utilizando los dos métodos indistintamente. Solo quiero ver la opinión de otros sobre esto.

Supongamos que en mi código la señal de la bandera es un flip-flop

Ejemplo (usando el valor inicial):

architecture arch of xxx is

    signal flag : STD_LOGIC := '0';

begin
    process (clk) begin
        if rising_edge(clk) then
            -- do something
        end if;
    end process;
end arch;

Ejemplo (usando el valor de reinicio):

architecture arch of xxx is

    signal flag : STD_LOGIC;

begin
    process (clk,rst) begin
        if (rst = '1') then
            flag <= '0';
        elsif rising_edge(clk) then
            -- do something
        end if;
    end process;
end arch;
    
pregunta wildwildwilliam

1 respuesta

1

Algunas comparaciones que se me ocurren rápidamente:

  • Los valores iniciales en flipflops solo funcionan en FPGA (no en ASIC)
  • Debe reinicializar todo el dispositivo para volver a los valores iniciales de FPGA (al menos hasta que comience a realizar la reconfiguración parcial). Esto toma tiempo, mientras que un reinicio toma un solo ciclo de reloj.
  • Puede tener una variedad de señales de reinicio que le permiten configurar diferentes partes del dispositivo a su configuración original.
  • En los FPGA, puede usar inicializadores para establecer los valores en un bloque de ROM o RAM, no puede hacerlo con una cláusula de restablecimiento.

En los viejos tiempos, algunos sintetizadores de FPGA simplemente ignoraban los valores iniciales y configuraban todo para que se inicializara en '0', por lo que algunas pautas de diseño de FPGA aún no son compatibles con los inicializadores explícitos.

Como comentó Joe, los valores iniciales pueden parecer no funcionar en señales que no son flipflops, lo que puede causar confusión. Esto se debe a que (generalmente) las señales no flipflop son impulsadas por lógica pura, lo que significa que toman un valor tan pronto como la simulación comienza a ejecutarse en función de las entradas de esa lógica:

 s <= x and y; -- any initialiser will be overwritten by x and y immediately.

Un ejemplo donde esto no sucede (lo que a veces es útil en bancos de pruebas, pero no sintetizable):

signal s : std_logic := '0';

entonces

s <= '1' after 100 ns; -- s will be '0' to start with and '1' after 100 ns
    
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas