CRC32 Umsetzung in ETHERNET: genaue Art und Weise

D

dilan2005

Guest
Hi,

Ich muss wissen, wie man Ethernet FCS!

Ich kann umzusetzen Generika crc32, aber es gibt einige andere spezielle Dinge zu tun, bevor die Daten auf dem CRC32-Generator und nach Gert CRC32 Prüfsumme aus dem Generator einige Bit-Auflösungen / Ergänzungkann jeder geben Sie mir eine kurze Nummer Form den Prozess der Installation Ethernet-Paket.
(Keine Notwendigkeit zu erklären, crc32 Gen-Prozess)

Wenn Sie erklären, nach-Ethernet-Paket und wie endgültig FCS gebildet ist es viel besser.
55 55 55 55 55 55 55 D5 / / Beginn des Frame

00 0A E6 F0 05 A3 00 12 34 56 78 90 08 00 45 00 00 30 B3 FE 00 00 80 11 72 BA 0A 00 00 03 0A 00 00 02 04 00 04 00 00 1C 89 4D 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13

7A D5 6B B3 / / Frame-Prüfsumme

Danke!
Grüße
dilan

 
Versuchen Sie, diese C-Programm.Es wird davon ausgegangen, 'int' ist 32 Bits und "char" ist 8 Bit.

Das Programm Ausgabe: 7A D5 6B B3

Code:

# include <stdio.h>int main (void)

(

unsigned char data [] =

(

0x00, 0x0A, 0xE6, 0xF0, 0x05, 0xA3, 0x00, 0x12,

0x34, 0x56, 0x78, 0x90, 0x08, 0x00, 0x45, 0x00,

0x00, 0x30, 0xB3, 0xFE, 0x00, 0x00, 0x80, 0x11,

0x72, 0xBA, 0x0A, 0x00, 0x00, 0x03, 0x0A, 0x00,

0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C,

0x89, 0x4D, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,

0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,

0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13

);

unsigned int crc_table [] =

(

0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,

0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,

0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,

0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000

);

unsigned int n, crc = 0;for (n = 0; n <sizeof (Daten), n )

(

crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 0)) & 0x0F]; / * unteren Nibble * /

crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 4)) & 0x0F]; / * oberen Nibble * /

)

for (n = 0; n <4; n ) / * Anzeige der CRC, niedrigere Byte zuerst * /

(

printf ( "% 02x", crc & 0xFF);

crc>> = 8;

)

printf ( "\ n");

return 0;

)
 
Vielen Dank, dass Sie sehr viel echo47, werde ich durch den Code
Rgds
dilan

 
Die FCS-Wert wird als eine Funktion der Inhalt der Quell-Adresse, Ziel-Adresse, Art / Länge und Daten (dh, alle Bereiche mit Ausnahme der Präambel, SFD, FCS und Erweiterung).
Hier finden Sie mehr Infos (Seite 16):
http://www.analog.com/UploadedFiles/Application_Notes/458197465EE269v01.pdf
und das
http://www.lammertbies.nl/comm/info/crc-calculation.html
und das
http://www.easics.be/webtools/crctool
kann nützlich sein für Sie.

 
Dank benradu.

die Dokumentation von anlog Geräte helfen much.try Ihr selbst Schritt mit Beispiel-und Online-calucaltor es doesent work.i festgestellt, dass aus einem anderen Forum "CRC32 AUTODIN II" algo muss used.i "dont know über C-Programm algo Name

keiner Weise
habe ich versucht umzusetzen über C-Code in Verilog, aber es mir falsch answer.can einer Anreise nach Verilog-Code für mich

Code:Modul FCS_CAL (clk, Daten, ermöglichen, crc_out, Reset);

CLK-Eingang;input [7:0] data;

Eingang ermöglichen;

Reset-Eingang;Leistung [31:0] crc_out;reg [31:0] crc_out;

reg [3:0] crc_table_adr;

reg [31:0] crc_table_data;immer @ (crc_table_adr) beginnen

Fall (crc_table_adr)

4'h0: crc_table_data = 32'h4DBDF21C;

4'h1: crc_table_data = 32'h500AE278;

4'h2: crc_table_data = 32'h76D3D2D4;

4'h3: crc_table_data = 32'h6B64C2B0;

4'h4: crc_table_data = 32'h3B61B38C;

4'h5: crc_table_data = 32'h26D6A3E8;

4'h6: crc_table_data = 32'h000F9344;

4'h7: crc_table_data = 32'h1DB88320;

4'h8: crc_table_data = 32'hA005713C;

