Cruzar una señal de pico de un solo ciclo de un dominio de reloj rápido a uno más lento

Tengo una señal de 1 bit proveniente de una parte de mi circuito que funciona con un reloj de 40 MHz. La señal es mayormente 0, excepto que es 1 para un solo ciclo de 40 MHz cada ~ millón de ciclos.

Otra parte de mi circuito se ejecuta en un reloj de 1 MHz. Me gustaría hacer un procesamiento síncrono en la señal descrita anteriormente en esta parte de mi circuito. ¿Cuál es la forma correcta de convertir la señal de 40 MHz de ciclo único en una señal de 1 MHz de ciclo único?

En caso de que eso importe, tanto los relojes de 40 MHz como los de 1 MHz se emiten desde el mismo administrador de reloj controlado por el reloj de 32 MHz en mi placa de desarrollo, por lo que deben estar sincronizados en fase.

Respuestas (2)

Convierta ese pulso en un cambio de nivel (invierta la salida de un flip flop cada vez que se genera un pulso), páselo con un par de flip flops para sincronización y convierta el cambio de nivel nuevamente en un pulso con un flip flop y una puerta XOR . Esto se denomina sincronización de pulsos con un sincronizador de palanca y es una técnica muy común. Consulte: http://www.edn.com/electronics-blogs/day-in-the-life-of-a-chip-designer/4435339/Synchronizer-techniques-for-multi-clock-domain-SoCs .

Buen enlace Supuse que no tenía acceso al reloj de 40 MHz; si lo hace, creo que su método es más simple.
El sincronizador de palanca no funcionaría en este caso debido a la diferencia de 40x en las velocidades del reloj. Sin embargo, el sincronizador de pulso basado en Handshake más adelante en el artículo sería suficiente.
La sincronización alterna debería funcionar incluso con diferencias muy grandes en la velocidad del reloj. La razón de esto es la gran brecha entre pulsos. Si los pulsos estuvieran más juntos, se requeriría una solución diferente.
En extensión al sincronizador de palanca descrito de Alex, este sincronizador ofrece un indicador de ocupado para el dominio de reloj de 'escritura'. Entonces, si ocupado es alto, ninguna entrada se sincronizará con el dominio del reloj de lectura. El sincronizador funciona de rápido a lento y al revés.
Implementé el sincronizador de alternancia de esa publicación de blog como gist.github.com/gergoerdi/b926408e1a7a991f1031 . Funciona bien; sin embargo, la señal de salida es un ciclo de reloj lento completo después de la señal de entrada. ¿Hay alguna forma de evitar este retraso?

Editar: esta solución supone que no tiene acceso al reloj de 40 MHz. Si es así, entonces la respuesta de @alex.forencich es mejor.

¿Por qué no usa el pulso de 40 MHz como un conjunto asíncrono para un registro en el dominio de 1 MHz? Si después de esto tiene un sincronizador de doble registro, seguido de un detector de flanco ascendente, puede usar la salida de pulso de 1 MHz del detector de flanco ascendente para activar cualquier otra lógica que tenga y actuar como un borrado síncrono en el primer registro. (el que tiene un conjunto asíncrono).

signal async_reg : std_logic := '0';
signal synchroniser : std_logic_vector (2 downto 0) := (others => '0');
signal rising_edge_detected : std_logic;

...

process (clk1MHz)
begin
  if (pulse40MHz = '1') then
    async_reg <= '1';
  elsif (rising_edge(clk1MHz)) then
    if (rising_edge_detected = '1') then
      async_reg <= '0';
    end if;
  end if;
end process;

process (clk1MHz)
begin
  if (rising_edge(clk1MHz)) then
    synchroniser <= synchroniser(1 downto 0) & async_reg;
  end if;
end process;

rising_edge_detected <= synchroniser(1) and not synchroniser(2);
¿No hay una condición de carrera aquí? Si el pulso se produce justo antes del borde del reloj de 1 MHz, es posible que se borre antes de que se alcance el tiempo de configuración de los flip-flops.
Sí, el reinicio asíncrono no es una buena idea a menos que también estires el pulso en el dominio del reloj rápido a por lo menos un ciclo completo del dominio del reloj lento.
@ArgusBrown Solo hay una condición de carrera si el pulso de 40 MHz ocurre con frecuencia. La pregunta establece que la frecuencia del pulso es del orden de 40 Hz, en cuyo caso no hay problema.