Forum: FPGA, VHDL & Co. Verständnisfrage Einsynchronisieren


von Michael F. (mifi)


Lesenswert?

Hallo zusammen,

zu dem Thema Einsynchronisieren habe ich folgende Threads gefunden:

Beitrag "Einsynchronisieren mit hörerer Taktrate sinnvoll?"
Beitrag "Einsynchronisieren von Spikes"
Beitrag "Einsynchronisieren von STD_LOGIC_VECTORen"
Beitrag "Einsynchronsieren mit 2 FFs"

Ich beziehe mich jetzt mal auf den letzten Thread "Einsynchronsieren mit 
2 FFs". Dieser Thread gibt nun den Hinweis das man zum 
Einsynchronisieren von asynchronen Signalen 2 FFs verwendet sollte.

Wobei mir jetzt noch nicht klar geworden ist ob man besser die FF 
Schreibweise benutzt oder die mit dem Schieberegister, oder ist das 
egal?

signal sig_tmp1 : STD_LOGIC;
signal sig_tmp2 : STD_LOGIC_VECTOR(1 downto 0);

----------------------------------------
-- 2 FFs
----------------------------------------
process(CLK)
begin
   if rising_edge(CLK) then
      sig_tmp1 <=sig_async1;
      sig_sync1<=sig_tmp1;
   end if;
end process;


----------------------------------------
-- Schieberegister
----------------------------------------
process(CLK)
begin
   if rising_edge(CLK) then
      sig_tmp2 <= sig_tmp2(0) & sig_async2;
   end if;
end process;
sig_sync2 <= sig_tmp2(1);


Weiterhin braucht man bei einem Bus nicht die Daten über die FFs zu
schicken, sondern das Steuersignal, z.B. write. Wie das geht hat Lothar
hier gezeigt: Beitrag "Re: Einsynchronsieren mit 2 FFs"

Wobei ich nicht verstehe warum Lothar in seinem Beispiel die Daten
das erste mal bei der fallenden Flanke von write (dasync <= daten)
und später diese das zweite mal "durch das Schieberegister" übernimmt
(dsync <= dasync).

Würde es nicht ausreichen dies nur bei dem Schieberegister zu machen:

   process begin
      -- gespeicherte Daten synchron weitergeben.
      wait until rising_edge(clk);
      wrsr <= wrsr(1 downto 0) & write; -- Schieberegister
      if(wrsr="100") then -- fallende Flanke
         dsync <= daten;
      end if;
   end process;

Der Hintergrund meiner Fragen ist das ich mal versuchen wollte einen 
UART im FPGA zu realisieren. Ja es gibt einige Beispiele bei OpenCores, 
aber vielleicht lernt man beim selber machen mehr?!

Der UART soll dann mit dem externen Bus einer CPU verbunden werden, als
CPU Schnittstelle gibt es dann folgende Signale:

CPU_ADR, CPU_DATA, CPU_CS, CPU_WR, CPU_RD

Und auf der UART Seite:

UART_TX, UART_RX

Zusätzlich noch ein RESET und CLK für das FPGA.

Nach den Infos aus den Threads würde ich nun folgende Signale 
einsynchronisieren:

RESET, CPU_WR, UART_RX

Wobei mir noch nicht ganz klar ist wann und wie ich die CPU Daten
über das "CPU_WR_SYNC" Signale mitnehmen soll.

Viele Grüße,
Michael

von Jan M. (mueschel)


Lesenswert?

Michael Fischer schrieb:
> Wobei mir jetzt noch nicht klar geworden ist ob man besser die FF
> Schreibweise benutzt oder die mit dem Schieberegister, oder ist das
> egal?
Die beiden Schreibweisen sind identisch, ob dort nun ein Vektor und eine 
Anweisung oder zwei einzelne Signale verwendet werden ist der Synthese 
egal.

> Weiterhin braucht man bei einem Bus nicht die Daten über die FFs zu
> schicken, sondern das Steuersignal, z.B. write. Wie das geht hat Lothar
> hier gezeigt: Beitrag "Re: Einsynchronsieren mit 2 FFs"
> Wobei ich nicht verstehe warum Lothar in seinem Beispiel die Daten
> das erste mal bei der fallenden Flanke von write (dasync <= daten)
> und später diese das zweite mal "durch das Schieberegister" übernimmt
> (dsync <= dasync).
Das Speichern synchron zur fallenden Flanke des write Signals stellt 
sicher, dass die Daten genau dann übernommen werden, wenn sie auch 
wirklich valide sind.
Das Schieberegister verzögert die fallende Flanke etwas, so dass die 
Werte im ersten Register sicher stabil sind wenn das zweite Register sie 
mit dem Systemtakt übernimmt und zur restlichen Logik synchronisiert.

> Würde es nicht ausreichen dies nur bei dem Schieberegister zu machen:
Das geht nur, wenn sichergestellt ist, dass die Daten zu diesem 
Zeitpunkt immer noch am Bus stabil anliegen. Das ist jedoch im 
allgemeinen nicht gegeben, bzw. hängt von den genauen Spezifikationen 
des Busses ab.

> Der Hintergrund meiner Fragen ist das ich mal versuchen wollte einen
> UART im FPGA zu realisieren. Ja es gibt einige Beispiele bei OpenCores,
> aber vielleicht lernt man beim selber machen mehr?!
Da würde ich zuerst noch einen Blick auf Lothars Webseite werfen, dort 
hat er auch eine sehr einfache UART vorgestellt. Die nächstbessere 
Version wäre dann eine, die mit Überabtastung arbeitet und somit kurze 
Störungen herausfiltern kann.

> Nach den Infos aus den Threads würde ich nun folgende Signale
> einsynchronisieren:
> RESET, CPU_WR, UART_RX
Reset - ja wenn er denn wirklich nötig ist.
CPU_WR - ja, muss.
Uart_RX - ja, hier reicht aber sicher der minimalistische 1-FF Ansatz, 
da das Signal sich ja zum einen nur sehr selten ändert und zum anderen 
auch zuverlässig nur in der Mitte der Bits gelesen wird.

> Wobei mir noch nicht ganz klar ist wann und wie ich die CPU Daten
> über das "CPU_WR_SYNC" Signale mitnehmen soll.
Das kommt vor allem darauf an, wie der Bus genau spezifiziert ist. Der 
Ansatz den du oben gezeigt hast ist dafür in jedem Fall gut geeignet.

von Michael F. (mifi)


Lesenswert?

Hallo Jan,

>> Wobei mir noch nicht ganz klar ist wann und wie ich die CPU Daten
>> über das "CPU_WR_SYNC" Signale mitnehmen soll.
>Das kommt vor allem darauf an, wie der Bus genau spezifiziert ist. Der
>Ansatz den du oben gezeigt hast ist dafür in jedem Fall gut geeignet.

Danke für die Erklärungen. Im Bezug auf den externen Bus
ist es sichergestellt das die Daten kurz vor, während,
und auch nach dem aktiven WRITE Signal noch anliegen.
Somit kann ich hier die etwas einfachere Version verwenden.

Ja, die Seite von Lothar mit dem UART kenne ich. Ich will erst mal
das Businterface und den Baudrate Generator erstellen. Danach
kommen dann die anderen Teile.

Viele Grüße,
Michael

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jan M. schrieb:
> Die beiden Schreibweisen sind identisch, ob dort nun ein Vektor und eine
> Anweisung oder zwei einzelne Signale verwendet werden ist der Synthese
> egal.
Das kann man sich z.B. auch ganz hübsch im RTL-Schaltplan (der von der 
Synthese ausgespuckt wird) ansehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.