4'h9: crc_table_data = 32'hBDB26158;

4'hA: crc_table_data = 32'h9B6B51F4;

4'hB: crc_table_data = 32'h86DC4190;

4'hC: crc_table_data = 32'hD6D930AC;

4'hD: crc_table_data = 32'hCB6E20C8;

4'hE: crc_table_data = 32'hEDB71064;

4'hF: crc_table_data = 32'hF0000000;ENDCASE

Endeimmer @ (posedge CLK) begin

if (reset == 1 & & ermöglichen == 0) crc_out = 32'h00000000;if (reset == 0 & & ermöglichen == 1) begin/ / crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 0)) & 0x0F]; / * unteren Nibble * /crc_table_adr = crc_out [3:0] ^ data1 [3:0];

# 100 crc_out = (crc_out>> 4) ^ crc_table_data;/ / crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 4)) & 0x0F]; / * oberen Nibble * /crc_table_adr = crc_out [3:0] ^ data1 [7:4];

d_out = crc_table_adr;

# 100 crc_out = (crc_out>> 4) ^ crc_table_data;

EndeEnde

endmodule

 
Sorry, aber ich weiß nicht, zu viel Verilog.
Ich habe die CRC-Tool (das dritte Glied, dass ich Ihnen), um einen vhdl Paket.
Ich habe dies in einem großen Projekt und arbeitet.
Die Online-CRC-Berechnung Werkzeug auch okay für mich.Ich benutze es die ganze Zeit brauche ich, um die Kontrolle einer doppelten CRC.
Hier ist die VHDL-Paket
Code:-------------------------------------------------- ---------------------

- Datei: PCK_CRC32_D8.vhd

- Datum: Mon Oct 29 15:04:32 2007

--

- Copyright (C) 1999-2003 Easics NV.

- Diese Quelle-Datei verwendet werden können, verteilt ohne Einschränkung

- Vorausgesetzt, dieser Copyright-Erklärung ist nicht aus der Datei entfernt

- Und, dass jede abgeleitete Arbeit enthält die Original-Copyright-Hinweis

- Und die damit verbundenen rechtlichen Hinweise.

--

- Diese Quelle FILE WIRD "AS IS" UND OHNE JEGLICHE AUSDRÜCKLICHE

- ODER STILLSCHWEIGENDEN GARANTIEN, EINSCHLIESSLICH, OHNE BESCHRÄNKUNG, DIE STILLSCHWEIGENDE

- GARANTIEN DER HANDELBARKEIT UND EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.

--

- Zweck: VHDL-Paket mit einem synthesizable CRC-Funktion

- * Polynoms: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)

- * Daten Breite: 8

--

- Info: Werkzeuge (at) easics.be

- Http://www.easics.com

-------------------------------------------------- ---------------------Library IEEE;

Verwendung IEEE.std_logic_1164.all;Paket PCK_CRC32_D8 ist- Polynom: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)

- Daten Breite: 8

- Konvent: Die erste serielle Daten Bit D (7)

Funktion nextCRC32_D8

(Daten: std_logic_vector (7 downto 0);

CRC: std_logic_vector (31 downto 0))

return std_logic_vector;Ende PCK_CRC32_D8;Library IEEE;

Verwendung IEEE.std_logic_1164.all;Package Body PCK_CRC32_D8 ist- Polynom: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)

- Daten Breite: 8

- Konvent: Die erste serielle Daten Bit D (7)

Funktion nextCRC32_D8

(Daten: std_logic_vector (7 downto 0);

CRC: std_logic_vector (31 downto 0))

return std_logic_vector istVariable D: std_logic_vector (7 downto 0);

Variable C: std_logic_vector (31 downto 0);

Variable NewCRC: std_logic_vector (31 downto 0);beginnenD: = Data;

C: = CRC;NewCRC (0): = D (6) xor D (0) xor C (24) xor C (30);

NewCRC (1): = D (7) xor D (6) xor D (1) xor D (0) xor C (24) xor C (25) xor

C (30) xor C (31);

NewCRC (2): = D (7) xor D (6) xor D (2) xor D (1) xor D (0) xor C (24) xor

C (25) xor C (26) xor C (30) xor C (31);

NewCRC (3): = D (7) xor D (3) xor D (2) xor D (1) xor C (25) xor C (26) xor

C (27) xor C (31);

NewCRC (4): = D (6) xor D (4) xor D (3) xor D (2) xor D (0) xor C (24) xor

C (26) xor C (27) xor C (28) xor C (30);

NewCRC (5): = D (7) xor D (6) xor D (5) xor D (4) xor D (3) xor D (1) xor

