Inicializando señales de entrada en VHDL

0

Toma este ejemplo:

port(clk        : in  std_logic; 
 areset_n       : in  std_logic; 
 ena            : in  std_logic; 
 load           : in  std_logic;
 load_val       : in  unsigned(cnt_width-1 downto 0) := (others => '0');  
 counter_value  : out unsigned(cnt_width-1 downto 0) := (others => '0')  
);

contador_valor debe inicializarse a algún valor ya que es mi salida, pero ¿es necesario inicializar también los valores de entrada?

¿Todas las señales deben inicializarse a 0, incluyendo clk y reset?

    
pregunta Fredrik

2 respuestas

1

No utilice los valores iniciales en VHDL sintetizable, es decir, VHDL que crea un circuito lógico en su FPGA / CPLD / ASIC objetivo. Use un término de reinicio, controlado por la entrada de reinicio que tiene.

Esto hace que su diseño sea mucho más portátil que otros dispositivos y le permite colocar otra IP más fácilmente. En mi experiencia, la gran mayoría de IP que encontrará usará términos de restablecimiento, por la misma razón de portabilidad.

En un FPGA basado en RAM, los valores iniciales generalmente se agregan al archivo de configuración durante la síntesis y, por lo tanto, se cargan en los registros relevantes durante la configuración del dispositivo. Esto no es cierto para los FPGA basados en flash o muchos CPLD, así como para los ASIC, por lo que el mismo diseño puesto en estos dispositivos ahora no funcionará y la fuente puede ser difícil de rastrear.

El uso de un término de restablecimiento elimina todos estos problemas. Desea tener módulos de diseño que pueda incluir en otros diseños en el futuro y no sabe en qué estará trabajando para entonces.

Puedes usar los valores iniciales de forma suficientemente segura en bancos de prueba.

Recuerde que esto es un circuito lógico digital, no un programa de computadora. Las entradas no necesitan un valor de restablecimiento aquí, la puerta lógica que las controla necesita uno.

Si tiene un restablecimiento externo, no olvide sincronizarlo con su reloj antes de usarlo. Esto ocurre en caso de que la entrada de restablecimiento cambie justo cuando su registro cronometrado ve su ventaja activa en su reloj y posiblemente sea metaestable. Utilice un registro de desplazamiento para producir un restablecimiento de al menos (digamos) 4 relojes de largo que se activan de forma asíncrona y se nieguen de forma síncrona, como:

  signal resetSR : std_logic_vector(3 downto 0);

  process(RESET_N, CLK) is
  begin
    if (RESET_N = '0') then
      resetSR  <=  "1111";
    elsif rising_edge(CLK) then
      resetSR  <=  resetSR(2 downto 0) & '0';
    end if;
  end process;
  rst  <=  resetSR(3);

Si no tiene un reinicio externo para usar para su reinicio interno, puede producir uno en un FPGA basado en RAM usando (me atrevo a decirlo) una instancia solitaria de un valor inicial. Con grandes comentarios por todos lados, llamar la atención de otros ingenieros que pueden migrar su diseño en el futuro. Puede crear un (por ejemplo) registro de desplazamiento de 4 bits con el valor inicial de "1111" y cambiar un '0' en él a una velocidad de reloj. Utilice el último bit de este registro de desplazamiento como su reinicio. Será '1' para los primeros cuatro relojes después del reinicio, luego '0' a partir de entonces.

Evita hacer esto si tienes una señal de reinicio externa.

  -- THIS SIGNAL IS THE ONLY USE OF AN INITIAL VALUE.
  -- THIS MAY NEED TO CHANGE WHEN MIGRATING THIS DESIGN TO OTHER DEVICES.
  signal resetSR : std_logic_vector(3 downto 0) := "1111";

  process(CLK) is
  begin
    if rising_edge(CLK) then
      resetSR  <=  resetSR(2 downto 0) & '0';
    end if;
  end process;
  rst  <=  resetSR(3);
    
respondido por el TonyM
0

Es posible inicializar los registros, no se pueden inicializar los cables porque son simples conexiones a los registros (que, la mayoría de las veces, deben inicializarse).

Cuando el FPGA basado en RAM se configura (por ejemplo, la serie Altera Cyclone), inicializa los registros a 0 (que yo sepa), por lo tanto, es una tarea del diseñador asegurarse de que haya una señal externa a FPGA que actúe como reiniciada, lo que activa los registros de FPGA 'Inicialización según el estado inicial de la aplicación.

Desde el punto de vista de HDL, como usted pregunta, los registros pueden ser controlados (incluida la inicialización) en un bloque de proceso / siempre; la entrada que va desde los registros no se puede inicializar porque para la inicialización necesita una acción de salida ("escribir"), la entrada solo se puede "leer".

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas