Überqueren eines Einzelzyklus-Spitzensignals von einer schnellen Taktdomäne zu einer langsameren

Ich habe ein 1-Bit-Signal, das von einem Teil meiner Schaltung kommt, der mit einem 40-MHz-Takt läuft. Das Signal ist meistens 0, außer es ist 1 für einen einzelnen 40-MHz-Zyklus alle ~ Millionen Zyklen.

Ein anderer Teil meiner Schaltung läuft mit einem 1-MHz-Takt. Ich möchte das oben beschriebene Signal in diesem Teil meiner Schaltung synchron verarbeiten. Was ist der richtige Weg, um das Einzelzyklus-40-MHz-Signal in ein Einzelzyklus-1-MHz-Signal umzuwandeln?

Falls dies wichtig ist, werden sowohl der 40-MHz- als auch der 1-MHz-Takt von demselben Taktmanager ausgegeben, der vom 32-MHz-Takt auf meiner Entwicklungsplatine gesteuert wird, sodass sie phasenstarr sein sollten.

Antworten (2)

Konvertieren Sie diesen Impuls in eine Pegeländerung (invertieren Sie den Ausgang eines Flipflops, wenn ein Impuls erzeugt wird), leiten Sie ihn mit ein paar Flipflops zur Synchronisierung weiter und wandeln Sie die Pegeländerung mit einem Flipflop und einem XOR-Gatter wieder in einen Impuls um . Dies wird Impulssynchronisation mit einem Toggle-Synchronisierer genannt und ist eine sehr verbreitete Technik. Siehe: http://www.edn.com/electronics-blogs/day-in-the-life-of-a-chip-designer/4435339/Synchronizer-techniques-for-multi-clock-domain-SoCs .

Gute Verbindung. Ich ging davon aus, dass er keinen Zugriff auf den 40-MHz-Takt hatte; Wenn ja, denke ich, dass Ihre Methode einfacher ist.
Der Toggle-Synchronizer würde in diesem Fall wegen der 40-fachen Differenz in den Taktgeschwindigkeiten nicht funktionieren. Der Handshake-basierte Pulssynchronisierer später in diesem Artikel würde jedoch ausreichen.
Toggle Sync sollte auch bei sehr großen Taktunterschieden funktionieren. Der Grund dafür ist die große Lücke zwischen den Impulsen. Wenn die Pulse näher beieinander lägen, wäre eine andere Lösung erforderlich.
In Erweiterung zum beschriebenen Toggle-Synchronizer von Alex bietet dieser Synchronizer ein Busy-Dignal für den 'Write'-Taktbereich. Wenn also beschäftigt hoch ist, wird kein Eingang mit der Lesetaktdomäne synchronisiert. Der Synchronisierer arbeitet von schnell nach langsam und umgekehrt.
Ich habe den Toggle Synchronizer aus diesem Blogpost als gist.github.com/gergoerdi/b926408e1a7a991f1031 implementiert . Es funktioniert gut; das Ausgangssignal ist jedoch einen vollen langsamen Taktzyklus nach dem Eingangssignal. Gibt es eine Möglichkeit, diese Verzögerung zu vermeiden?

Bearbeiten: Diese Lösung geht davon aus, dass Sie keinen Zugriff auf den 40-MHz-Takt haben. Wenn ja, dann ist die Antwort von @alex.forencich besser.

Warum verwenden Sie den 40-MHz-Impuls nicht als asynchronen Satz für ein Register im 1-MHz-Bereich. Wenn Sie danach einen Doppelregister-Synchronisierer haben, gefolgt von einem Detektor für steigende Flanken, können Sie den 1-MHz-Impulsausgang des Detektors für steigende Flanken verwenden, um eine beliebige andere Logik auszulösen und als synchrones Löschen des ersten Registers zu fungieren (der mit einem asynchronen Satz).

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);
Gibt es hier keine Race Condition? Wenn der Impuls kurz vor der 1-MHz-Taktflanke auftritt, könnte er möglicherweise gelöscht werden, bevor die Flip-Flop-Setup-Zeit erreicht wurde.
Ja, ein asynchrones Zurücksetzen ist keine gute Idee, es sei denn, Sie dehnen auch den Puls in der schnellen Taktdomäne auf mindestens einen vollen Zyklus der langsamen Taktdomäne.
@ArgusBrown Es gibt nur eine Race-Condition, wenn der 40-MHz-Impuls häufig auftritt. Die Frage besagt, dass die Pulsfrequenz in der Größenordnung von 40 Hz liegt, in diesem Fall gibt es kein Problem.