Ethernet Phy Rx wurde in einem FPGA entwickelt, um Daten an einen Ethernet-Mac zu senden

Ich versuche, Daten von einem FPGA an den Ethernet-Mac-Port eines SoC zu senden, der über die Stmmac-Synopsys-IP verfügt.

Geben Sie hier die Bildbeschreibung ein

Ich verwende das MII-Protokoll bei 25 MHz für 100 Mbit / s (4 Bit pro Taktzyklus).

Ich sende den folgenden gefälschten Ethernet-Frame:

FF FF FF FF FF FF       Destination Mac (broadcast)
58 00 E3 5B E8 41       Source Mac
00 2E                   Type with size (46=0x2E)
01 02 03 ... 44 45 46   Packet
CF C7 1F CC             FCS

Der gesamte Rahmen ist unter http://packetor.com gültig und geprüft . Der FCS hat recht.

FF FF FF FF FF FF 58 00 E3 5B E8 41 00 2E 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 CF C7 1F CC

Mein FPGA-Code sieht so aus:

reg [20:0] count;
reg ctl;
reg [3:0] d;

wire clk;
wire clk90;
pll pll_inst(
    .CLKI   (oscInternal),
    .CLKOP  (clk), //25MHz
    .CLKOS  (clk90) //25MHz shifted phase 90 degrees
);

//Packet is 8+6+6+2+46+4=72 bytes long, so 576 bits.
wire [575:0]val = 576'h55555555555555D5FFFFFFFFFFFF5800E35BE841002E01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546CFC71FCC;

always @(posedge clk) begin
    if (count < 72 * 2) begin
        ctl <= 1;
        if (count[0] == 0)
            d <= val >> (576 - 8 - 4 * count);
        else
            d <= val >> (576 - 4 * count);
    end else begin
        d <= 0;
        ctl <= 0;
    end
    count <= count + 1;
end

assign rxd0 = d[1];
assign rxd1 = d[0];
assign rxd2 = d[2];
assign rxd3 = d[3];
assign rxctl = ctl;
assign rxclk = clk90;

Ich sende 4-Bit für 4-Bit, zuerst die unteren 4 Bits, dann die höheren 4 Bits jedes Bytes. Dies wird bei jedem Taktzyklus durchgeführt.

Der Empfangstakt wird um 90 Grad verschoben, sodass Daten gültig sind, wenn der 25-MHz-Empfangstakt ansteigt.

Ich habe einen Digitalanalysator überprüft und es sieht gut aus, ähnlich dem Datenverkehr, der von einem Realtek PHY gesendet wird.

Im Kernel-DTS habe ich:

phy-mode = "mii";
fixed-link {
    speed = <100>;
    full-duplex;
};

Wenn ich boote, ist der Kernel mit dem stmmac-Mac korrekt eingerichtet. Der Kernel-Treiber ist hier:

https://elixir.bootlin.com/linux/v4.4.230/source/drivers/net/ethernet/stmicro/stmmac

In dmesg sehe ich eth0 up und auf 100 Mb/s konfiguriert. ifconfig eth0 up ist gut.

Ich kann Datenverkehr über einen Realtek PHY in einem ähnlichen Setup senden und er wird vom Kernel empfangen.

Aber ich sehe nichts, wenn ich durch mein FPGA sende. Gibt es etwas, das ich übersehe oder falsch mache?

Antworten (1)

Erstens, welche Schnittstelle verwenden Sie? Sie sagten MII, aber MII verwendet tx_en/tx_er oder rx_dv/rx_er anstelle von tx_ctl/rx_ctl. Es sei denn, Sie verwenden tatsächlich RGMII, das diese beiden an entgegengesetzten Taktflanken in ein Signal muxt, wobei er invertiert wird, um die Anzahl der Übergänge zu reduzieren.

Zweitens könnte dies ein Problem sein:

assign rxd0 = d[1];
assign rxd1 = d[0];
assign rxd2 = d[2];
assign rxd3 = d[3];

Aber vermutlich sollte der MAC immer noch verworfene Pakete zählen. Obwohl vielleicht nicht, wenn die geschalteten Bits die Erkennung des Frame-Starts vermasseln.

Angenommen, Sie verwenden RGMII, kann diese Schnittstelle die Datensignale verwenden, um Statusinformationen zwischen Frames zu übertragen. Siehe die RGMII-Spezifikation. Der MAC kann sich diese Statusinformationen ansehen, also sollten Sie versuchen, diese zu generieren. Sieht so aus, als ob Sie die Daten im Leerlauf auf 4'b1011 setzen möchten, um eine Vollduplexverbindung, 25-MHz-Takt, Verbindung anzuzeigen.

Das ist super nützlich! Ich habe die Bit-Inversion (Tippfehler) behoben. Ich dachte, dass RGMII und MII identisch sind. Ich habe nur einen Strg-Pin, also verwende ich jetzt RGMII im dts. Es werden immer noch keine empfangenen oder verworfenen Pakete von ifconfig eth0 gemeldet.
Nun, in diesem Fall sind mir die Ideen ausgegangen. Haben Sie versucht, das FPGA mit dem Realtek PHY zu verbinden, um zu sehen, ob Sie Pakete auf diese Weise als weitere Plausibilitätsprüfung senden können?
Sie haben bereits zwei Fehler gefunden. Ich danke Ihnen für Ihre Hilfe.