Ethernet Phy Rx desarrollado en un FPGA para enviar datos a un Mac ethernet

Estoy tratando de enviar datos desde un FPGA al puerto Ethernet Mac de un SoC que tiene la IP stmmac Synopsys.

ingrese la descripción de la imagen aquí

Estoy usando el protocolo MII a 25 MHz a 100 Mb/s (4 bits por ciclo de reloj).

Estoy enviando el siguiente marco de ethernet falso:

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

El marco completo es válido y se verifica en http://packetor.com . El FCS es correcto.

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

Mi código FPGA se ve así:

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;

Envío 4 bits por 4 bits, primero los 4 bits inferiores y luego los 4 bits superiores de cada byte. Esto se hace en cada ciclo de reloj.

El reloj rx se desplaza 90 grados para que los datos sean válidos cuando el reloj rx de 25 MHz se está elevando.

He comprobado en un analizador digital y se ve bien, similar al tráfico enviado por un Realtek PHY.

En el kernel DTS, tengo:

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

Cuando arranco, el kernel está configurado correctamente con stmmac Mac. El controlador del núcleo está aquí:

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

En dmesg, veo eth0 activo y configurado a 100 Mb/s. ifconfig eth0 arriba es bueno.

Puedo enviar tráfico a través de Realtek PHY en una configuración similar y el núcleo lo recibe.

Pero no veo nada cuando estoy enviando a través de mi FPGA. ¿Hay algo que me estoy perdiendo o haciendo mal?

Respuestas (1)

Primero, ¿qué interfaz estás usando? Dijiste MII, pero MII usa tx_en/tx_er o rx_dv/rx_er en lugar de tx_ctl/rx_ctl. A menos que realmente esté usando RGMII, que mezcla esas dos señales en una sola en los bordes opuestos del reloj, con er invertida para reducir la cantidad de transiciones.

En segundo lugar, esto podría ser un problema:

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

Pero, presumiblemente, el MAC aún debería contar los paquetes perdidos. Aunque quizás no si los bits conmutados arruinan la detección del inicio del cuadro.

Además, suponiendo que esté usando RGMII, esa interfaz puede usar las señales de datos para transferir información de estado entre marcos. Consulte la especificación RGMII. El MAC puede estar mirando esta información de estado, por lo que debería intentar generarla. Parece que es posible que desee configurar los datos inactivos en 4'b1011, para indicar enlace dúplex completo, reloj de 25 MHz, enlace activo.

¡Esto es súper útil! He corregido la inversión de bits (error tipográfico). Pensé que RGMII y MII eran idénticos. Solo tengo un pin ctl, así que ahora estoy usando RGMII en el dts. Todavía no hay paquetes recibidos o descartados informados por ifconfig eth0.
Bueno, en ese caso me quedo sin ideas. ¿Ha intentado conectar el FPGA al Realtek PHY para ver si puede enviar paquetes de esa manera como otra verificación de cordura?
Ya encontraste dos errores. Gracias por su ayuda.