CRC-Implementierung für Ethernet

Mit einem Beispiel für Daten mit einem Hexadezimalwert von 0xdaund einem Polynom 0x07würde ich den CRC wie folgt finden (unter Verwendung der Methodik von Wikipedia )

0xda = 11011010

11011010|00000000
111
00111010|00000000
  111
00000010|00000000
      11 1
00000001|10000000
       1 11
00000000|01000000

Aber die Antwort sollte 0x08laut diesem Rechner lauten .

Ich brauche die richtige Antwort für das IEEE-Standard-Ethernet. Ich habe festgestellt, dass einige Quellen die Daten auffüllen und andere nicht . IEEE scheint vorzuschlagen, dass Padding erforderlich ist, wenn die Daten kleiner als die CRC-Breite sind.

Hinweis: Ich weiß, dass der CRC auch nicht streng der Rest der Daten ist, die durch das Polynom dividiert werden.

0xda = 11011010 = 218
0x07 = 00000111 = 7
218/7 = 31 r 1

Wie Sie unten sehen können, skizziert das IEEE viel mehr Schritte als auf Wikipedia vorgeschlagen. Wie kann ich sicher sein, dass die CRC-Rechner online die richtigen Werte für Ethernet liefern?

Ethernet-CRC-Standard

Für meinen Versuch, dem Standard zu folgen (mit dem 8-Bit-CRC-Beispiel): a.) Die ersten 8 Bits des Rahmens werden ergänzt

11011010 -> 00100101

c.) Multiplizieren mit x^8 entspricht einer Verschiebung um 8 Bit (mit Nullen aufgefüllt)

00100101 -> 00100101 00000000 = 18688

d.) Teile durch G(x)und erhalte RestR(x)

18688/7 = 2669 r 5

Update: Ich habe seitdem eine 8-Bit-VHDL-Implementierung mit einer funktionierenden Lookup-Tabelle mit 256 Einträgen. Oder zumindest liefert es die gleichen Ergebnisse wie der Online-Rechner.

Ist der CRC ausgesät?

Antworten (1)

Ihr Missverständnis passiert gleich am Anfang. Das als 0x7 angegebene Polynom (in normaler Notation) ist mindestens ein 4-Bit-CRC, der Rechner, auf den Sie verweisen, berechnet einen 8-Bit-CRC.

In der normalen Notation ist das führende Bit des Polynoms 1 und wird weggelassen. Für einen 8-Bit-CRC (wenn wir den Rechner überprüfen wollen) ist das tatsächliche Polynom also nicht nur 1119 Bit lang, 10000011 1da das führende 9. Bit in dieser Notation weggelassen wird.

Wenn ich damit rechne:

11011010 00000000
10000011 1
-----------------
01011001 10000000
 1000001 11
-----------------
00011000 01000000
   10000 0111
-----------------
00001000 00110000
    1000 00111
-----------------
00000000 00001000

Voilá, das Ergebnis des Rechners erscheint 0x08.

Wenn es um CRCs geht, spricht man immer von Polynomdivision und nicht von normaler Division mit Rest.

Ich schlage vor, dass Sie sich über die Mathematik dahinter informieren, und da Sie an einer VHDL-Implementierung interessiert sind, denke ich, dass die Berechnungen auch sehr nützlich sind.

Der Schritt a)entspricht einem Init-Wert im Taschenrechner, FFfalls sich jemand wundert. Wenn dieser Schritt hinzugefügt wird, sieht das Ergebnis so aus:

00100101 00000000
  100000 111
-----------------
00000101 11100000
     100 000111
-----------------
00000001 11111100
       1 00000111
-----------------
00000000 11111011

Das Ergebnis ist also 0xFB. Der im OP verlinkte Taschenrechner liefert diesen Wert nicht (anscheinend kein Standardpolynom). Dieser Rechner ermöglicht es, selbst einen CRC zu definieren. Und wenn ich das CRC-8-Polynom und einen Anfangswert von 0xFF verwende, ist das Ergebnis das folgende:

CRC8-Berechnung

Also das gleiche wie meine Handrechnung.