Table of Contents
Entender el Reinicio Asincrónico en Diseño Digital
Implementar la lógica de reset asincrónica en VHDL es un aspecto fundamental de crear diseños digitales robustos y fiables. Ya sea que esté desarrollando sistemas basados en FPGA o implementaciones ASIC, entender cómo implementar correctamente los mecanismos de reinicio es crucial para asegurar que sus circuitos puedan ser inicializados de forma fiable a un estado conocido. En el diseño digital, se utilizan reajustes para introducir un circuito en un estado predefinido después de potenciación.
Un reseteo asincrónico es una señal de control que opera independientemente de la señal del reloj, permitiendo que las volteretas y otros elementos secuenciales se reiniciarán inmediatamente después de la aserción. Un reset asincrónico se activa tan pronto como se afirma la señal de reset. Esta característica de respuesta inmediata distingue los resetes asincrónicos de sus contrapartes sincronizadas y los hace particularmente valiosos en escenarios de diseño específicos.
Lo que hace que el reasentamiento asincrónico Diferente
El circuito de Reset asincrónico es independiente del reloj de funcionamiento gratuito. Lo que significa que el circuito de Reset no tiene conocimiento de la entrada del reloj. Esta independencia del dominio del reloj proporciona varias características únicas que los diseñadores deben entender y contabilizar en sus implementaciones.
La distinción clave entre restablecimientos asincrónicos y sincronizados radica en su relación de tiempo con el reloj del sistema. Un restablecimiento sincronizado activa en el borde del reloj activo cuando se afirma la señal de restablecimiento. En contraste, restablecimientos asincrónicos tienen efecto inmediatamente, independientemente del estado del reloj o el momento. Esta diferencia fundamental tiene implicaciones significativas para la metodología de diseño, el análisis de tiempo y el comportamiento general del sistema.
Cuándo utilizar el reset asincrónico
Uno de los beneficios clave es su capacidad para proporcionar funcionalidad de reset inmediata e independiente, ya que la señal de reset se puede afirmar en cualquier momento, independiente de la señal del reloj. Esto puede ser particularmente útil en situaciones en las que un sistema necesita ser reajustado inmediatamente, sin esperar el próximo ciclo del reloj. Esto hace que los reseteos asincrónicos especialmente valiosos durante las secuencias de encendido y las condiciones de falla críticas.
El reinicio puede ocurrir cuando el reloj no se ejecuta, por ejemplo durante la inicialización de la energía o cuando las fuentes del reloj son inestables. Los resetes asincrónicos, por definición, no necesitan un reloj para estar presente y podría ser necesario utilizar este tipo de reajuste en ciertas situaciones – por ejemplo, los primitivos MMCM y PLL tienen un reseteo asincrónico para asegurarse de que van a un estado conocido, incluso si el reloj no está.
Implementación de Reiniciamiento Asincrónico en VHDL
La aplicación adecuada de la lógica de reseteo asincrónico en VHDL requiere una atención cuidadosa a las listas de sensibilidad de estilo de codificación y de proceso. El enfoque estándar implica crear un proceso que sea sensible tanto a la señal de reloj como a la señal de reseteo, asegurando que el reinicio pueda tener efecto inmediatamente cuando se afirma.
Estructura básica de restauración asincrónica
La estructura fundamental para implementar el reseteo asincrónico en VHDL sigue un patrón bien establecido. El código snippet a continuación muestra una implementación estándar de un proceso sincronizado con un reset sincronizado. Para el reset asincrónico, la lista de sensibilidad del proceso debe incluir tanto el reloj como las señales de reseteo.
Aquí hay un ejemplo básico de la implementación de reajuste asincrónico:
library IEEE;
use IEEE.std_logic_1164.all;
entity dff_async_reset is
port(
clk : in std_logic;
reset : in std_logic;
d : in std_logic;
q : out std_logic
);
end dff_async_reset;
architecture behavioral of dff_async_reset is
begin
process(clk, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clk) then
q <= d;
end if;
end process;
end behavioral;
En esta implementación, el proceso es sensible a ambos clk] y reset. Cuando se afirma la señal de reinicio (lógica '1' en este caso), la salida q se establece inmediatamente a '0', independientemente del estado del reloj.
Registro multi-Bit con el reset asincrónico
Para diseños más complejos que implican registros multi-bit o máquinas estatales, el mismo principio se aplica pero con señales adicionales para gestionar. Aquí está un ejemplo de un registro de 8-bit con reset asincrónico:
library IEEE;
use IEEE.std_logic_1164.all;
entity register_async is
port(
clk : in std_logic;
reset : in std_logic;
d_in : in std_logic_vector(7 downto 0);
q_out : out std_logic_vector(7 downto 0)
);
end register_async;
architecture behavioral of register_async is
begin
process(clk, reset)
begin
if reset = '1' then
q_out <= (others => '0');
elsif rising_edge(clk) then
q_out <= d_in;
end if;
end process;
end behavioral;
El [otros = golpegt; '0']] constructo proporciona una manera conveniente de inicializar todos los pedazos del vector a cero, asegurando una cobertura completa de reinicio en todo el ancho del registro.
Contra la implementación con el reinicio Asincrónico
Los contadores son bloques de construcción comunes en diseños digitales y se benefician significativamente de la implementación de reajuste adecuada. Aquí está un ejemplo completo de un contador con reseteo asincrónico:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity counter_async is
port(
clk : in std_logic;
reset : in std_logic;
enable : in std_logic;
count : out std_logic_vector(7 downto 0)
);
end counter_async;
architecture behavioral of counter_async is
signal count_reg : unsigned(7 downto 0);
begin
process(clk, reset)
begin
if reset = '1' then
count_reg <= (others => '0');
elsif rising_edge(clk) then
if enable = '1' then
count_reg <= count_reg + 1;
end if;
end if;
end process;
count <= std_logic_vector(count_reg);
end behavioral;
Este contador muestra la estructura jerárquica de la lógica condicional en las implementaciones de reajuste asincrónico. El cheque de reinicio se produce primero y toma la máxima prioridad, seguido por la detección del borde del reloj, y finalmente la condición de habilitación para la operación normal.
Máquina de Estado con Reinicio Asincrónico
Las máquinas estatales finitas (FSM) son componentes críticos en los sistemas digitales, y la implementación adecuada de reajuste asegura que siempre comienzan en un estado conocido y seguro. Aquí está un ejemplo de un FSM simple con reset asincrónico:
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm_async is
port(
clk : in std_logic;
reset : in std_logic;
input : in std_logic;
output: out std_logic
);
end fsm_async;
architecture behavioral of fsm_async is
type state_type is (IDLE, ACTIVE, DONE);
signal current_state, next_state : state_type;
begin
-- State register with asynchronous reset
process(clk, reset)
begin
if reset = '1' then
current_state <= IDLE;
elsif rising_edge(clk) then
current_state <= next_state;
end if;
end process;
-- Next state logic
process(current_state, input)
begin
case current_state is
when IDLE =>
if input = '1' then
next_state <= ACTIVE;
else
next_state <= IDLE;
end if;
when ACTIVE =>
next_state <= DONE;
when DONE =>
next_state <= IDLE;
end case;
end process;
-- Output logic
output <= '1' when current_state = ACTIVE else '0';
end behavioral;
Esta implementación de FSM separa el registro estatal (con reajuste asincrónico) de la lógica de próximas estados combinados, siguiendo las mejores prácticas para el diseño de máquinas estatales. El reseteo asegura que el FSM siempre comienza en el estado IDLE, proporcionando un comportamiento de inicialización predecible.
Desafíos críticos con el reinicio asincrónico
Mientras que los reseteos asincrónicos ofrecen respuesta inmediata y funcionamiento independiente del reloj, introducen varios desafíos que los diseñadores deben abordar cuidadosamente para garantizar un funcionamiento fiable.
Metastabilidad y Reiniciar la Desafirmación
El reto más significativo con los reseteos asincrónicos ocurre durante la desarrección del reset (liberación). Sin embargo, los reseteos asincrónicos tienen un problema importante: la desarticulación del reset no está garantizada a ocurrir en el mismo borde del reloj para todos los primitivos sincronizados en el diseño. Esto significa que diferentes partes del diseño pueden salir del reset en diferentes momentos, no hay control de la secuenciación del reset.
Sin embargo, cuando el reset se desgasta y no pasa la recuperación (μtSU) o la eliminación (μtH) de tiempo (el análisis de recuperación y eliminación de Analizador de Timing verifica ambas veces), se dice que el borde ha caído en la zona de metástasis. Se requiere tiempo adicional para determinar el estado correcto, y el retraso puede hacer que el tiempo de configuración no se registre en el sistema, lo que conduce a la falla de intermitir.
Reiniciar la distribución y el tiempo
El problema exacerba cuando se consideran grandes diseños de dominios de varias horas. Además de los problemas de sincronización, la distribución de un reseteo asincrónico a millones de volteretas es difícil, pidiendo técnicas similares a CTS (Sintesis del árbol del reloj) y que requieran un área similar y recursos de enrutamiento. Esto hace que la distribución del reset sea una preocupación crítica en los diseños modernos, complejos de FPGA y ASIC.
La operación de liberación de reseteo asincrónico debe coordinarse con la señal de reloj lógico sincrónico para eliminar los fallos de sincronización debido a la posible contención entre el reset y el reloj. Una falta de dicha coordinación conduce a fallas intermitentes en el encendido. Estos fallos pueden ser particularmente problemáticos porque pueden no aparecer durante las pruebas iniciales pero se manifiestan en entornos de producción.
Sensibilidad de la grieta
Las señales de reseteo asincrónico son inherentemente sensibles a los fallos y el ruido en la línea de reset. A diferencia de los resetes sincronizados, que se muestren sólo a los bordes del reloj y por lo tanto tienen algunos filtros naturales, los reseteos asincrónicos responden a cualquier transición en la señal de reset. Esta sensibilidad significa que el reajuste apropiado de señalización y routing se convierten en consideraciones de diseño crítico.
Reiniciar técnicas de sincronización
Para hacer frente a los desafíos asociados con la desactivación de reset asincrónica, los diseñadores emplean comúnmente técnicas de sincronización de reinicio que combinan los beneficios de la asincrónica aserción con la desarrección sincrónica.
Asserto asincrónico, desistimiento sincrónico
Podemos afirmar el reseteo sincronizadamente y des-assertarlo asincrónicamente. Tal circuito se llama sincronizador de reset. Este enfoque, a menudo llamado "async assert, sync deassert", proporciona lo mejor de ambos mundos: capacidad de reset inmediata cuando sea necesario, con liberación controlada y sincronizada para evitar problemas de metástabilidad.
Aquí está una implementación VHDL de un sincronizador de reset:
library IEEE;
use IEEE.std_logic_1164.all;
entity reset_synchronizer is
port(
clk : in std_logic;
async_reset: in std_logic;
sync_reset : out std_logic
);
end reset_synchronizer;
architecture behavioral of reset_synchronizer is
signal reset_sync_reg : std_logic_vector(1 downto 0);
attribute ASYNC_REG : string;
attribute ASYNC_REG of reset_sync_reg : signal is "TRUE";
begin
process(clk, async_reset)
begin
if async_reset = '1' then
reset_sync_reg <= (others => '1');
elsif rising_edge(clk) then
reset_sync_reg <= reset_sync_reg(0) & '0';
end if;
end process;
sync_reset <= reset_sync_reg(1);
end behavioral;
Este sincronizador utiliza un registro de cambios de dos etapas para sincronizar la desarificación del reset. Cuando se afirma el reseteo asincrónico, ambas etapas inmediatamente van a '1'. Cuando se libera el reset, los ceros se desplazan a través del registro sincronizadamente con el reloj, asegurando que la señal de reset sincronización final se desgaste limpiamente en un borde del reloj.
Esto garantizará que los elementos sincronizados dentro de cada dominio del reloj de salida de reset al mismo tiempo (es decir, en el mismo borde del reloj). El atributo ASYNC REG ayuda a las herramientas de síntesis y de localización entender que estos registros forman una cadena de sincronización y deben ser colocados cerca para minimizar los riesgos de metástabilidad.
Sincronización multietapa
Para evitarlo, agregue algunos registros de seguimiento después del registro con el reset asincrónico y utilice la salida de estos registros en el diseño. El número de etapas de sincronización depende de los requisitos específicos y los objetivos de MTBF (Mean Time Between Failures) para su diseño.
Para aplicaciones críticas, puede ser apropiado un sincronizador de tres etapas:
library IEEE;
use IEEE.std_logic_1164.all;
entity reset_sync_3stage is
port(
clk : in std_logic;
async_reset: in std_logic;
sync_reset : out std_logic
);
end reset_sync_3stage;
architecture behavioral of reset_sync_3stage is
signal sync_chain : std_logic_vector(2 downto 0);
attribute ASYNC_REG : string;
attribute ASYNC_REG of sync_chain : signal is "TRUE";
begin
process(clk, async_reset)
begin
if async_reset = '1' then
sync_chain <= (others => '1');
elsif rising_edge(clk) then
sync_chain <= sync_chain(1 downto 0) & '0';
end if;
end process;
sync_reset <= sync_chain(2);
end behavioral;
Cada etapa adicional en la cadena de sincronización reduce la probabilidad de que la metástabilidad se propaga a través de la lógica del diseño, a costa de latencia adicional en la desarrección del reset.
Sincronización de reinicio por bloqueo
En general, uno de estos circuitos sincronizadores será necesario para cada dominio de reloj asincrónico. En diseños de varias horas, cada dominio del reloj debe tener su propio sincronizador de reset para asegurar la secuencia de reset correcto dentro de ese dominio.
Aquí hay una arquitectura de ejemplo para un sistema de dominio de doble h:
library IEEE;
use IEEE.std_logic_1164.all;
entity multi_clock_reset is
port(
clk_a : in std_logic;
clk_b : in std_logic;
async_reset : in std_logic;
reset_a : out std_logic;
reset_b : out std_logic
);
end multi_clock_reset;
architecture behavioral of multi_clock_reset is
component reset_synchronizer is
port(
clk : in std_logic;
async_reset: in std_logic;
sync_reset : out std_logic
);
end component;
begin
-- Reset synchronizer for clock domain A
sync_a: reset_synchronizer
port map(
clk => clk_a,
async_reset => async_reset,
sync_reset => reset_a
);
-- Reset synchronizer for clock domain B
sync_b: reset_synchronizer
port map(
clk => clk_b,
async_reset => async_reset,
sync_reset => reset_b
);
end behavioral;
Esta arquitectura garantiza que cada dominio del reloj tenga una señal de reset debidamente sincronizada, evitando las violaciones de tiempo y problemas de metástabilidad que pudieran surgir mediante un solo reinicio en varios dominios del reloj.
Prácticas óptimas para la implementación de la restauración asincrónica
La aplicación exitosa de la lógica de reajuste asincrónico requiere la adhesión a las mejores prácticas establecidas que se han perfeccionado a través de años de experiencia en la industria y lecciones aprendidas de fracasos del diseño.
Polaridad de Reiniciamiento Consistente
Mantenga la polaridad de reset consistente en todo su diseño. Elija reiniciar activos o activos-bajo y se adhiera a él en todos los módulos. Mientras que la elección entre activos-alto y activos-bajo es a menudo una cuestión de requisitos de la tecnología de convención o de destino, la consistencia es crucial para mantener y reducir errores.
Para los diseños de FPGA, considere la polaridad nativa de reset de los chanclas del dispositivo objetivo. Algunas familias de FPGA tienen recursos de reajuste activos-alto, mientras que otras utilizan activos-bajo. Combinar su diseño con el hardware puede mejorar la utilización de recursos y el tiempo.
Cobertura de reinicio de señal completa
Así que la mejor práctica es: si un proceso sincronizado tiene un reseteo, asegúrese de restablecer todas las señales escritas en el proceso. Este principio se aplica igualmente a las implementaciones de reajuste asincrónico. La cobertura de reinicio incompleta puede llevar a comportamiento imprevisible y problemas de inicialización difíciles de de depurar.
Aquí hay un ejemplo que muestra la cobertura completa de reajuste adecuada:
-- GOOD: All signals reset
process(clk, reset)
begin
if reset = '1' then
signal_a <= '0';
signal_b <= '0';
signal_c <= (others => '0');
elsif rising_edge(clk) then
signal_a <= input_a;
signal_b <= input_b;
signal_c <= input_c;
end if;
end process;
-- BAD: Incomplete reset
process(clk, reset)
begin
if reset = '1' then
signal_a <= '0';
-- signal_b and signal_c not reset!
elsif rising_edge(clk) then
signal_a <= input_a;
signal_b <= input_b;
signal_c <= input_c;
end if;
end process;
Sincronización de reinicio es obligatorio
Siempre utilice sincronizadores de reset para la desmontación asincrónica de reset. La caveat es que necesita sincronizar las fuentes de reset a cada dominio del reloj en su FPGA, es decir, utilizar el sincronizador de reset PietervanStar posted. Esto no es opcional para diseños confiables, es un requisito fundamental.
El enfoque de reajuste sincronizado proporciona varios beneficios:
- Elimina los riesgos de metástabilidad durante la desaceleración del reinicio
- Asegura todos los volteretas en un reinicio de salida de dominio del reloj simultáneamente
- Proporciona inicialización de máquina estatal predecible
- Simplifica el análisis y el cierre de los plazos
- Reduce la probabilidad de fallos intermitentes
Gestión adecuada de la lista de sensibilidad
Para los procesos de reseteo asincrónico, la lista de sensibilidad debe incluir tanto el reloj como las señales de reset. Omitir el reset de la lista de sensibilidad resultará en un desajuste de síntesis-imulación, donde la simulación se comporta de manera diferente del hardware sintetizado.
-- CORRECT: Both clk and reset in sensitivity list
process(clk, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clk) then
q <= d;
end if;
end process;
-- INCORRECT: Missing reset in sensitivity list
process(clk) -- WRONG!
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clk) then
q <= d;
end if;
end process;
Reiniciar el proceso de rotación y distribución de señales
Preste atención a restablecer la routa de señal, especialmente en grandes diseños. Utilice recursos de reseteo global dedicados cuando esté disponible en su FPGA destino. Estos recursos están diseñados específicamente para la distribución de señales de control de bajo flujo como reset.
Para diseños muy grandes, considere implementar una red de distribución de reajuste jerárquica donde un sincronizador de reset primario alimenta sincronizadores secundarios para diferentes regiones o módulos del diseño. Este enfoque puede ayudar a gestionar el fan-out y mejorar el cierre de tiempo.
Evitar mezclar los tipos de reinicio
El gran problema que muchos diseñadores hacen es que mezclan sus resetes sincronizados y asincrónicos juntos para conducir el puerto de reset asinc en el FF. Esta práctica crea escenarios de tiempo complejos y puede llevar a problemas difíciles de diagnosticar.
Si necesita tanto el reseteo de encendido (asincrónico) como las capacidades de reseteo funcional (sincrónico), implemente por separado y documente claramente sus propósitos e interacciones.
Verificación de testbench
Incluye pruebas de reinicio integrales en tus testbenches. Verifique que:
- Reiniciar la aserción correctamente inicializa todos los elementos del estado
- El reinicio puede ser afirmado en cualquier momento durante la operación
- El diseño se recupera correctamente de reset
- Reiniciar la desactivación no causa metástabilidad o violaciones de tiempo
- Múltiples ciclos de reajuste/release funcionan correctamente
Aquí hay una plantilla de testbench que incluye pruebas de reseteo completas:
library IEEE;
use IEEE.std_logic_1164.all;
entity tb_reset_test is
end tb_reset_test;
architecture testbench of tb_reset_test is
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal data : std_logic := '0';
signal q : std_logic;
constant CLK_PERIOD : time := 10 ns;
begin
-- Clock generation
clk <= not clk after CLK_PERIOD/2;
-- DUT instantiation
dut: entity work.dff_async_reset
port map(
clk => clk,
reset => reset,
d => data,
q => q
);
-- Test process
process
begin
-- Test 1: Initial reset
reset <= '1';
wait for 50 ns;
assert q = '0' report "Reset failed" severity error;
-- Test 2: Release reset and verify operation
reset <= '0';
wait for 20 ns;
data <= '1';
wait until rising_edge(clk);
wait for 1 ns;
assert q = '1' report "Normal operation failed" severity error;
-- Test 3: Asynchronous reset during operation
wait for 30 ns;
reset <= '1';
wait for 1 ns;
assert q = '0' report "Async reset failed" severity error;
-- Test 4: Reset release at various clock phases
reset <= '0';
wait for 3 ns; -- Release at arbitrary time
wait until rising_edge(clk);
wait for 50 ns;
-- Test 5: Multiple reset cycles
for i in 1 to 5 loop
reset <= '1';
wait for 15 ns;
reset <= '0';
wait for 25 ns;
end loop;
report "All tests passed" severity note;
wait;
end process;
end testbench;
Asincrónico vs Sincrónico Reiniciar: Hacer la elección
La elección entre un reseteo sincrónico o asincrónico depende de la naturaleza de la lógica que se está introduciendo y de los requisitos del proyecto. Entender los cambios entre estos enfoques es esencial para tomar decisiones de diseño informadas.
Ventajas de la restauración asincrónica
Los reseteos asincrónicos ofrecen varias ventajas convincentes:
- Operación independiente del reloj: El circuito puede ser restaurado incluso cuando el reloj no se ejecuta o es inestable
- Respuesta inmediata: El reinicio toma efecto al instante sin esperar un reloj de borde
- Iniciación de potencia: Permite la inicialización fiable durante secuencias de potencia antes de que los relojes se estabilicen
- Simpler datapath:] A diferencia del reseteo sincronizado, el reseteo asincrónico no se inserta en el datapath, y no afecta negativamente los tiempos de llegada de datos entre los registros.
- Eficiencia de la cereza: Usa pins de reset dedicados en volteretas en lugar de consumir recursos lógicos
Ventajas de la restauración sincrónica
Los reseteos sincrónicos también proporcionan beneficios significativos:
- Tiempo predecible: Los reseteos sincronizados son predecibles (en el borde del reloj) Los reseteos sincronizados son robustos a.o. contra los fallos
- No hay problemas de metástabilidad: Al sincronizar la señal de reset al reloj, los diseñadores pueden asegurar que la operación de reajuste se produce en un punto conocido y estable en el tiempo del sistema, reduciendo el riesgo de comportamiento impredecible.
- Mejor para la síntesis FPGA: Las herramientas de síntesis pueden combinar una señal de reset sincronizada en la lógica para el datapath (es decir, los LUTs que conducen la entrada de voltereta D). Esto reduce el fanout en la señal de reseteo y también el número de conjuntos de control que a su vez mejora el embalaje de dispositivos.
- Compatibilidad primitiva: Si usted está confiando en las herramientas para inferir ciertos primitivos como DPS48s o BRAMs, esto es sólo posible si usted ha codificado un reseteo sincronizado – estos primitivos no soportan los restablecimientos asincrónicos.
Prácticas y recomendaciones de la industria
En general, se recomiendan restablecimientos sincronizados a menos que el circuito particular requiera un reset asincrónico. La elección puede depender de la tecnología utilizada, por ejemplo, algunos bloques FPGA sólo pueden soportar un reseteo sincronizado. Sin embargo, la práctica de la industria varía significativamente entre las comunidades de diseño ASIC y FPGA.
Para los diseños ASIC, los reseteos asincrónicos siguen siendo comunes, especialmente para los escenarios de reajuste de encendido. Para los diseños FPGA, las recomendaciones de los proveedores favorecen cada vez más los resetes sincronizados o el enfoque híbrido de asincrónica aserción con desarrecimiento sincronizado.
Si no, prefiera un reseteo sincronizado. Use resetes asincrónicos sólo con elementos lógicos que explícitamente requieren que (en particular complejos primitivos FPGA y núcleos IP, por ejemplo transceptores y controladores de autobús), e incluso así, trate de utilizar la señal de reseteo sincronizado si es posible.
Técnicas de Reinicio y Patrones
Más allá de la implementación básica de reajuste, varias técnicas avanzadas pueden mejorar la robustez y funcionalidad de la lógica de reset en diseños complejos.
Generación de Reasentamiento
Muchos diseños FPGA requieren un reset de encendido que automáticamente se asienta durante la configuración del dispositivo y se libera después de que los relojes se estabilicen. Aquí está un patrón para generar un reset de encendido confiable:
library IEEE;
use IEEE.std_logic_1164.all;
entity power_on_reset is
generic(
RESET_CYCLES : integer := 16 -- Number of clock cycles to hold reset
);
port(
clk : in std_logic;
por_reset : out std_logic
);
end power_on_reset;
architecture behavioral of power_on_reset is
signal reset_counter : integer range 0 to RESET_CYCLES := RESET_CYCLES;
signal reset_reg : std_logic := '1';
begin
process(clk)
begin
if rising_edge(clk) then
if reset_counter > 0 then
reset_counter <= reset_counter - 1;
reset_reg <= '1';
else
reset_reg <= '0';
end if;
end if;
end process;
por_reset <= reset_reg;
end behavioral;
Este generador de reinicio de encendido utiliza las capacidades de inicialización de FPGA para iniciar el contador a su máximo valor, asegurando que el reinicio se asienta inmediatamente después de la configuración. El reset se mantiene afirmado para un número programable de ciclos de reloj, proporcionando tiempo para PLLs y otros circuitos para estabilizarse.
Aplicación del reasentamiento condicional
En algunos diseños, no todos los registros necesitan ser reajustados. Registros de ruta de datos que están garantizados para ser cargados con datos válidos antes de usar pueden omitir a menudo la lógica de reseteo, ahorro de recursos y mejora de tiempo. Sin embargo, la lógica de control y las máquinas estatales siempre deben incluir reinicio.
architecture behavioral of mixed_reset is
signal control_state : state_type;
signal data_pipeline : std_logic_vector(31 downto 0);
begin
-- Control logic: MUST have reset
control_proc: process(clk, reset)
begin
if reset = '1' then
control_state <= IDLE;
elsif rising_edge(clk) then
-- state machine logic
end if;
end process;
-- Data pipeline: No reset needed if always loaded before use
data_proc: process(clk)
begin
if rising_edge(clk) then
if data_valid = '1' then
data_pipeline <= input_data;
end if;
end if;
end process;
end behavioral;
Este enfoque selectivo para reajustar puede reducir significativamente el uso de recursos en grandes diseños, pero requiere un análisis cuidadoso para asegurar que los registros no reajustados no pueden causar problemas durante la inicialización o después de la liberación de reiniciación.
Reiniciar la prioridad y la Jerarquía
En diseños con múltiples fuentes de reajuste (reinicio de potencia, botón de reset externo, reinicio del reloj, etc.), establecer una jerarquía de prioridad clara:
library IEEE;
use IEEE.std_logic_1164.all;
entity reset_manager is
port(
clk : in std_logic;
por_reset : in std_logic; -- Power-on reset (highest priority)
external_reset: in std_logic; -- External reset button
watchdog_reset: in std_logic; -- Watchdog timer reset
system_reset : out std_logic -- Combined system reset
);
end reset_manager;
architecture behavioral of reset_manager is
signal combined_reset : std_logic;
signal sync_reset : std_logic;
begin
-- Combine all reset sources (OR logic)
combined_reset <= por_reset or external_reset or watchdog_reset;
-- Synchronize the combined reset
sync_proc: process(clk, combined_reset)
variable sync_chain : std_logic_vector(1 downto 0) := (others => '1');
begin
if combined_reset = '1' then
sync_chain := (others => '1');
elsif rising_edge(clk) then
sync_chain := sync_chain(0) & '0';
end if;
sync_reset <= sync_chain(1);
end process;
system_reset <= sync_reset;
end behavioral;
Este administrador de reset combina múltiples fuentes de reajuste y proporciona una salida de reset sincronizada única para el resto del diseño, simplificando la distribución de reset y garantizando un comportamiento consistente.
Limitaciones de tiempo y análisis para el reasentamiento asincrónico
Las limitaciones de tiempo adecuadas son esenciales para garantizar que los circuitos de reajuste asincrónicos cumplan con sus requisitos de tiempo y funcionen de forma fiable.
Recuperación y eliminación de la Timación
Las señales de reseteo asincrónico deben cumplir con los requisitos de tiempo de recuperación y eliminación relativos al reloj. TimeQuest analizará sus rutas de reset sincronizadas a través del tiempo de recuperación de reset y eliminación. Estos controles de tiempo aseguran que cuando se desactiva el restablecimiento, no viola la configuración y los requisitos de tiempo.
El tiempo de recuperación es análogo al tiempo de configuración: el tiempo mínimo que el reset debe ser desmontado antes del borde del reloj activo. El tiempo de eliminación es análogo para mantener el tiempo, el tiempo mínimo que el reset debe permanecer desactivado después del borde del reloj activo.
SDC Limita con las vías de reasentamiento
Para el análisis oportuno de tiempo, limite sus rutas de reajuste apropiadamente. Aquí están las restricciones SDC para el reajuste asincrónico:
# Set false path for asynchronous reset assertion
# (Reset assertion is asynchronous and doesn't need timing analysis)
set_false_path -from [get_ports async_reset] -to [all_registers] -setup
# Constrain reset recovery/removal timing
# (Reset deassertion must meet timing)
set_max_delay -from [get_ports async_reset] -to [all_registers] 5.0
# For reset synchronizer chains, preserve registers
set_preserve_register [get_cells reset_sync_reg*]
# Mark synchronizer registers with ASYNC_REG property
set_property ASYNC_REG TRUE [get_cells reset_sync_reg*]
Estas limitaciones le dicen al analizador de tiempo que ignore la asincrónica aserción de reset (ya que está destinado a ser asincrónico) mientras que todavía se verifica que la desistencia de reset cumple con los requisitos de tiempo a través de la cadena de sincronización.
Reiniciar la distribución
En grandes diseños, la distribución de señales de reinicio puede convertirse en un obstáculo de tiempo. Considere estas estrategias:
- Utilice redes de reseteo global dedicadas proporcionadas por el FPGA
- Implementar sincronizadores regionales de reset para reducir el fan-out
- Señales de reinicio de tuberías para diseños muy grandes
- Utilice la colocación de tiempo-conducida para las cadenas de sincronización de reinicio
Pitfalls comunes y cómo evitarlos
Comprender errores comunes en la implementación de reajuste asincrónico ayuda a los diseñadores a evitar costosos depuración de sesiones y posibles fallos de campo.
Pitfall 1: Olvídate de la sincronización de reiniciar
El error más común y peligroso es el uso de reseteo asincrónico sin la sincronización adecuada de la desserción. Esto puede llevar a fallos intermitentes que son extremadamente difíciles de depurar porque dependen de la relación de tiempo precisa entre el reseteo de la liberación y los bordes del reloj.
Solución:] Utiliza siempre un sincronizador de reset para la desmontación de reseteo asincrónico. Haz de esto una práctica estándar en tu metodología de diseño.
Pitfall 2: Listas de sensibilidad incompleta
Omitir la señal de reseteo de la lista de sensibilidad del proceso crea un desajuste de síntesis-imulación. La simulación tratará el reset como sincronizado (sólo comprobado en los bordes del reloj), mientras que la síntesis implementará correctamente reset asincrónico.
Solución:] Siempre incluya tanto el reloj como el reseteo en la lista de sensibilidad para procesos de reseteo asincrónicos. Use VHDL-2008 si sus herramientas lo apoyan, o se meticuloso sobre las listas de sensibilidad.
Pitfall 3: Mezclando estilos de reinicio
Combinando la lógica de reseteo sincronizada y asincrónica, o usando diferentes polaridades de reajuste en diferentes partes del diseño, crea confusión y aumenta la probabilidad de errores.
Solución:] Establecer y documentar una estrategia de reajuste consistente para todo su proyecto. Usar plantillas de codificación y reseñas de diseño para hacer cumplir la coherencia.
Pitfall 4: Insuficiente de la anchura del pulso de reinicio
Si el pulso de restablecimiento es demasiado corto, algunos volteretas pueden no reajustarse adecuadamente, especialmente en grandes diseños con retraso significativo de la distribución de restablecimiento.
Solución:] Asegurar que los pulsos de restablecimiento sean lo suficientemente anchos para garantizar que todos los volteretas reciban la duración adecuada de restablecimiento. Para el restablecimiento de la potencia, mantenga el restablecimiento de ciclos de relojes múltiples después de que los relojes se estabilicen.
Pitfall 5: Ignorando el reinicio en testbenches
Muchos testbenches inadecuadamente prueba la funcionalidad de reseteo, problemas potenciales que faltan que sólo se manifiestan durante secuencias de reset.
Solución: Incluye pruebas de reseteo integral: reinicio inicial, reinicio durante el funcionamiento, ciclos de restablecimiento múltiples y reinicio en varias fases del reloj.
Consideraciones específicas de la FPGA
Los diferentes proveedores y familias de FPGA tienen características y recomendaciones específicas sobre la implementación de reajustes que los diseñadores deben entender.
Xilinx FPGAs
Las FPGAs Xilinx tienen capacidades de inicialización integradas que establecen todos los volteretas a un estado conocido después de la configuración. Esto significa que para muchos diseños, lógica de reseteo explícita puede no ser necesario para la inicialización. Sin embargo, la capacidad de reseteo de tiempo de ejecución todavía es necesaria a menudo.
Xilinx generalmente recomienda reinicios sincronizados para la mayoría de las aplicaciones, ya que se integran mejor con el tejido FPGA y no consumen los recursos dedicados de conjunto/recomposición asincrónicos que podrían utilizarse para otros fines.
Intel (Altera) FPGAs
Los registros en los dispositivos Altera tienen puertos de reajuste asincrónicos, por lo que debe escribir su código de tal manera que los use. La caveat es que usted necesita sincronizar las fuentes de reset a cada dominio del reloj en su FPGA, es decir, utilizar el sincronizador de reset PietervanStar posted.
Si escribes tu código para un reseteo sincronizado, entonces Quartus creará lógica para implementar tu reset sincronizado, es decir, utilizarás sin necesidad las entradas de LUT. Así que el "costo" de usar un estilo incorrecto, es un diseño más grande, y un potencial para aumentar el camino combinatorio en tu diseño.
FPGA Iniciación vs. Runtime Reset
Los proveedores de FPGA no recomiendan usar restablecimientos asincrónicos para los diseños de FPGA. En lugar de ello, muchos diseños FPGA modernos aprovechan la inicialización integrada del dispositivo para el estado de encendido y utilizan restablecimientos sincronizados para los requisitos de restablecimiento de tiempo de ejecución.
Este enfoque puede reducir significativamente el uso de los recursos manteniendo una capacidad de reajuste robusta. Sin embargo, requiere una cuidadosa consideración de qué registros realmente necesitan capacidad de reajuste de tiempo de ejecución frente a aquellos que sólo necesitan inicialización.
Ejemplos de diseño y estudios de casos
Examinar ejemplos completos de diseño ayuda a solidificar la comprensión de la implementación de reajuste asincrónico en contextos realistas.
Ejemplo 1: Receptor de la UART con Reinicio Asincrónico
Un receptor UART demuestra el uso práctico de reajuste asincrónico en un periférico de comunicación:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity uart_rx is
generic(
CLKS_PER_BIT : integer := 87 -- For 115200 baud at 10MHz clock
);
port(
clk : in std_logic;
reset : in std_logic;
rx_serial : in std_logic;
rx_data : out std_logic_vector(7 downto 0);
rx_valid : out std_logic
);
end uart_rx;
architecture behavioral of uart_rx is
type state_type is (IDLE, START_BIT, DATA_BITS, STOP_BIT);
signal state : state_type;
signal bit_counter : integer range 0 to 7;
signal clk_counter : integer range 0 to CLKS_PER_BIT-1;
signal rx_data_reg : std_logic_vector(7 downto 0);
begin
process(clk, reset)
begin
if reset = '1' then
state <= IDLE;
bit_counter <= 0;
clk_counter <= 0;
rx_data_reg <= (others => '0');
rx_valid <= '0';
elsif rising_edge(clk) then
rx_valid <= '0'; -- Default, pulse for one cycle
case state is
when IDLE =>
if rx_serial = '0' then -- Start bit detected
state <= START_BIT;
clk_counter <= 0;
end if;
when START_BIT =>
if clk_counter = CLKS_PER_BIT/2 then
if rx_serial = '0' then -- Verify start bit
state <= DATA_BITS;
clk_counter <= 0;
bit_counter <= 0;
else
state <= IDLE; -- False start
end if;
else
clk_counter <= clk_counter + 1;
end if;
when DATA_BITS =>
if clk_counter = CLKS_PER_BIT-1 then
clk_counter <= 0;
rx_data_reg(bit_counter) <= rx_serial;
if bit_counter = 7 then
state <= STOP_BIT;
else
bit_counter <= bit_counter + 1;
end if;
else
clk_counter <= clk_counter + 1;
end if;
when STOP_BIT =>
if clk_counter = CLKS_PER_BIT-1 then
if rx_serial = '1' then -- Valid stop bit
rx_valid <= '1';
rx_data <= rx_data_reg;
end if;
state <= IDLE;
else
clk_counter <= clk_counter + 1;
end if;
end case;
end if;
end process;
end behavioral;
Este receptor UART utiliza el reseteo asincrónico para asegurar que la máquina del estado puede ser inicializada de forma fiable incluso si el reloj no es estable todavía. Todas las variables del estado se reasientan explícitamente a valores conocidos, asegurando un comportamiento predecible después de la liberación del reset.
Ejemplo 2: FIFO multibloque con sincronización de reinicio
Un FIFO de dos horas muestra sincronización de reinicios a través de los dominios del reloj:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity async_fifo is
generic(
DATA_WIDTH : integer := 8;
ADDR_WIDTH : integer := 4
);
port(
-- Write clock domain
wr_clk : in std_logic;
wr_reset : in std_logic;
wr_en : in std_logic;
wr_data : in std_logic_vector(DATA_WIDTH-1 downto 0);
wr_full : out std_logic;
-- Read clock domain
rd_clk : in std_logic;
rd_reset : in std_logic;
rd_en : in std_logic;
rd_data : out std_logic_vector(DATA_WIDTH-1 downto 0);
rd_empty : out std_logic;
-- Asynchronous reset input
async_reset : in std_logic
);
end async_fifo;
architecture behavioral of async_fifo is
-- Synchronized resets for each domain
signal wr_reset_sync : std_logic;
signal rd_reset_sync : std_logic;
-- FIFO memory and pointers
type memory_type is array (0 to 2**ADDR_WIDTH-1) of
std_logic_vector(DATA_WIDTH-1 downto 0);
signal memory : memory_type;
signal wr_ptr : unsigned(ADDR_WIDTH downto 0);
signal rd_ptr : unsigned(ADDR_WIDTH downto 0);
begin
-- Reset synchronizer for write clock domain
wr_sync: entity work.reset_synchronizer
port map(
clk => wr_clk,
async_reset => async_reset,
sync_reset => wr_reset_sync
);
-- Reset synchronizer for read clock domain
rd_sync: entity work.reset_synchronizer
port map(
clk => rd_clk,
async_reset => async_reset,
sync_reset => rd_reset_sync
);
-- Write process
wr_proc: process(wr_clk, wr_reset_sync)
begin
if wr_reset_sync = '1' then
wr_ptr <= (others => '0');
elsif rising_edge(wr_clk) then
if wr_en = '1' and wr_full = '0' then
memory(to_integer(wr_ptr(ADDR_WIDTH-1 downto 0))) <= wr_data;
wr_ptr <= wr_ptr + 1;
end if;
end if;
end process;
-- Read process
rd_proc: process(rd_clk, rd_reset_sync)
begin
if rd_reset_sync = '1' then
rd_ptr <= (others => '0');
elsif rising_edge(rd_clk) then
if rd_en = '1' and rd_empty = '0' then
rd_data <= memory(to_integer(rd_ptr(ADDR_WIDTH-1 downto 0)));
rd_ptr <= rd_ptr + 1;
end if;
end if;
end process;
-- Status flags (simplified - full implementation needs Gray code)
wr_full <= '1' when (wr_ptr + 1) = rd_ptr else '0';
rd_empty <= '1' when wr_ptr = rd_ptr else '0';
end behavioral;
Este FIFO demuestra la sincronización adecuada de reinicio para cada dominio del reloj, asegurando que tanto los lados de escritura y lectura salgan reajuste limpiamente sin problemas de metástabilidad.
Estrategias de depuración y verificación
La depuración y verificación eficaces de la lógica de reajuste asincrónico requiere estrategias e instrumentos específicos.
Técnicas de simulación
Al simular diseños con reset asincrónico, preste especial atención a:
- Tiempo de inicio: Prueba la aserción y la desmontación en varios puntos del ciclo del reloj
- dominios de la múltiplo: Verificar que cada dominio del reloj maneja correctamente resetea
- Duración de la aparición: Asegurar que los pulsos de restablecimiento sean lo suficientemente largos para que toda la lógica de restablecimiento
- Comportamiento de aparición de polvo: Verificar el diseño funciona correctamente después de la liberación de reseteo
Análisis de la tensión
Utilice sus herramientas de análisis de tiempo para verificar:
- Tiempo de recuperación y eliminación para todos los caminos de reajuste asincrónicos
- Sincronización adecuada de la desistición de reinicio
- Reiniciar los retrasos de distribución en grandes diseños
- Clock-to-reset timing relations
Pruebas de hardware
Cuando se prueba en hardware:
- Prueba de comportamiento de reinicio en múltiples ciclos de potencia
- Verificar los trabajos de reseteo en diferentes frecuencias operativas
- Realizar un ensayo bajo diversas condiciones de temperatura y tensión
- Realizar pruebas de estrés prolongadas con ciclos de reajuste frecuentes
- Monitorear cualquier falla intermitente que pueda indicar problemas de metástabilidad
Normas y directrices de la industria
Varios recursos de la industria proporcionan orientación adicional sobre la implementación del reajuste. Sigasi VHDL reset guidelines] ofrecen una cobertura integral de las prácticas de codificación del reajuste. Para la orientación específica de FPGA, consulte las guías de metodología de diseño de su proveedor, que proporcionan recomendaciones y limitaciones específicas para dispositivos.
Los papeles de Clifford Cummings sobre sincronización de reset son ampliamente considerados como referencias autorizadas en el campo. El sitio web Embedded.com alberga numerosos artículos sobre técnicas de reset avanzadas tanto para los diseños ASIC como FPGA.
Para aquellos que trabajan con familias específicas de FPGA, la documentación de proveedores proporciona información esencial específica para dispositivos. ]La documentación FPGA de la información y La documentación de la AAMD Xilinx incluyen directrices detalladas de implementación de reajuste adaptadas a sus respectivas arquitecturas.
Resumen y principales personas que han sido desplazadas
La implementación de la lógica de reseteo asincrónico en VHDL es una habilidad crítica para los diseñadores digitales que trabajan tanto en proyectos FPGA como ASIC. Mientras que los reseteos asincrónicos proporcionan respuesta inmediata y funcionamiento independiente del reloj, requieren una aplicación cuidadosa para evitar problemas de metástabilidad y de tiempo.
Los principios fundamentales para una aplicación de reajuste asincrónico robusta incluyen:
- Sincronizar siempre la desarificación del reset usando un sincronizador multietapa
- Incluya tanto el reloj como el reset en la lista de sensibilidad del proceso
- Reiniciar todas las señales escritas en un proceso para asegurar la inicialización completa
- Implementar sincronización de reinicio por día-dominio en diseños de varias horas
- Use polaridad de reset consistente a lo largo de su diseño
- Aplicar las limitaciones de tiempo adecuadas para el análisis de recuperación y eliminación
- Reiniciar la funcionalidad de prueba completa en simulación y hardware
- Considere las compensaciones entre el reseteo asincrónico y sincronizado para su aplicación específica
Siguiendo estas mejores prácticas y entendiendo los principios subyacentes, los ingenieros pueden crear sistemas digitales robustos y fiables que inicialicen previsiblemente y se recuperen con gracia de las condiciones de restablecimiento. Ya sea que esté diseñando una máquina estatal simple o un sistema complejo de múltiples horas, la implementación de restablecimiento adecuado constituye la base para el funcionamiento confiable del hardware.
Recuerde que la elección entre el reajuste asincrónico y sincronizado depende de sus requisitos específicos, la tecnología de destino y las limitaciones de diseño. En muchos diseños FPGA modernos, el enfoque híbrido de asincrónica aserción con desarrección sincronizada proporciona un equilibrio óptimo de la capacidad de reseteo inmediata y operación segura y sin metástasis.