CRC32 gennemførelse i ETHERNET: nøjagtige måde

D

dilan2005

Guest
hej,

Jeg har brug for at vide, hvordan du får ethernet FCS!

Jeg kan gennemføre generiske crc32, men der er nogle andre specielle ting at gøre, før data sættes under crc32 generator og efter Gert crc32 checksum ud af generator nogle bit tilbageførsel / supplerekan en hvilken som helst give mig en kort bemærkning form processen med opsætning Ethernet packet.
(Man behøver ikke at forklare crc32 gen-processen)

Hvis du kan forklare følgende Ethernet packet og hvordan endelig FCS dannede det er meget bedre.
55 55 55 55 55 55 55 D5 / / start 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 kontrolsum

Tak!
hilsen
dilan

 
Prøv dette C-program.Det antages' int 'er 32 bit og' tegn 'er 8 bit.

Programmet output er: 7A D5 6B B3

Code:

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

(

usignerede 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

);

usignerede int crc_table [] =

(

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

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

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

0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000

);

usignerede int n, crc = 0;for (n = 0; n <sizeof (data); n )

(

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

crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 4)) & 0x0F]; / * øvre gnaske * /

)

for (n = 0; n <4 n ) / * vise CRC, lavere byte første * /

(

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

crc>> = 8;

)

printf ( "\ n");

tilbagevenden 0;

)
 
Den FCS værdi er beregnet som en funktion af indholdet af den kilde, adresse, destination adresse, type / længde og data (dvs. alle områder undtagen præamblen, SFD, FCS, og udvidelse).
Her kan du finde mere info (side 16):
http://www.analog.com/UploadedFiles/Application_Notes/458197465EE269v01.pdf
og dette
http://www.lammertbies.nl/comm/info/crc-calculation.html
og dette
http://www.easics.be/webtools/crctool
kan være nyttige for dig.

 
takket benradu.

Det documentaion af anlog anordninger hjælpe much.try ud din selvstændige skridt med eksempel og online calucaltor det doesent work.i konstateres, at fra et andet forum "CRC32 AUTODIN II" algo skal used.i 'dont know ovenfor c programmet algo navn

nogen måde, jeg forsøgte at gennemføre ovenstående c kode i verilog men det giver mig forkert answer.can en check følgende verilog kode for mig

Code:modul FCS_CAL (CLK, data, aktivere crc_out, reset);

input CLK;input [7:0] data;

input muliggør;

input nulstille;output [31:0] crc_out;reg [31:0] crc_out;

reg [3:0] crc_table_adr;

reg [31:0] crc_table_data;altid @ (crc_table_adr) begynder

sagen (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

endealtid @ (posedge CLK) begynder

if (nulstille == 1 & & muliggøre == 0) crc_out = 32'h00000000;if (nulstille == 0 & & muliggøre == 1) begynde/ / crc = (crc>> 4) ^ crc_table [(crc ^ (data [n]>> 0)) & 0x0F]; / * lavere gnaske * /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]; / * øvre gnaske * /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

 
beklager, men jeg ved ikke, for meget verilog.
Jeg brugte CRC værktøj (tredje link, jeg gav dig) til at generere en vhdl pakke.
Jeg brugte dette i et projekt og arbejder meget.
Online crc beregning værktøj fungerer også OK for mig.Jeg bruger det hele tiden, jeg har brug for at dobbelttjekke en CRC.
her er den vhdl pakke
Code:-------------------------------------------------- ---------------------

- File: PCK_CRC32_D8.vhd

- Dato: man okt 29 15:04:32 2007

--

- Copyright (C) 1999-2003 Easics NV.

- Denne kilde fil kan bruges og distribueres uden begrænsninger

- Forudsat at denne copyright erklæring ikke fjernes fra arkivet

- Og at eventuelle afledte værker indeholder den oprindelige meddelelse om ophavsret

- Og de tilhørende ansvarsfraskrivelse.

--

- Denne kilde FILE LEVERES "SOM DET ER" OG UDEN NOGEN UDTRYKKELIG

- ELLER UNDERFORSTÅEDE GARANTIER, HERUNDER, MEN IKKE BEGRÆNSET TIL, UNDERFORSTÅEDE

- GARANTIER FOR MERCHANTIBILITY OG EGNETHED TIL ET BESTEMT FORMÅL.

--

- Formål: VHDL-pakken indeholder en synthesizable CRC funktion

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

- * Data bredde: 8

--

- Info: værktøjer (at) easics.be

- Http://www.easics.com

-------------------------------------------------- ---------------------library IEEE;

brug IEEE.std_logic_1164.all;pakke PCK_CRC32_D8 er- Polynomisk: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)

