mikrocontroller.net

Forum: FPGA, VHDL & Co. Ethernet Phy zum Senden bewegen


Autor: bati (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: 11833 (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: Thomas Pototschnig (pototschnig)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: Duke Scarring (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
process(gtx_clk)
begin
   if(rising_edge(gtx_clk))
   then
      case state is
         when send =>
            PHY_TX_EN <= '1';
            PHY_TXD <= etherframe(cnt*8 - 1 downto cnt*8 - 8);
            if(cnt = 1)
            then
               state <= idle;
            else
               cnt <= cnt - 1;
            end if;
         when idle =>
            PHY_TX_EN <= '0';
      end case; 
   end if;
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.

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht findet das einmalige Versenden des FPGAs in der Reset-Phase
des PHYs statt ...

Autor: bati (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schickst du denn eine Preamble (7 Bytes) und ein FrameDelimiter-Byte
vorweg ?

Autor: bati (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie groß ist deine Interframe-Lücke ?

Autor: bati (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie vorgeschrieben 12 Takte bei 125MHz. Habe ich aber auch schon 
vergrößert -> kein Unterschied.

Autor: SuperWilly (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: bati (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freut mich !
Gruß
SuperWilly

Autor: jan0385 (Gast)
Datum:

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

Autor: Robert Kuhn (Firma: Medizintechnik) (robident)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hört sich für mich seltsam an, dass man den aus dem Energysparmodus 
heraus starten muss.

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

Bewertung
0 lesenswert
nicht lesenswert
Bitte keine Zombies ausgraben....

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.