Forum: FPGA, VHDL & Co. SYNC Word erkennen und daraufhin Event auslösen


von Andreas B. (loopy83)


Lesenswert?

Hallo zusammen,

ich habe ein Problem, was ich mit Hilfe eines Spartan 3A-DSP lösen 
möchte.

Ich habe einen seriellen Datenstrom, der auf die steigende und fallende 
Flanke (DDR) des Taktes anliegt. In diesem Datenstrom möchte ich nun ein 
SYNC Word erkennen und die darauf folgenden Daten abspeichern.

Ich habe mir dazu zwei Schieberegister erstellt. Das eine parallelisiert 
die Daten der steigenden Flanke und das andere die der fallenden Flanke 
(Datenstrom durch IDDR2 zerlegt). Dann setze ich die Daten wieder 
abwechselnd zu einem 8bit Wert zusammen.

Das SYNC Word hat die Aufgabe, dass danach die gültigen Daten anliegen. 
Diese möchte ich vom ersten Bit an, immer wieder an der gleichen Stelle 
abspeichern. Bisher ist es mir nur gelungen, die Daten geschiftet 
abzuspeichern, weil ich immer irgendwo in den Datenstrom greife und zu 
keinem definierten Zeitpunkt anfange abzuspeichern. Nun möchte ich nach 
dem SYNC Word anfangen abzuspeichern und erhoffe mir so, dass die Daten 
so ausgelesen werden können, wie ich sie dem Sender vorgebe.

Kann ich nun den Ausgang der Schieberegister einfach ständig mit dem 
Wert des SYNC Words vergleichen und darauf hin eine Speicherroutine 
starten, die die nachfolgenden Daten des Datenstromes abspeichert?

Ich mache mir große Gedanken über das Timing, das wird sicher nicht 
einfach zu lösen sein.

Hat jemand Ideen oder Hinweise dbzgl. oder so etwas schon einmal 
umgesetzt?

Vielen Dank!

MfG Andi

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


Lesenswert?

> Kann ich nun den Ausgang der Schieberegister einfach ständig mit dem
> Wert des SYNC Words vergleichen und darauf hin eine Speicherroutine
> starten, die die nachfolgenden Daten des Datenstromes abspeichert?
Ja.
> Ich mache mir große Gedanken über das Timing, das wird sicher nicht
> einfach zu lösen sein.
Setze doch einfach mal ein entsprechendes Timingconstraint auf den Takt 
und probiers einfach aus. Wenns nicht klappt bekommst du das gemeldet 
und mußt dir dann erst Gedanken machen...

Welchen Takt hat dein Schieberegister?

von Andreas B. (loopy83)


Lesenswert?

Ich werde es erst einmal ausprobieren, mal schauen was ich zustande 
bekomme.

Der Takt, auf dem die Daten ankommen und somit auch der der 
Schieberegister ist 160MHz.

DANKE!

MfG Andi

von Andreas B. (loopy83)


Lesenswert?

Ich habe noch ein Problem entdeckt.
Ich habe jetzt erst einmal testweise mit einem Syncwort 0xFFFF getestet.
Nun passiert es natürlich, dass das letzte gültige Bit (oder auch die 
letzten 2-3 Bits) eine 1 sind. Dahinter kommt wieder das SYNC Wort und 
schon ist das komplette Bitmuster incl. Sync Wort verschoben.

Wie kann ich das abfangen?
Eine andere Sync Bitfolge kann ja rein theoretisch auch vorkommen 
(meinetwegen am Ende eine 0, wenn das SYNC Wort mit einer 0 anfängt), so 
dass es immer passieren kann, dass ich falsche Daten auslese.

Wie genau kann ich diesem Problem entgegenwirken?

DANKE!

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


Lesenswert?

> Wie genau kann ich diesem Problem entgegenwirken?
Du brauchst einen Magic-Code, der in deinem "normalen" Datenstrom nicht 
vorkommt. Auf jeden Fall darf das Sync-Wort nicht nur aus 1en oder 0en 
bestehen.
Der Mindestfall müsste hier also z.B. so aussehen: 0x7FFF, damit ist das 
Problem mit den vorhergehenden 1en erschlagen. Allerdings darf in diesem 
Fall keine Daten hintereinander übertragen werden, die nur 1 Null 
enthalten. Z.B. wirst du mit 0xffef und danach 0xffef wieder auf 
Probleme stossn...

von bko (Gast)


Lesenswert?

@Andreas B

ist es dir eventuell möglich den seriellen Datenstrom
zu erweitern, also mehr Bits pro Word zu senden ?
 Also etwa für 8  "Nutz" Bits 10 Bits seriell zu übertragen ?

Dann könntest du so was wie die 8b/10b Kodierung verwenden.
War hier kürzlich Thema:
 Beitrag "Spartan3AN und 8b/10b mit Coregen"

Soweit ich den u.g. Wikipedia Artikel verstanden habe,
gibt es in diesem Code unverwechselbare "Sync" Bitfolgen.
"the unique comma sequences 0011111 or 1100000 cannot be found at any 
bit position within any combination of normal codes."

http://en.wikipedia.org/wiki/8b/10b_encoding

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.