Hi, ich möchte ext. Daten in meinen FPGA einlesen. Zur Synchronisation steht mir nur ein Startbit (fallende Flanke) zur Verfügung. Den Takt habe ich mit einem PLL erzeugt, ich weiss jetzt nur nicht wie ich die Daten auf den Takt synchronisieren soll. Vielleicht könnt Ihr mir weiterhelfen. Grüße Micha
Welche Art von Daten ist das (parallel, seriell..., sonstige Parameter)? Welche Geschwindigkeit?
Ups, sorry. Es handelt sich um eine serielle Übertragung von Startbit + 26 Datenbits ohne Stopbit. Die Frequenz beträgt 18,5 Mhz. Ich hoffe das reicht. Grüße Micha
Wenn du einfach nur Abtasten willst, dann sollte dein Interner Takt mindestens doppelt so hoch sein, wie der Takt der Daten.. Den Dateneingang gibst du auf ein Register, das mit dem internen Takt getaktet ist. Und am Ausgang hast du dann deinen Datenstrom eingetaktet auf deinen Systemtakt. Besser ist es, zwei Register hintereinander zu schalten, um Glitches ruszufiltern. Willst du allerdings deinen internen Takt auf die Phase des externen Taktes aufsynchronisieren, dann wird es ziemlich kompliziert und es ist fraglich, ob es mit den internen PLLs überhaupt geht.
Das einfachste ist, das Signal mit einer hoeheren Frequenz abzutasten, z.B. 6x 18.5MHz. Dann wartest du auf die steigende Flanke des Startbits und weisst dann, dass das naechste Bit genau 6 Takte spaeter anfaengt. Zur Sicherheit solltest du natuerlich das ganze noch um 3 Takte verzoegern, um immer in der Mitte des Signals den Wert einzulesen. So brauchst du deinen Takt nicht zum Signal zu synchronisieren, so lange die Takte nicht allzu unterschiedlich sind. Bei hoeheren Frequenzen muesstest du mehr Aufwand treiben, aber 18 MHz sind fuer einen FPGA ja fast noch "peanuts".
Ergänzung zu Jan: Wenn du das so machst, dann ist dein eingetaktetes Bit entweder 5 oder 6 Systemtakte lang. Je nachdem ob du mit deiner Abtastflanke die Grenze des Datenbits gerade noch oder eben gerade nicht mehr "mitbekommen" hast. Du kannst einfach nicht davon ausgehen, dass due exakt 18,5 MHz bzw exakt 18,5 x 6 MHz hast. Aber die von Jan dargestellte Methode ist üblich und funktioniert. Nur darfst eben nicht zu weit an die "Grenzen" gehen mit deinem Abtastpunkt.
Genau Schrotty. Mein Beispiel funktioniert also noch, wenn sich das Signal waehrend aller 27 Bits nicht um mehr als zwei Abtast-Takte verschiebt, das entspricht also einer Abweichung von gut einem Prozent. Da Quarze aber in der Regel deutlich genauer sind, stellt das kein Problem da.
Bei einem Takt der nicht einem Vielfachen entspricht, kann man die Bits trotzdem sicher einlesen. Die Taktrate sollte dann aber mindestens der 2,5-fachen Bautrate entsprechen. Dann machst zu einen Zähler, der mit dem Startbit gestartet wird und ließt dann an den entsprechenden Zählerständen, die dem einzelnen Bit zeitlich am nähesten in der Mitte sind die Bits ein. Wenn Du genau die Taktfrequenz oder eine Vielfache der Taktfrequenz hast, dann kannst Du auch mit der 1,5 fachen Baudrate ein sicheres einlesen erreichen. Dann müssen Die Bits allerdings die mit der steigenden und fallenden Flanke eingelesen werden. Ich habe das selbst in einem Projekt schon realisiert. Da ist es mir über sehr laneg Testzeiträume nicht gelungen bei 50 MBaud auch nur einen einzigen Übertragungsfehler zu erzeugen. Obwohl da ungeschirmte Übertragungsleitungen mit mehreren Metern im zum Einsatz kahmen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.