Hallo, ich habe ein Board mit einem Gigabit Phy (88E1111) und möchte nun selbst den MAC Teil auf dem FPGA implementieren (Cores sind mir zu groß, für das, was ich vorhabe ...). Ich möchte einfach nur UDP-Pakte versenden/empfangen und die Verbindung direkt zum PC verwenden (also Kollisionen, TCP usw. alles uninteressant). Ich mache zunächst einen Reset des Phys, der sich anschließend auch korrekt konfiguriert (sehe ich an den Leds). Dann habe ich mir einen gültigen Ethernet Frame mit IP, UDP-Paket erstellt und möchte es anschließend senden, GTX-Takt mit 125 MHz angebunden anschließend die einzelnen Bytes über die TXD Leitung des Phys. Nur leider sendet der Phy keine Daten (Led blinkt niemeals auf und mit einem Sniffer sehe ich auch keine Pakete). Das Empfangen scheint aber sehr wohl zu funktionieren. Muss ich zunächst noch etwas beim Phy konfigurieren? Datenblätte gibt es ja anscheinend nur unter einem NDA. Danke im Voraus.
:
Gesperrt durch Moderator
>Datenblätte gibt es ja anscheinend nur unter einem NDA.
So ist es, und darum kann hier auch niemand Informationen preisgeben,
die er unter NDA erhalten hat...
Unterschreibe ein NDA mit Marvell frage nach Datenblätter.
Hat niemand einen Tipp? Habe mittlerweile auch den 100 Mbit Modus versucht, dazu den GTX-Takt auf 0 gelegt und die 25MHz des Phy zum Senden genutzt. Aber er sendet immer noch nichts.
Also das mit dem NDA ist ja klar. Aber kann mir vielleicht jemand sagen, ob ein Reset des Phys eigentlich ausreichen sollte oder ob ich sonst noch was machen muss. Die Broadcast Pakete meine PC's zumindest scheinen ja anzukommen (das signalisiert die Led). Das wäre schon sehr hilfreich, damit ich weiß wo das Problem ligen könnte. Die fertigen Cores machen ja auch nichts weiter und laufen daher auch nicht.
Nicht unwesentlich beim Einsatz von Gigabit-PHYs: Du solltest Dir unbedingt mal die Konfiguration des PHYs anschauen (z.B. Config-Widerstände). Erst wenn das Teil für den richtigen Modus richtig konfiguriert ist, kommst du weiter. Hierzu kommst du um einen tiefen Blick in das Datenblatt nicht herum ---> also NDA unterzeichnen Gruß, SuperWilly
Habe es endlich nach etwas herumprobieren hinbekommen. An der Konfiguration muss man zum Glück nichts ändern. Habe dafür aber wieder ein neues "Problemchen": Ich kann komischerweise nur in einer Endlosschleife senden. Sobald ich es auf ein einziges Mal beschränke sendet der Phy nicht. Auch wenn ich nur eine bestimmte Anzahl sende klappt es nicht, nur in einer Endlosschleife. Woran könnte das liegen?
bati wrote: > Habe es endlich nach etwas herumprobieren hinbekommen. An der > Konfiguration muss man zum Glück nichts ändern. > > Habe dafür aber wieder ein neues "Problemchen": Ich kann komischerweise > nur in einer Endlosschleife senden. Sobald ich es auf ein einziges Mal > beschränke sendet der Phy nicht. Auch wenn ich nur eine bestimmte Anzahl > sende klappt es nicht, nur in einer Endlosschleife. Woran könnte das > liegen? Einfach ins Blaue geraten ... Hat das Ding einen Puffer eingebaut, der nur geleert wird, wenn er voll wird? MfG Thomas Pototschnig
Ich befürchte, dass es ein Problem mit dem GTX Takt gibt. Denn selbst in der Endlosschleife kommen nicht alle Pakete raus. Vielleicht klappt es nur bei manchen Paketen, bei denen die Bytes schön synchron zum Takt waren. Habe auch schon mal in einem anderen Forum gelesen, dass ein Phaseshift um 90° bei Phy Takt geholfen hat, bei mir leider nicht.
Hm...was sagt denn die Simulation? Da müsstest du doch das Timing mit dem geforderten Timings des Phy vergleichen können. Oder machst du das im Blindflug?
Simulation klappt. Wie gesagt, wenn ich sende und mit dem Durchlauf im Ethernet-Frame fertig bin, beginne ich von vorne und sende das Paket erneut. Das klappt in einer Endlosschleife wunderbar. Mache ich das ganze bloß einmal, wird nichts gesendet.
Wo sind momentan Unterschiede zwischen Testbench und realem Gerät? Da kannst Du versuchen Deine Testbench mehr der Realität anzupassen um so dem Fehler auf die Spur zu kommen. Ohne den Thread komplett gelesen zu haben: Wie stellst Du fest (real), das Pakete gesendet werden? Duke
Ich verwende Wireshark, um zu schauen, ob Pakete ankommen. Meine Statemachine läuft synchron mit dem erzeugten GTX Takt. Den erzeuge ich mit einem DCM von 100 MHz. Hier auch meine simple Statemachine:
1 | process(gtx_clk) |
2 | begin
|
3 | if(rising_edge(gtx_clk)) |
4 | then
|
5 | case state is |
6 | when send => |
7 | PHY_TX_EN <= '1'; |
8 | PHY_TXD <= etherframe(cnt*8 - 1 downto cnt*8 - 8); |
9 | if(cnt = 1) |
10 | then
|
11 | state <= idle; |
12 | else
|
13 | cnt <= cnt - 1; |
14 | end if; |
15 | when idle => |
16 | PHY_TX_EN <= '0'; |
17 | end case; |
18 | end if; |
19 | end process; |
etherframe ist gültig und enthält 72 Bytes. cnt ist anfangs 72. Zu dem Zeitpunkt ist der Phy resettet und die LEDs melden Betriebsbereitschaft. Setze ich im idle case den cnt wieder auf 72 und den state auf send, beginnt er von vorne und der Phy sendet auch in einer Schleife. Lasse ich die Statemachine unverändert, wie oben, sendet er gar nichts. Wie gesagt, ich verwende eine 1:1 Verbindung brauche also kein carrier sense oder sonstiges.
In der Reset Phase kann ich ausschließen. Ich habe schon mal versucht, das senden durch einen Button auf dem Board auszulösen. In der Schleife sendet er solange, bis ich den Button wieder loslasse. Wenn er nur einmal auf Knopfdruck senden soll passiert wieder nichts.
Schickst du denn eine Preamble (7 Bytes) und ein FrameDelimiter-Byte vorweg ?
Ja, klar. Also 7x55|D5|DST_MAC|SRC_MAC|LENGTH|DATA|FCS. Das Paket habe ich mir mit einem Packet Builder erstellen lassen. Daran liegt es nicht.
Ich würde mal (für den Fall der Endlosschleife) von Frame zu Frame unterschiedliche Daten senden, so dass du evtl. siehst, ob alle Daten ankommen oder Frame-Daten verloren gehen.
Genau das habe ich mir auch gedacht. Habe ich eben gemacht. Habe den DATA Teil auf Null gestzt. Nach jedem Senden erhöhe ich den Teil um eins (CRC Berechnung habe ich schon eingebaut). Jetzt das Tolle: Das erste Frame das ankommt ist das 4 Millionste (ich muss wahrscheinlich nach dem Reset noch eine gewisse Zeit warten). Von da an zählt er schön durch. ABER dann mittendrin überspringt er 2000 Frames und dass regelmäßig.
Wie vorgeschrieben 12 Takte bei 125MHz. Habe ich aber auch schon vergrößert -> kein Unterschied.
Hast du noch andere Phasen-Verschiebungen des vom FPGA ausgegebenen Taktes ausprobiert ? Kannst du ein Augendiagramm des Taktes messen ? Vielleicht hast du ein Jitter-Problem ... Gibst du den Takt auf einem dafür vorgesehenen FPGA-Pin aus ?
Habe leider nichts da zum messen. Pin ist korrekt laut Datenblatt des Boards. Habe die DCM mit dem CoreGen erstellt. Der Jitter beträgt 0.217 ns.
@SuperWilly Danke für deine Hilfe. Ich habs hinbekommen. Habe den Reset am Anfang weggelassen. Stattdessen starte ich ihn aus dem Energiesparmodus, der anscheinend nach dem Einschalten des Boards eingelegt wird.
Hallo Bati, wie hast du es geschafft die PHY nun zum Laufen zu bekommen. Bin beim gleichen Problem. Ich mach den Reset und sonst nichts. Nach dem Reset leuchtet eine LED an der Buchs der PHY. Mein PC sagt "Netzwerik kabel nicht verbunden". Grüße jan
Das hört sich für mich seltsam an, dass man den aus dem Energysparmodus heraus starten muss.