При передачи пакета получаю следующее:
Код
21:43:20.387485 IP [b]9.10.12.14 > 7.8.11.13: at-#15 2[/b] --Обратите внимание на IP адреса и порт
0x0000: ffff ffff ffff 0022 3344 5566 0800 4500
0x0010: 002e b3fe 0000 8011 c4e6 c0a8 0132 ffff
0x0020: ffff 0c81 0103 001a e80a 0001 0203 0405
0x0030: 0607 0809 0a0b 0c0d 0e0f 1011
Это полный Ehernet пакет без контрольной суммы и преамбулы.
написал на Verilog'е простейший код. Ошибка в IP адресах, хотя весь пакет до бита принимается правильно!
Это глюки или руки? :-)
Код
module probe(
input wire txc,
input wire reset,
output wire txen,
output wire [3:0]txd,
output wire mdc,
inout wire mdio,
output wire[7:0] leds,
output fxen
);
reg [15:0] n = 16'hFFFF;
reg [3:0] ep[0:15];
always@(negedge reset)
if (!reset) begin
//Этот геморой из-за нехватки памяти
ep[1] = 4'h0; ep[0] = 4'hE; ep[3] = 4'h0; ep[2] = 4'hF;
ep[5] = 4'h1; ep[4] = 4'h0; ep[7] = 4'h1; ep[6] = 4'h1;
ep[9] = 4'h1; ep[8] = 4'hB; ep[11] = 4'h4; ep[10] = 4'hE;
ep[13] = 4'hB; ep[12] = 4'h0; ep[15] = 4'h7; ep[14] = 4'hE;
end
wire end_packet = (n[7:1] > 8'h3F); //Выбор источника данных
wire [3:0] tx_o = end_packet ? ep[n[3:0]] : (n[0] ? udp_data[7:4] : udp_data[3:0]); //Данные передаются младшими битами вперед
wire [7:0] udp_data;
assign txen = (n[15:0] < 144); //143 - длина данных
assign txd = txen ? tx_o : 4'h0; //Если !txen, txd в состоянии IDLE
eth_packet eth_packet1(.q(udp_data), .a(n[6:1])); //Чтение данных из памяти
always@(negedge txc or negedge reset)
if (!reset)
n <= 16'hFFFF;
else
n <= n + 1'b1;
assign leds = {txd, tx_o};
assign mdc = 1'b0;
assign mdio = 1'bZ;
assign fxen = 1'b0;
endmodule
module eth_packet(
output reg [7:0] q,
input wire [5:0] a
);
always@*
begin
case (a)
8'h00: q = 8'h55; //Preamble & startbit
8'h01: q = 8'h55;
8'h02: q = 8'h55;
8'h03: q = 8'h55;
8'h04: q = 8'h55;
8'h05: q = 8'h55;
8'h06: q = 8'h55;
8'h07: q = 8'hD5;
8'h08: q = 8'hFF; //Dest MAC addreess
8'h09: q = 8'hFF;
8'h0A: q = 8'hFF;
8'h0B: q = 8'hFF;
8'h0C: q = 8'hFF;
8'h0D: q = 8'hFF;
8'h0E: q = 8'h00; // Source MAC address
8'h0F: q = 8'h22;
8'h10: q = 8'h33;
8'h11: q = 8'h44;
8'h12: q = 8'h55;
8'h13: q = 8'h66;
8'h14: q = 8'h08; // Type 0x0800 - IP
8'h15: q = 8'h00;
//IP Header
8'h16: q = 8'h45; //Version & IHL
8'h17: q = 8'h00;
8'h18: q = 8'h00;
8'h19: q = 8'h2E;
8'h1A: q = 8'hB3;
8'h1B: q = 8'hFE;
8'h1C: q = 8'h00;
8'h1D: q = 8'h00;
8'h1E: q = 8'h80;
8'h1F: q = 8'h11; //Protocol UDP
8'h20: q = 8'h03; //IP Checksum
8'h21: q = 8'h3B;
8'h22: q = 8'hC0; //Source IP address 192.168.1.50
8'h23: q = 8'hA8;
8'h24: q = 8'h01;
8'h25: q = 8'h32;
8'h26: q = 8'hC0; //Dest IP address 192.168.1.3
8'h27: q = 8'hA8;
8'h28: q = 8'h01;
8'h29: q = 8'h03;
8'h2A: q = 8'h0C;//Source UDP port 3201(0x0C81)
8'h2B: q = 8'h81;
8'h2C: q = 8'h01;//Dest UDP port
8'h2D: q = 8'h03;
8'h2E: q = 8'h00;//UDP length 0x001A(26 bytes)
8'h2F: q = 8'h1A;
8'h30: q = 8'h26;//UDP Checksum(0x0000 - Not check)
8'h31: q = 8'h5F;
8'h32: q = 8'h00;//Payload
8'h33: q = 8'h01;
8'h34: q = 8'h02;
8'h35: q = 8'h03;
8'h36: q = 8'h04;
8'h37: q = 8'h05;
8'h38: q = 8'h06;
8'h39: q = 8'h07;
8'h3A: q = 8'h08;
8'h3B: q = 8'h09;
8'h3C: q = 8'h0A;
8'h3D: q = 8'h0B;
8'h3E: q = 8'h0C;
8'h3F: q = 8'h0D; // На этом месте кончается память моей ПЛИСины :-)
endcase
end
endmodule