D (0) xor C (24) xor C (25) xor C (27) xor C (28) xor C (29) xor

C (30) xor C (31);

NewCRC (6): = D (7) xor D (6) xor D (5) xor D (4) xor D (2) xor D (1) xor

C (25) xor C (26) xor C (28) xor C (29) xor C (30) xor C (31);

NewCRC (7): = D (7) xor D (5) xor D (3) xor D (2) xor D (0) xor C (24) xor

C (26) xor C (27) xor C (29) xor C (31);

NewCRC (8): = D (4) xor D (3) xor D (1) xor D (0) xor C (0) xor C (24) xor

C (25) xor C (27) xor C (28);

NewCRC (9): = D (5) xor D (4) xor D (2) xor D (1) xor C (1) xor C (25) xor

C (26) xor C (28) xor C (29);

NewCRC (10): = D (5) xor D (3) xor D (2) xor D (0) xor C (2) xor C (24) xor

C (26) xor C (27) xor C (29);

NewCRC (11): = D (4) xor D (3) xor D (1) xor D (0) xor C (3) xor C (24) xor

C (25) xor C (27) xor C (28);

NewCRC (12): = D (6) xor D (5) xor D (4) xor D (2) xor D (1) xor D (0) xor

C (4) xor C (24) xor C (25) xor C (26) xor C (28) xor C (29) xor

C (30);

NewCRC (13): = D (7) xor D (6) xor D (5) xor D (3) xor D (2) xor D (1) xor

C (5) xor C (25) xor C (26) xor C (27) xor C (29) xor C (30) xor

C (31);

NewCRC (14): = D (7) xor D (6) xor D (4) xor D (3) xor D (2) xor C (6) xor

C (26) xor C (27) xor C (28) xor C (30) xor C (31);

NewCRC (15): = D (7) xor D (5) xor D (4) xor D (3) xor C (7) xor C (27) xor

C (28) xor C (29) xor C (31);

NewCRC (16): = D (5) xor D (4) xor D (0) xor C (8) xor C (24) xor C (28) xor

C (29);

NewCRC (17): = D (6) xor D (5) xor D (1) xor C (9) xor C (25) xor C (29) xor

C (30);

NewCRC (18): = D (7) xor D (6) xor D (2) xor C (10) xor C (26) xor C (30) xor

C (31);

NewCRC (19): = D (7) xor D (3) xor C (11) xor C (27) xor C (31);

NewCRC (20): = D (4) xor C (12) xor C (28);

NewCRC (21): = D (5) xor C (13) xor C (29);

NewCRC (22): = D (0) xor C (14) xor C (24);

NewCRC (23): = D (6) xor D (1) xor D (0) xor C (15) xor C (24) xor C (25) xor

C (30);

NewCRC (24): = D (7) xor D (2) xor D (1) xor C (16) xor C (25) xor C (26) xor

C (31);

NewCRC (25): = D (3) xor D (2) xor C (17) xor C (26) xor C (27);

NewCRC (26): = D (6) xor D (4) xor D (3) xor D (0) xor C (18) xor C (24) xor

C (27) xor C (28) xor C (30);

NewCRC (27): = D (7) xor D (5) xor D (4) xor D (1) xor C (19) xor C (25) xor

C (28) xor C (29) xor C (31);

NewCRC (28): = D (6) xor D (5) xor D (2) xor C (20) xor C (26) xor C (29) xor

C (30);

NewCRC (29): = D (7) xor D (6) xor D (3) xor C (21) xor C (27) xor C (30) xor

C (31);

NewCRC (30): = D (7) xor D (4) xor C (22) xor C (28) xor C (31);

NewCRC (31): = D (5) xor C (23) xor C (29);Rückkehr NewCRC;Ende nextCRC32_D8;Ende PCK_CRC32_D8;
 
Dilan2005 Hi, ich habe keine Zeit jetzt, um Ihren Code, sorry, aber die '=' Sperren Aufgaben und # 100 Verzögerungen sind nicht gut synthesizable Verilog Stil.Versuchen Sie es schriftlich völlig synchron Code, und vielleicht wird das Problem verschwinden.Viel Glück.

 
dankt allen helfen, mich auf this.sick der crc jetzt, und versuchen Sie es zu tun, das Geschäft der ursprünglichen Art und Weise. IEEE802.3 Spezifikation, Abschnitt 1,Ich habe folgenden Code für die PrüfungCode:"Zeitplan 1ns / 1PSModul cccc (clk, CRC_out);

CLK-Eingang;

Leistung [31:0] CRC_out;

