¿Debo restablecer el diseño de mi FPGA después del inicio?

7

Por lo general, inicializo los registros de estado de mis FSM especificando un valor inicial en mi código VHDL, por lo que no necesito un pulso de restablecimiento después del inicio del FPGA configurado. El siguiente ejemplo demuestra esto con un "contador de anillos" que simplemente combina todos los registros del estado:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity counter_init is
  port (
    clock : in  std_logic;
    msb   : out std_logic);
end entity counter_init;

architecture rtl of counter_init is
  -- large counter to detect excessive skew on Global Write Enable (GWE)
  signal counter : unsigned(255 downto 0) :=
    x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
begin  -- architecture rtl

  counter <= counter(0) & counter(counter'left downto 1) when rising_edge(clock);

  -- The counter value will be observed by an on-chip logic analyzer.
  -- Output most-significant bit to prevent synthesizing away the above logic.
  msb <= counter(counter'left); 

end architecture rtl;

Esta técnica ha funcionado en mis diseños para Altera o Xilinx FPGA hasta ahora. Lo he comprobado explícitamente utilizando el analizador lógico en chip específico del proveedor y un disparador de inicio. Aquí hay una captura de pantalla de ChipScope, aparentemente se pierde un ciclo:

Pero,despuésdeleerlosdocumentos,mepreguntocómofunciona:¿Cómotodoslosflip-flops(conectadosalamismaseñaldereloj)comienzanaalternaralmismotiempo?

LasecuenciadeinicioparaunFPGAXilinxsedescribeen 7 Guía de usuario de configuración de FPGA de la serie (UG470) por ejemplo. Después de la configuración del FPGA, se ejecuta una secuencia de inicio que afirma "Global Write Enable (GWE)" Tabla 5-12 :

  

Cuando se afirma, GWE   permite el CLB y los flip-flops IOB, así como otros   Elementos síncronos en el FPGA.

y en la nota al pie:

  

GWE se afirma de forma síncrona con el reloj de configuración (CCLK) y tiene un sesgo significativo en la parte. Por lo tanto, secuencial   los elementos no se lanzan de forma síncrona al reloj del sistema del usuario y pueden ocurrir infracciones de tiempo durante el inicio. Es   se recomienda restablecer el diseño después del inicio y / o aplicar alguna otra técnica de sincronización.

Entonces, esto realmente significa: si el reloj en los flip-flops ya alterna, entonces todos los flip-flops pueden comenzar a alternar en diferentes tiempos / reloj. Dado que el oscilador del reloj en la placa FPGA ya se está ejecutando, y que estoy usando un reloj-búfer global sin una entrada de habilitación ( BUFG ): ¿Se activará la entrada del reloj en los flip-flops antes de GWE? es afirmado?

No encontré ninguna información en UG470 acerca de si y cómo están habilitados los buffers de reloj. Y la FPGA de Xilinx 7 Series y Zynq-7000 Todas las bibliotecas SoC programables para HDL Designs (UG768) solo indica que la entrada de habilitación de reloj de un BUFGCTRL debe ser validada sincrónicamente. Pero, esto es en realidad una entrada dirigida por el usuario.

Para el FPGA Altera Cyclone III que estoy usando también, no encontré ninguna información relevante en Manual del dispositivo Cyclone III .

Para repetir: no he observado ninguna inicialización fallida hasta el momento, pero parece que esto no se especifica en los documentos.

    
pregunta Martin Zabel

2 respuestas

4

Debe asumir que la entrada de reloj a sus flip-flops está alternando a menos que pueda demostrar lo contrario (mediante un encendido garantizado o un retraso de configuración posterior). No se garantiza que todos los flip-flops en un dominio de reloj dado comiencen en el mismo límite de reloj basado en GWE o GSR. Ambos actúan como un reinicio asíncrono y causan problemas potenciales para algunas lógicas (contadores, máquinas de estado de un solo calor, etc.).

Específicamente, una máquina de estado de un solo calor que realiza la transición inmediatamente después de la configuración FALTA (eventualmente) FALLA (transición a un estado no válido). La frecuencia de falla dependerá del período de reloj en comparación con el sesgo específico del dispositivo (y el lugar y la ruta) para su diseño.

Otro experimento sencillo para ver este comportamiento inicializa un contador regresivo relativamente rápido con 10000000 y observa su comportamiento inmediatamente después de la configuración. Algunos bits hacen la transición a 01111111 y otros pierden esa primera transición, pero la secuencia de conteo posterior será correcta.

El white paper mencionado por Krunal Desai habla sobre este problema y es una gran referencia . Cualquier FPGA basado en SRAM probablemente tendrá un problema similar.

No es necesario restablecer los registros para obtener un valor conocido. Si tiene una lógica que es sensible a que todos los que comiencen en el mismo borde del reloj, tendrá que agregar una lógica de sincronización (esto puede consistir en un reinicio anulado sincrón u otra lógica síncrona). Xilinx AR44174 habla un poco más sobre el tema. Yo agregaría un tercer método de mitigación que es garantizar que la lógica sincronizada no cambie / realice la transición durante los primeros ciclos de reloj después del inicio.

    
respondido por el davidd
4

Para los FPGA de Xilinx, el registro de respuestas AR # 44174 confirma que:

  
  • Las infracciones de tiempo pueden ocurrir con flip-flops y SRLs, ya que GWE está liberando elementos síncronos con respecto al reloj de configuración en lugar del reloj del sistema del usuario.

  •   
  • La propagación de la señal GWE significa que las SRL y los flip-flops pueden liberarse en momentos ligeramente diferentes, lo que hace que algunas partes del diseño se inicien antes que otras.

  •   

Tenemos dos opciones:

  1. Detenga el reloj del sistema del usuario hasta que se complete el inicio.
  2. Aplique automáticamente un pulso de restablecimiento después de que se valide GWE o similar.

Si no se requiere una entrada de restablecimiento externo en el diseño, la solución 1 en el registro de respuestas es útil para los FPGA de Xilinx.

  
  • Inicialmente después del inicio, el reloj se debe detener.
  •   
  • Una vez que la señal EOS afirma desde la primitiva INICIACIÓN, el reloj se puede reiniciar de forma síncrona con el reloj del sistema del usuario.
  •   
  • La mejor manera de controlar esto es usar BUFGCE, BUFR reset o BUFHCE.
  •   

Probé esta solución, pero Chipscope reveló que no todas las chanclas comenzaron a alternar al mismo tiempo. Parece que la aserción síncrona del pin de activación de reloj CE del BUFGCE no es tan fácil.

Recomiendo usar la segunda técnica (siguiente) en su lugar. En lugar de un reinicio externo ( reset_pin a continuación), un cero de '0' (sin reinicio) debe introducirse en el sincronizador de reinicio.

Si hay un restablecimiento externo de todos modos , entonces el sincronizador de restablecimiento se puede inicializar de tal manera que se confirmará un restablecimiento después de que se confirme GWE o similar durante la secuencia de inicio. El sincronizador de reinicio no iniciará la secuencia de liberación (es decir, flip-flops alternando hacia '0') hasta que GWE sea confirmado. La duración de la secuencia de lanzamiento debe ser más larga que el sesgo en el GWE. Esta solución funcionará en los FPGA de Xilinx y Altera.

Declaraciones:

signal reset_sync : std_logic_vector(1 downto 0) := (others => '1');
signal reset : std_logic;

Cuerpo de Arquitectura (cadena de registro):

reset_sync <= reset_sync(reset_sync'high-1 downto 0) & reset_pin when rising_edge(clock);
reset <= reset_sync(reset_sync'high); -- active-high

Por supuesto, la lógica del contador ahora requiere un reinicio:

  process(clock)
  begin
    if rising_edge(clock) then
      if reset = '1' then
        counter <= x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
      else
        counter <= counter(0) & counter(counter'left downto 1);
      end if;
    end if;
  end process;

La siguiente captura de pantalla muestra los errores debidos a la afirmación asíncrona de GWE. Para provocar esto, omití la inicialización de la señal, de modo que todos los flip-flops de contador se inicializaron a '0' durante la configuración. Como reset se afirma desde el principio, uno esperaría que todos los flip-flops cambien al valor de restablecimiento solicitado con el primer flanco de reloj ascendente después de afirmar GWE. Pero, en el momento 0 (marcador T), el valor del contador no es una secuencia de x "5". Debido a la cadena de reinicio, se restaura el valor de reinicio esperado. El reinicio se libera en el ciclo 2 (marcador X), de modo que todos los flip-flops se alternan en ciclos subsiguientes. La frecuencia del reloj aquí es de 200 MHz.

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas