Anfängerfrage: Zugriff auf ein reg von unterschiedlichen Taktraten

OP #7808847
Lesenswert?

Hallo, ich würde mich riesig über eine Hilfe von euch Verilog Profis freuen:

Ich habe mir über ein PLL einen clkSys von ~49MHz erzeugt. Aus diesem generiere ich mir einen clkPhi0 durch eine einfache Teiler/Zähler Funktionalität, welche mir ein clkPhi0 von ~0.98 Mhz gibt. Ich denke, beide CLKs werden quasi somit gemeinsam HIGH ;-) (sorry), wobei natürlich clkSys häufiger die Flanke wechselt als clkPhi0:

1
wire clkPhi0, clkSys;
2
reg [63:0] cntCycle, cntCycleOld;
3
...
4

5
always_ff @(posedge clkPhi0 or negedge rst) begin
6
...
7
cntCycle<=cntCycle+1;
8
...
9

10
always_ff @(posedge clkSys or negedge rst) 
11
...
12
cntCycleOld<=cntCycle;
13
if (cntCycleOld==cntCycle) debugVIC<=red;
14
else debugVIC<=yellow;

Ich stellte fest, dass wenn der obere Block mit dem Takt clkPhi0 getaktet wird, im unteren Block stets debugVIC<=red ausgeführt wird (also als ob cntCycle nie inkrementiert wird). Wenn ich hingegen den oberen Block ebenfalls mit clkSys takte, wird debugVIC<=yellow (wie erwartet) ausgeführt.

Die Herausforderung für mich ist demnach, zwischen zwei asynchron getakteten Blöcken Daten (hier: reg) auszutauschen/zu synchronisieren. Ich hatte gehofft, dass die Synchronisierung klappt weil beide ja eine identische "High"-Flanke haben und ich nur dann drauf zugreife... War wohl nix. ;-(

Danke schon mal fürs Lesen.

#7809042
Lesenswert?

Du musst einen Gray-Counter verwenden, oder komplette Register ueber eine minimalisierte Gray-Coder-Pipe (siehe Anhang fuer ein Bit) in die andere Domaene uebergeben. Alles andere glitcht dir sonst beliebig rum, weil dann da (Klassiker!) die unterschiedlichen Laufzeiten zu verschiedenen Logikzellen ins Spiel kommen. Gibt's hier viele Abhandlungen dazu...

Angehängte Dateien:
#7809117
Lesenswert?

Moin,

In diesem Fall scheint mir hier der Haupthund begraben zu sein:

Bernd schrieb:

Aus diesem generiere ich mir einen clkPhi0 durch eine einfache Teiler/Zähler Funktionalität, welche mir ein clkPhi0 von ~0.98 Mhz gibt.

Wie waer's, wenn du alles mit dem original Takt taktest, aber fuer die langsamen Teile eben ein zusaetzliches "ClkEnable" Signal erzeugst und kein eigenstaendiges clkPhi0?

Gruss WK

OP #7809267
Lesenswert?

Hallo,

erstmal Danke für alle Antworten.

Die Antwort von WK (derguteweka) hat mich nachdenklich gestimmt... Warum soll ich mich mit der Synchronisierung von Clock-Domains herumschlagen, wenn ich doch alles selbst in der Hand habe und stets mit maximaler Frequenz arbeiten und das langsamere clkPhi0 selbst aus der clkSys heraus signalisieren kann? Absolut korrekt. Vielen Dank für diese Antwort, ich werde es so machen, auch wenn dies vom diskreten Originalschaltplan abweicht.

Gelernt habe ich in den anderen Foreninhalten, dass unterschiedliche Clks stets synchronisiert werden müssen, unabhängig davon ob deren Flanken synchron HIGH werden oder nicht, und das dies ein echter Aufwand ist den, wenn man ihn vermeiden kann, auch vermeiden sollte.

Nochmal Danke, Bernd.

Persönliche Seite #7809588
Lesenswert?

Bernd schrieb:

elernt habe ich in den anderen Foreninhalten, dass unterschiedliche Clks stets synchronisiert werden müssen, unabhängig davon ob deren Flanken synchron HIGH werden oder nicht, und das dies ein echter Aufwand ist den, wenn man ihn vermeiden kann, auch vermeiden sollte.

An dem Satz stimmen 3 Sachen nicht:

  1. Synchronisieren von Clocks ist nicht der Punkt, es geht um das Synchronisieren der Daten.

  2. Flanken von Takten sind grundsätzlich nie 100% synchron. Das ist eine Frage des Budgets. Wenn das reicht, ist eine sichere Übergabe immer möglich, egal ob die Takte einen direkten Bezug haben und ab und scheinbar zum gleichen Zeitpunkt kommen. Es ist im Gegenteil so, dass dies genau dann am einfachsten funktioniert, wenn sich die Taktflanken NIE sehen.

  3. Man kann da nichts vermeiden, weil das durch die Aufgabe vorgegeben ist. Dort, wo Takte aufeinander treffen, muss eine adäquate Lösung her. Was man machen kann, ist nicht unnötig viele Takte ins Design zu bringen.

Daher der Einwurf der enables. Aber:

In deinem Fall kann das durchaus sinnvoll sein, einen langsamen echten Takt zu nehmen und das passend zu behandeln. Dazu braucht es ein strobe Signal, das das neu Einschreiben eines Datums in REG anzeigt. Wenn sich das ändert, wird gelesen. Das zu synchen erfordert ein einmaliges Einsynchen der Daten und des Strobes.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren