mikrocontroller.net

Forum: FPGA, VHDL & Co. Wieder CRC32!


Autor: D. Franklin (leblanc)
Datum:

Bewertung
0 lesenswert
nicht 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
reg [31:0] CRC;
reg CRCflush; always @(posedge clk20) if(CRCflush) CRCflush <= SendingPacket; else if(readram) CRCflush <= (rdaddress==7'h44);
reg CRCinit; always @(posedge clk20) if(readram) CRCinit <= (rdaddress==7);
wire CRCinput = CRCflush ? 0 : (ShiftData[0] ^ CRC[31]);
always @(posedge clk20) if(ShiftCount[0]) CRC <= CRCinit ? ~0 : ({CRC[30:0],1'b0} ^ ({32{CRCinput}} & 32'h04C11DB7));

Mein Übersetzung in VHDL ist:
PROCESS(TX_CLK)
  BEGIN
     if rising_edge(TX_CLK) then
       if (CRCflush = '1') then
         CRCflush <= SendingPacket;
      elsif(readram = '1') then
         if (rdaddress = "1000100") then--68 END OF DATA
            CRCflush <= '1';
            end if;
         end if;
      end if;
   END PROCESS;

   PROCESS(TX_CLK)
   BEGIN
      if rising_edge(TX_CLK) then
         if (readram = '1') then
            if (rdaddress = "0000111") then--7 END OF PREAMBLE
               CRCinit <= '1';
            else
               CRCinit <= '0';
            end if;
         end if;
      end if;
   END PROCESS;
  
  PROCESS(TX_CLK)
  BEGIN
     if rising_edge(TX_CLK) then
       if (CRCflush = '1') then
         CRCinput <= '0';
      else
         CRCinput <= (ShiftData(0) XOR CRC(31));
        
      end if;
    end if;
  END PROCESS;
  
  PROCESS(TX_CLK)
  BEGIN
     if rising_edge(TX_CLK) then
       if (CRCinit = '1') then
         CRC_pre <= X"FFFFFFFF";
      else
         
         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"));
     end if;
     end if;
    END PROCESS;
           
  
  PROCESS(TX_CLK)
  BEGIN
     if rising_edge(TX_CLK) then
       if (ShiftCount(0) = '1') then
         CRC <= CRC_pre;
      end if;
    end if;
  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.

Autor: Achim S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Autor: D. Franklin (leblanc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Achim,

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

Danke

Autor: Oliver N. (neufranke)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.