Forum: FPGA, VHDL & Co. Synchronisieren von STD_LOGIC_VECTOR


von Cihan K. (lazoboy61)


Lesenswert?

Hallo allezusammen,

habe ein kleines Problem. Ich habe ein Design mit vielen Submodulen, die 
über ein Hauptmodul (Top Modul) verbunden sind. In einem der Submodule 
lese ich vom DDR2 Speicher 256 Bit Daten aus mit einer 
Taktgeschwindigkeit von 200 MHz. Anschließend lege ich die Daten auf 
einem STD_LOGIC_VECTOR Signal und die Daten kommen zu einem anderen 
Submodul, der mit 140 MHz arbeitet.

Leider sind die ankommenden Daten bis jetzt immer Falsch gewesen. Ich 
habe dann natürlich versucht die Daten zu synchronisieren mit FF, aber 
bisher ohne Erfolg.

Die Frage ist einfach nun, wie sollte man zwischen unterschiedlichen 
Taktdomänen std_logic_vector signale verbinden bzw. einsynchroniseren? 
Hilft hierbei nur noch ein FIFO oder geht es auch ohne, evtl. mit 
FF-Logik.

Bräuchte in dieser Hinsicht euren Rat.

Danke im voraus

Gruß Cihan

von Marius W. (mw1987)


Lesenswert?

Für Datenbusse nimmt man in der Regel FIFOs zwischen den Clock-Domains.

Gruß
Marius

von J. S. (engineer) Benutzerseite


Lesenswert?

Ist das ein instaziierter Controller-Core? Der hat die FiFos in der 
Regel schon drin, sodass man in der Zieldomain lesen und schreiben kann.

Die Lese und Schreibanforderungen werden durch den Controller selbst 
synchronsisiert, also eingetaktet.

Kann es sein, dass Du halbleere FiFos ausliest?

von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

der DDR2 ist eine Core vom MIG erzeugt. Beim Schreiben und Lesen auf dem 
DDR2 Core gibt es keine Probleme, da sind auch die FIFOs für lesen, 
schreiben und addressieren schon erhalten.

Bei mir liegt das Problem im folgenden Bereich:
Ich lese zweimal aus dem Ram 256Bit Daten aus. Einmal werden die Daten 
über dem PLB Bus über die SDK ausgelesen, funktioniert einwandfrei und 
einmal werden die Daten zum 140MHz schnellen Submodul geschickt, wo sie 
dann per I/O Pins zu einem anderem Board (FGPA) geschickt werden. Die 
Daten werden dann vom anderen Board empfangen und in Chipscope 
dargestellt und siehe da die Daten sind falsch. Wie gesagt in SDK ist 
alles in Ordnung.

Im Allgemeinen brauche ich im Prinzip einen FIFO, um die Daten richtig 
synchronisieren zu können. Am besten bzw. muss sogar den FIFO mit 2 
Clockansteuerungen für jeweils Lesen und Schreiben nehmen.

Ich hätte evtl. noch zum FIFO mal ne Frage. Wenn ich ein FIFO generiere 
bei dem immer 256Bits eingelesen und ausgelesen werden mit 
unterschiedlichen Takten (RD_CLK und WR_CLK), werden ja die FULL und 
EMPTY bits dem entsprechend gesetzt. FULL wenn 256 Bits in FIFO 
geschrieben wurden und EMPTY wenn Bits ausgelesen wurden. Was ist nun 
wenn ich nur 200 bits reinschreibe und dann wieder auslese. Was ist nun 
mit den restlichen 56 bits, gleich null oder evtl. sogar irgendwelche 
Altdaten? Vllt. macht die Frage evtl. überehaupt kein Sinn, da ich evtl. 
etwas Falsch verstanden habe, aber würde mich freuen wenn ich dazu 
Anregungen bekommen könnte.

Danke schon im voraus für eure netten Beiträge.

mfg Cihan

von Stachele (Gast)


Lesenswert?

>dann per I/O Pins zu einem anderem Board (FGPA) geschickt werden. Die
>Daten werden dann vom anderen Board empfangen

Wie genau machst du das?

von Stachele (Gast)


Lesenswert?

> Vllt. macht die Frage evtl. überehaupt kein Sinn, da ich evtl.
>etwas Falsch verstanden habe, aber würde mich freuen wenn ich dazu
>Anregungen bekommen könnte.

Generiere dir ein entsprechendes FIFO-Template und bau eine Testbench, 
in der du veschiedene Schreib- und Lese-Sequenzen testen kannst. Dann 
siehst
du auch, wie sich die verschiedenen Füllstands-Flags verhalten.

