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?
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.
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.
Danke für die Tipps. Damit sollte ich weiter kommen.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.