reg [31:0] CRC_out;

reg [32:0] CRCPoly;

reg [32:0] CRC, crc_temp;

reg [7:0] j, k;

reg [15:0] temp_buf;

reg [7:0] Inbuff [90:0];

reg first_time;immer @ (posedge CLK) beginInbuff [0] = 8'h55;

Inbuff [1] = 8'h55;

Inbuff [2] = 8'h55;

Inbuff [3] = 8'h55;

Inbuff [4] = 8'h55;

Inbuff [5] = 8'h55;

Inbuff [6] = 8'h55;

Inbuff [7] = 8'hD5;Inbuff [8] = 8'h00; / / nicht invertiert FF

Inbuff [9] = 8'h0A; / / nicht inveted AF

Inbuff [10] = 8'hE6; / / ~ inverterd 98

Inbuff [11] = 8'hF0; / / ~ invertiert F0Inbuff [12] = 8'h05;

Inbuff [13] = 8'hA3;

Inbuff [14] = 8'h00;

Inbuff [15] = 8'h12;

Inbuff [16] = 8'h34;

Inbuff [17] = 8'h56;

Inbuff [18] = 8'h78;

Inbuff [19] = 8'h90;

Inbuff [20] = 8'h08;

Inbuff [21] = 8'h00;

Inbuff [22] = 8'h45;

Inbuff [23] = 8'h00;

Inbuff [24] = 8'h00;

Inbuff [25] = 8'h30;

Inbuff [26] = 8'hB3;

Inbuff [27] = 8'hFE;

Inbuff [28] = 8'h00;

Inbuff [29] = 8'h00;

Inbuff [30] = 8'h80;

Inbuff [31] = 8'h11;

Inbuff [32] = 8'h72;

Inbuff [33] = 8'hBA;

Inbuff [34] = 8'h0A;

Inbuff [35] = 8'h00;

Inbuff [36] = 8'h00;

Inbuff [37] = 8'h03;

Inbuff [38] = 8'h0A;

Inbuff [39] = 8'h00;

Inbuff [40] = 8'h00;

Inbuff [41] = 8'h02;

Inbuff [42] = 8'h04;

Inbuff [43] = 8'h00;

Inbuff [44] = 8'h04;

Inbuff [45] = 8'h00;

Inbuff [46] = 8'h00;

Inbuff [47] = 8'h1C;

Inbuff [48] = 8'h89;

Inbuff [49] = 8'h4D;

Inbuff [50] = 8'h00;

Inbuff [51] = 8'h01;

Inbuff [52] = 8'h02;

Inbuff [53] = 8'h03;

Inbuff [54] = 8'h04;

Inbuff [55] = 8'h05;

Inbuff [56] = 8'h06;

Inbuff [57] = 8'h07;

Inbuff [58] = 8'h08;

Inbuff [59] = 8'h09;

Inbuff [60] = 8'h0A;

Inbuff [61] = 8'h0B;

Inbuff [62] = 8'h0C;

Inbuff [63] = 8'h0D;

Inbuff [64] = 8'h0E;

Inbuff [65] = 8'h0F;

Inbuff [66] = 8'h10;

Inbuff [67] = 8'h11;

Inbuff [68] = 8'h12;

Inbuff [69] = 8'h13;

Inbuff [70] = 8'h00;

Inbuff [71] = 8'h00; / / 7AD5;

Inbuff [72] = 8'h00;

Inbuff [73] = 8'h00; / / 6BB3;CRCPoly = 33'b100000100110000010001110110110111;

CRC [32:0] = 33'h0FFAF98F0; / / IEEE zu ergänzen 32bits bevor der CRC-Generatorfor (j = 12; j <= 69; j = j 1) begin

for (k = 0; k <= 7; k = k 1) beginnen

