¿Debo usar un búfer o una salida simple con una señal?

3

Cuando implemento un divisor de reloj, a menudo me pregunto si debo usar un búfer o una salida regular con una señal. Considere los siguientes códigos:

Opción 1 - Salida con señal

library ieee;
use ieee.std_logic_1164.all;

entity divider is
port (Clock : in bit;
      OutputFreq : out bit);
end divider;

architecture behave of divider is
signal Counter : integer range 0 to 155;
signal CurrentState : bit;
begin
process(Clock)
begin

if Clock'event and Clock = '1' then
    if Counter < 155 then
        Counter <= Counter + 1;
    else
        Counter <= 0;
        CurrentState <= not CurrentState;
    end if;
end if;

OutputFreq <= CurrentState;
end process;
end behave;

Opción 2 - Amortiguador

library ieee;
use ieee.std_logic_1164.all;

entity divider is
port (Clock : in bit;
      OutputFreq : buffer bit);
end divider;

architecture behave of divider is
signal Counter : integer range 0 to 155;
begin
process(Clock)
begin

if Clock'event and Clock = '1' then
    if Counter < 155 then
        Counter <= Counter + 1;
    else
        Counter <= 0;
        OutputFreq <= not OutputFreq;
    end if;
end if;

end process;
end behave;

Ambos códigos producen la misma salida exacta. Entonces, ¿cuál debería usar y por qué?

    
pregunta Eminem

1 respuesta

1

Iría con la solución 1 y agregaría un flip-flop explícito para la salida.

La única razón es que algunas herramientas de síntesis y la literatura no recomiendan el uso de puertos de búfer. Si hay una razón real detrás de esto, o si esto se ha convertido en una programación de culto de la carga, no lo sé.

Una ventaja de usar un búfer en lugar de una señal dedicada es guardar la señal. Ese es un identificador menos que importa. En diseños complejos con muchas señales que hacen que su código sea más fácil de leer y entender.

Por cierto, puedes optimizar tu código un poco:

if Clock'event and Clock = '1' then
    if Counter = 155 then
        Counter <= 0;
        CurrentState <= not CurrentState;
    else
        Counter <= Counter + 1;
    end if;
end if;

El uso de un operador de comparación igual en lugar de un operador menor / mayor probablemente usará menos recursos de FPGA porque la comparación de igual se puede hacer con una mano llena de inversores y una gran compuerta AND. Esto se absorbe en unas pocas tablas de búsqueda de FPGA. La comparación de dos números por menores o mayores necesita más recursos como cadenas de transporte, ya que básicamente es un subtractor que se necesita.

    
respondido por el Nils Pipenbrinck

Lea otras preguntas en las etiquetas