Forum: FPGA, VHDL & Co. Wieder CRC32!


von D. F. (leblanc)


Lesenswert?

Hallo zusammen,

Als Ethernet Anfänger, habe mich mit dem Ethernet Projekt von fpga4fun 
gefasst, ein Problem habe ich aber immer noch, die CRC32 Berechnung 
Teil. die code habe ich in VHDL übersetzt, aber mein Ergebniss stimmt 
nicht. zum beispiel für die sequence:

"00 10 A4 7B EA 80 00 12 34 56 78 90 08 00 45 00 00 2E B3 FE 00 00 80 11 
05 40 C0 A8 00 2C C0 A8 00 04 04 00 04 00 00 1A 2D E8 00 01 02 03 04 05 
06 07 08 09 0A 0B 0C 0D 0E 0F 10"(von Ethernet destination address bis 
Payload), der checksum sollte: 11 B3 31 88 1B sein. Meine Berechnung mit 
dem gleich sequence lifert kein richtigue Ergebniss.

Der code Teil von fpga4fun, für die crc32 Berechnung ist:

// generate the CRC32
1
reg [31:0] CRC;
2
reg CRCflush; always @(posedge clk20) if(CRCflush) CRCflush <= SendingPacket; else if(readram) CRCflush <= (rdaddress==7'h44);
3
reg CRCinit; always @(posedge clk20) if(readram) CRCinit <= (rdaddress==7);
4
wire CRCinput = CRCflush ? 0 : (ShiftData[0] ^ CRC[31]);
5
always @(posedge clk20) if(ShiftCount[0]) CRC <= CRCinit ? ~0 : ({CRC[30:0],1'b0} ^ ({32{CRCinput}} & 32'h04C11DB7));

Mein Übersetzung in VHDL ist:
1
PROCESS(TX_CLK)
2
  BEGIN
3
     if rising_edge(TX_CLK) then
4
       if (CRCflush = '1') then
5
         CRCflush <= SendingPacket;
6
      elsif(readram = '1') then
7
         if (rdaddress = "1000100") then--68 END OF DATA
8
            CRCflush <= '1';
9
            end if;
10
         end if;
11
      end if;
12
   END PROCESS;
13
14
   PROCESS(TX_CLK)
15
   BEGIN
16
      if rising_edge(TX_CLK) then
17
         if (readram = '1') then
18
            if (rdaddress = "0000111") then--7 END OF PREAMBLE
19
               CRCinit <= '1';
20
            else
21
               CRCinit <= '0';
22
            end if;
23
         end if;
24
      end if;
25
   END PROCESS;
26
  
27
  PROCESS(TX_CLK)
28
  BEGIN
29
     if rising_edge(TX_CLK) then
30
       if (CRCflush = '1') then
31
         CRCinput <= '0';
32
      else
33
         CRCinput <= (ShiftData(0) XOR CRC(31));
34
        
35
      end if;
36
    end if;
37
  END PROCESS;
38
  
39
  PROCESS(TX_CLK)
40
  BEGIN
41
     if rising_edge(TX_CLK) then
42
       if (CRCinit = '1') then
43
         CRC_pre <= X"FFFFFFFF";
44
      else
45
         
46
         CRC_pre <= ((CRC(30 downto 0) & '0') XOR (CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput AND "00000100110000010001110110110111"));
47
     end if;
48
     end if;
49
    END PROCESS;
50
           
51
  
52
  PROCESS(TX_CLK)
53
  BEGIN
54
     if rising_edge(TX_CLK) then
55
       if (ShiftCount(0) = '1') then
56
         CRC <= CRC_pre;
57
      end if;
58
    end if;
59
  END PROCESS;

Meinen Fragen sind folgende:

habe ich Fehler in die Übersetzung gemacht wenn ja, welche?
Kann mein code überhaupt ein richtige CRC32 berechnen?

Please help! und sorry für mein schlecht deutsche Sprache.

von Achim S. (Gast)


Lesenswert?

Hi,

die CRC32 kann einem anfangs tatsächlich den Spass am Schnüren von 
Ethernet-Paketen verderben. Was mir damals ziemlich weitergeholfen hat, 
sind Seiten wie diese:

http://www.electronicdesignworks.com/utilities/crc_generator/crc_generator.htm

Ist zwar nicht sehr sportlich, den Code einfach generieren zu lassen. 
Aber dafür funkioniert's dann wenigstens und man muss nur noch 
aufpassen, dass man die Bit richtigrum ans Paket anhängt.

schöne Grüße

Achim

von D. F. (leblanc)


Lesenswert?

Vielen Dank Achim,

Ich probiert mal mit den code Generator, wenn es geht, bin ich ein 
Schritt weiter.

Danke

von Oliver N. (neufranke)


Lesenswert?

deren output habe ich - wie viele andere sicher auch - ebenfalls bereits 
benutzt. scheinen die meisten so zu machen.

ich habe den eindruck, daß so ziemlich niemand genau weiss, wie man das 
mit dem crc so hinbekommt und alle nur kopieren ... wehe wenn deren kram 
nicht stimmt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.