www.mikrocontroller.net

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


Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.