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);