- Data width: 8

- Konvention: den første serielle bit er D (7)

funktion nextCRC32_D8

(Data: std_logic_vector (7 downto 0);

CRC: std_logic_vector (31 downto 0))

tilbagevenden std_logic_vector;udgangen PCK_CRC32_D8;library IEEE;

brug IEEE.std_logic_1164.all;pakke organ PCK_CRC32_D8 er- Polynomisk: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)

- Data width: 8

- Konvention: den første serielle bit er D (7)

funktion nextCRC32_D8

(Data: std_logic_vector (7 downto 0);

CRC: std_logic_vector (31 downto 0))

tilbagevenden std_logic_vector ervariablen D: std_logic_vector (7 downto 0);

variabel C: std_logic_vector (31 downto 0);

variable NewCRC: std_logic_vector (31 downto 0);begyndD: = 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);tilbagevenden NewCRC;udgangen nextCRC32_D8;udgangen PCK_CRC32_D8;
 
Hi dilan2005, jeg har ikke tid lige nu til at studere din kode, beklager, men de '=' blokering opgaver og # 100 forsinkelser er ikke godt synthesizable Verilog stil.Prøv at skrive helt synkron-kode, og måske problemet vil forsvinde.Held og lykke.

 
takket alle hjælpe mig på this.sick af crc nu og forsøge at gøre det bussiness den oprindelige måde. IEEE802.3 specifikation afsnit 1,Jeg skrev følgende kode til afprøvningCode:«tidshorisont 1ns / 1psmodul cccc (CLK, CRC_out);

input CLK;

output [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;altid @ (posedge CLK) begynderInbuff [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; / / ikke omvendt FF

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

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

Inbuff [11] = 8'hF0 / / ~ inverteret 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 bedt om at supplere 32bits før til CRC generatorfor (j = 12, j <= 69; j = j 1) begynde

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

temp_buf = Inbuff [j];CRC = (CRC [32:1], temp_buf [k]) / / LSB sat til crc gen førsteif (CRC [32] == 1'b1) CRC = CRC ^ CRCPoly;

ende

ende

CRC_out = ~ CRC [31:0];

ende

endmodule

 
Jeg har ikke studere dine cccc modul, men de 'for' sløjfer forsøger at beregne den CRC af hele pakken i en taktcyklus.

Prøv denne Verilog version af min C eksempel.Den 'ready' puls identificerer endelig CRC værdi:
Code:

modul toppen (CLK, crc, klar);

input CLK;

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

reg [6:0] addr = 8;

wire [31:0] crc1, crc2;

output reg [31:0] crc = 0;

output reg klar = 0;indledende begynde

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

endefunktionen [31:0] crc_table;

input [3:0] adr;

sagen (adr)

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

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

tildele crc2 = crc1 [31:4] ^ crc_table (crc1 [3:0] ^ data [addr] [7:4]);altid @ (posedge CLK) begynder

crc <= crc2;

adr <= addr 1;

klar <= (adr == 69);

ende

endmodule
 
tak.

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

echo47 sig anlæg stor: Di vil kunne slutte min UDP packet tx del i dag.

som jeg går gennem din kode Jeg føler at jeg mangler nogle koder practices.is der nogen måde at forbedre mit verilog kodende stil. (bøger, sites)

Tak
rgds
dilan

 
Endelig kunne skrive min simple Ethernet MAC tx modul med crc.i virkelig apprciate ydet støtte fra fyrene på forum.min særlig tak til echo47 bruger hans hans verilog kode Jeg var i stand til at generere crc om fly.and sætte resultere i, at PHY.i vil efter min rengøres verilog kildekoden på mit enkle eth tx snart.

 

Welcome to EDABoard.com

Sponsor

Back
Top