von Pako (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Ich hätte evtl. noch zum FIFO mal ne Frage. Wenn ich ein FIFO generiere
> bei dem immer 256Bits eingelesen und ausgelesen werden mit
> unterschiedlichen Takten (RD_CLK und WR_CLK), werden ja die FULL und
> EMPTY bits dem entsprechend gesetzt. FULL wenn 256 Bits in FIFO
> geschrieben wurden und EMPTY wenn Bits ausgelesen wurden. Was ist nun
> wenn ich nur 200 bits reinschreibe und dann wieder auslese.

Ich weiß nicht, ob ich Dich richtig verstanden habe.
Der Sinn des Fifos ist, daß die einzelnen Bits eines Vektors (also 
parallel  gleichzeitig angekommende Bits) zu einander synchron sind. 
Damit kannst Du die Integrität des Datenwortes sicherstellen.
Entsprechend muß das Eingangswort des FIFOs 256Bit breit sein, damit die 
256 Bits auf einmal geschrieben bzw. gelesen werden. Dann kannst Du 
sicher sein, daß die 256 parallelen Einzelbits eine zeitliche Einheit 
bilden.
Da Du also einen 256 Bit breiten Vektor verwendest, hast Du auch immer 
256 Bits und nie nur 200Bits, weil ja in Hardware tatsächlich 256 
parallele Signale da sind.

von Cihan K. (lazoboy61)


Lesenswert?

Pako schrieb:
> Cihan Kalayci schrieb:
>> Ich hätte evtl. noch zum FIFO mal ne Frage. Wenn ich ein FIFO generiere
>> bei dem immer 256Bits eingelesen und ausgelesen werden mit
>> unterschiedlichen Takten (RD_CLK und WR_CLK), werden ja die FULL und
>> EMPTY bits dem entsprechend gesetzt. FULL wenn 256 Bits in FIFO
>> geschrieben wurden und EMPTY wenn Bits ausgelesen wurden. Was ist nun
>> wenn ich nur 200 bits reinschreibe und dann wieder auslese.
>
> Ich weiß nicht, ob ich Dich richtig verstanden habe.
> Der Sinn des Fifos ist, daß die einzelnen Bits eines Vektors (also
> parallel  gleichzeitig angekommende Bits) zu einander synchron sind.
> Damit kannst Du die Integrität des Datenwortes sicherstellen.
> Entsprechend muß das Eingangswort des FIFOs 256Bit breit sein, damit die
> 256 Bits auf einmal geschrieben bzw. gelesen werden. Dann kannst Du
> sicher sein, daß die 256 parallelen Einzelbits eine zeitliche Einheit
> bilden.
> Da Du also einen 256 Bit breiten Vektor verwendest, hast Du auch immer
> 256 Bits und nie nur 200Bits, weil ja in Hardware tatsächlich 256
> parallele Signale da sind.

Ja du hast recht. Ich habe mir das gerade nochmal so durchdacht und sah, 
dass es nie zu solch einem Fall kommen wird. Es werden wie du auch 
gesagt hast immer 256 Bits ins FIFO eingelesen und dann wieder 
ausgelesen.

Stachele schrieb:
>>dann per I/O Pins zu einem anderem Board (FGPA) geschickt werden. Die
>>Daten werden dann vom anderen Board empfangen
>
> Wie genau machst du das?

Die Daten werden per CameraLink zum anderen FPGA geschickt und auch per 
Camerlink Protok. eingelesen. Dies funktioniert einwandfrei, da ich 
schon viele Tests, auch mit Dummy-Daten vollbracht habe.

Stachele schrieb:
>> Vllt. macht die Frage evtl. überehaupt kein Sinn, da ich evtl.
>>etwas Falsch verstanden habe, aber würde mich freuen wenn ich dazu
>>Anregungen bekommen könnte.
>
> Generiere dir ein entsprechendes FIFO-Template und bau eine Testbench,
> in der du veschiedene Schreib- und Lese-Sequenzen testen kannst. Dann
> siehst
> du auch, wie sich die verschiedenen Füllstands-Flags verhalten.

Genau da bin ich jetzt auch dabei, denke ich kriege das dann auch so 
hin.

Vielen Dank für eure Anregungen, ihr habt mir geholfen.

Gruß Cihan

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Cihan Kalayci schrieb:
> wo sie
> dann per I/O Pins zu einem anderem Board (FGPA) geschickt werden

Und du bist dir 100% sicher, dass das klappt?

Tom

von wosnet (Gast)


Lesenswert?

Einfachste Lösung sollte sein, dem MIG noch einen Datenport hinzuzufügen 
und diesen dann mit der 140 MHz-Domäne zu takten. Braucht keinen extra 
FIFO (der Port hat diesen ja schon), nur etwas Steuerlogik mehr.

von Cihan K. (lazoboy61)


Lesenswert?

Thomas Reinemann schrieb:
> Cihan Kalayci schrieb:
>> wo sie
>> dann per I/O Pins zu einem anderem Board (FGPA) geschickt werden
>
> Und du bist dir 100% sicher, dass das klappt?
>
> Tom

Ja, das bin ich, warum die Nachfrage? Ich habe im Prinip nichts anderes 
gemacht als Sender und Empfänger zu programmieren auf Basis von 
Cameralink.

Hab schon sehr viele Tests gemacht, alles einwandfrei.

wosnet schrieb:
> Einfachste Lösung sollte sein, dem MIG noch einen Datenport hinzuzufügen
> und diesen dann mit der 140 MHz-Domäne zu takten. Braucht keinen extra
> FIFO (der Port hat diesen ja schon), nur etwas Steuerlogik mehr.

Du meinst also beim MIG-Generator kann man noch was einstellen. Wo genau 
kann man es unter MIG denn festlegen, wäre auch eine Variante.

Cihan

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Cihan Kalayci schrieb:
>> Und du bist dir 100% sicher, dass das klappt?
>>
>> Tom
>
> Ja, das bin ich, warum die Nachfrage?

Du hast eine Kette über mehrere Stufen und da kann überall der Fehler 
sein. In deinem Post steht nicht, dass du andere Stellen ausschließen 
kannst.

Tom

von wosnet (Gast)


Lesenswert?

Wenn Du den MIG-Ipcore öffnest, kann man sich ja in einer Art Wizard 
durchklicken. Irgendwann kommt dann die Spezifikation der Ports (dort 
kann man die Bitbreite, Anzahl, Direktionalität usw. festlegen). Dort 
sollte es auch möglich sein, weitere Ports zu aktivieren. Meines Wissens 
nach gehen da bis zu 6 unabhängige Ports (mit jeweils auch beliebigen 
Taktdomänen).

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.