temp_buf = Inbuff [j];CRC CRC = ([32:1], temp_buf [k]) / / LSB, über die crc Gen erstenif (CRC [32] == 1'b1) CRC = CRC ^ CRCPoly;

Ende

Ende

CRC_out = ~ CRC [31:0];

Ende

endmodule

 
Ich habe nicht studieren Sie cccc-Modul, sondern die "für" Loops versuchen die Berechnung der CRC der auch das gesamte Paket in einem Taktzyklus.

Versuchen Sie, diese Version von Verilog meiner C Beispiel.Die "ready"-Puls werden die letzten CRC-Wert:
Code:

Modul nach oben (clk, CRC, fertig);

CLK-Eingang;

reg [7:0] Daten [0:69];

reg [6:0] addr = 8;

wire [31:0] crc1, crc2;

Ausgabe reg [31:0] crc = 0;

Ausgang bereit reg = 0;ersten beginnen

data [0] = 8'h55; Daten [1] = 8'h55; Daten [2] = 8'h55; Daten [3] = 8'h55;

data [4] = 8'h55; Daten [5] = 8'h55; Daten [6] = 8'h55; Daten [7] = 8'hD5;

data [8] = 8'h00; Daten [9] = 8'h0A; Daten [10] = 8'hE6; Daten [11] = 8'hF0;

Daten [12] = 8'h05; Daten [13] = 8'hA3; Daten [14] = 8'h00; Daten [15] = 8'h12;

Daten [16] = 8'h34; Daten [17] = 8'h56; Daten [18] = 8'h78; Daten [19] = 8'h90;

Daten [20] = 8'h08; Daten [21] = 8'h00; Daten [22] = 8'h45; Daten [23] = 8'h00;

Daten [24] = 8'h00; Daten [25] = 8'h30; Daten [26] = 8'hB3; Daten [27] = 8'hFE;

Daten [28] = 8'h00; Daten [29] = 8'h00; Daten [30] = 8'h80; Daten [31] = 8'h11;

Daten [32] = 8'h72; Daten [33] = 8'hBA; Daten [34] = 8'h0A; Daten [35] = 8'h00;

Daten [36] = 8'h00; Daten [37] = 8'h03; Daten [38] = 8'h0A; Daten [39] = 8'h00;

Daten [40] = 8'h00; Daten [41] = 8'h02; Daten [42] = 8'h04; Daten [43] = 8'h00;

Daten [44] = 8'h04; Daten [45] = 8'h00; Daten [46] = 8'h00; Daten [47] = 8'h1C;

Daten [48] = 8'h89; Daten [49] = 8'h4D; Daten [50] = 8'h00; Daten [51] = 8'h01;

Daten [52] = 8'h02; Daten [53] = 8'h03; Daten [54] = 8'h04; Daten [55] = 8'h05;

Daten [56] = 8'h06; Daten [57] = 8'h07; Daten [58] = 8'h08; Daten [59] = 8'h09;

Daten [60] = 8'h0A; Daten [61] = 8'h0B; Daten [62] = 8'h0C; Daten [63] = 8'h0D;

Daten [64] = 8'h0E; Daten [65] = 8'h0F; Daten [66] = 8'h10; Daten [67] = 8'h11;

Daten [68] = 8'h12; Daten [69] = 8'h13;

EndeFunktion [31:0] crc_table;

input [3:0] addr;

Fall (addr)

0: crc_table = 32'h4DBDF21C;

1: crc_table = 32'h500AE278;

2: crc_table = 32'h76D3D2D4;

3: crc_table = 32'h6B64C2B0;

4: crc_table = 32'h3B61B38C;

5: crc_table = 32'h26D6A3E8;

6: crc_table = 32'h000F9344;

7: crc_table = 32'h1DB88320;

8: crc_table = 32'hA005713C;

9: crc_table = 32'hBDB26158;

10: crc_table = 32'h9B6B51F4;

11: crc_table = 32'h86DC4190;

12: crc_table = 32'hD6D930AC;

13: crc_table = 32'hCB6E20C8;

14: crc_table = 32'hEDB71064;

15: crc_table = 32'hF0000000;

Standard: crc_table = 32'bx;

ENDCASE

endfunctionzuweisen crc1 crc = [31:4] ^ crc_table (CRC [3:0] ^ data [addr] [3:0]);

zuweisen crc2 = crc1 [31:4] ^ crc_table (crc1 [3:0] ^ data [addr] [7:4]);immer @ (posedge CLK) begin

crc <= crc2;

addr <= addr 1;

ready <= (addr == 69);

Ende

endmodule
 
Danke.

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />

echo47 es funktioniert großartig: Di werden können, um meine UDP-Paket tx Teil heute.

als ich mich über Ihren Code ich das Gefühl, dass ich einige fehlende Codierung practices.is es eine Möglichkeit, meine Verilog Coding Style. (Bücher, Websites)

Danke
Rgds
dilan

 
endlich mein gewöhnliches Ethernet-MAC-TX-Modul mit crc.i wirklich apprciate Unterstützung, die Jungs auf dem Forum.Mein besonderer Dank gilt echo47 mit seinem seinem Verilog-Code konnte ich generieren crc auf der fly.and die das Ergebnis in PHY.i wird nach meiner gereinigt Verilog Quellcode meiner einfachen ETH tx bald.

 

Welcome to EDABoard.com

Sponsor

Back
Top