Forum: FPGA, VHDL & Co. Fehler beim Erkennen der Präambel (Ethernet)


von Julian A. (jul)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche seit längerem auf einem FPGA das Empfangen von 
Ethernetframes zu realisieren.
Ich habe mich schon im Forum umgeschaut, aber leider keinen Post 
gefunden der mir weitergeholfen hat, falls ich was übersehen haben 
sollte, wäre ich über Verweise dankbar.

Nun zu meinem Problem:

Zwar bin ich in der Lage die die einzelnen Bits zu empfangen, allerdings 
wird meine dekodierte Präambel immer falsch.
Ich empfange 7 x die X"55", bei dem Start-Frame-Delimiter fehlen jedoch 
2 bit (wie ich nach langer Suche herausgefunden habe).
Das Byte, welches dem Start-Frame-Delimiter zugeordnet wird besteht aus 
den letzten 6 bits des Start-Frame-Delimiters und den ersten 2 bit der 
Mac-Ziel-Adresse.
Daraus schließe ich, dass 2 bits im ersten Byte der Präambel nicht 
detektiert werden und sich der Fehler bis zum Start-Frame-Delimiter 
fortsetzt und erst dort auffällt.

Bei dem PHY den ich verwende handelt es sich um den SMSC LAN 8720A.

Link zum Datenblatt:

http://ww1.microchip.com/downloads/en/DeviceDoc/8710a.pdf

Kurze Erläuterung zum Code(siehe Anhang):

clk50mhz ist meine generierte Clock für den PHY.
Mit PhyCrs signalisiert der PHY mir, dass gültige Daten am Ausgang 
PhyRxd vorhanden sind.
Ist PhyCrs = '1' werden die bits in Zweiergruppen auslesen.
Um zu kontrollieren welchen Wert der SFD hat, bzw. (falls dieser richtig 
ausgelesen wurde) welchen Wert das erste Byte der Mac-Ziel-Adresse hat, 
lasse ich mir das jeweilige Byte über Leds darstellen.

Ist die if-Abrage mit PhyCrs hier nicht richtig, sodass erst im 
darauffolgenden Takt, während bereits 2 bits "verloren" gegangen sind 
das Auslesen der bits beginnt oder liegt der Fehler doch woanders?

von Lattice User (Gast)


Lesenswert?

Du kannst dich insbesondere bei 10MB nicht darauf verlassen, dass die 
empfangene Preamble vollständig ist.

D.h. zähle nicht die Bytes, sondern warte auf den SFD.

von Lattice User (Gast)


Lesenswert?

Allerdings ist auch deine Erzeugung und die Ausgabe der 50 MHz Clock 
suboptimal.
Du hast 100 MHz, verwende diese intern direkt (mit Clockenable, oder 2 
States).
Stelle auch sicher dass die FF in den IOs verwendet werden, sonst hats 
du
keine wirkliche Kontrolle über Setup und Hold Zeiten auf dem RMII 
Interface.

von Julian A. (jul)


Lesenswert?

Danke für die Tipps. Damit sollte ich weiter kommen.

von Lattice User (Gast)


Lesenswert?

Julian A. schrieb:
> Danke für die Tipps. Damit sollte ich weiter kommen.

Mein 2. Tipp ist wichtiger als der erste!

Laut Datasheet des Phy hast du worst case gerade mal 6 ns Setupzeit, von 
Daten zur Clock.

Sei
x = Delay von interner Clock bis zum Ausgang des Clockpinds
y = Delay (Routing und Logik) von den Inputpins zu den FF (die mit 
internerClock getaktet werden)
z = Setupzeit der FFs.

Damit es zuverlässig funktioniert mus x + y + z < 6 ns sein.

Dazu kommt dass y für die verschiedenen Signale noch unterschiedlich 
ist. vor allem durch das Routing. Im schlimmsten Falle sehen die FFs 
also nicht mal Daten die Zusammengehören!

von Julian A. (jul)


Lesenswert?

Ich habe beide Ratschläge befolgt. Funktioniert jetzt einwandfrei!

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.