Implementación de CRC para Ethernet

5

Con un ejemplo de datos con un valor hexadecimal de 0xda y un polinomio 0x07 , encontraría el CRC de la siguiente manera (utilizando la metodología de Wikipedia )

0xda = 11011010

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

Pero la respuesta debe ser 0x08 según esta calculadora .

Necesito que la respuesta sea correcta para el estándar Ethernet IEEE. Descubrí que algunas fuentes rellenan los datos y algunas no . IEEE parece sugerir que se requiere relleno si los datos son menores que el ancho CRC.

Nota: Sé que el CRC tampoco es estrictamente el resto de los datos dividido por el polinomio.

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

Como puede ver a continuación, el IEEE describe muchos más pasos que los sugeridos en Wikipedia. ¿Cómo puedo estar seguro de que las calculadoras CRC en línea dan los valores correctos para Ethernet?

Por mi intento de seguir el estándar (con el ejemplo de CRC de 8 bits) a.) Los primeros 8 bits de la trama se complementan

11011010 -> 00100101

c.) Multiplicar por x ^ 8 es equivalente a desplazar por 8 bits (rellenado con ceros)

00100101 -> 00100101 00000000 = 18688

d.) Divide por G(x) y obtén el resto R(x)

18688/7 = 2669 r 5

Actualización: desde entonces tengo una implementación de vhdl de 8 bits utilizando una tabla de búsqueda de 256 entradas que funciona. O al menos da los mismos resultados que la calculadora en línea.

    
pregunta iyop45

1 respuesta

2

Tu malentendido ocurre desde el principio. El polinomio dado como 0x7 (cuando se da en notación normal) es al menos un CRC de 4 bits, la calculadora a la que hace referencia calcula un CRC de 8 bits.

En la notación normal, el bit inicial del polinomio es 1 y se omite. Entonces, para un CRC de 8 bits (si queremos verificar la calculadora), el polinomio real no es solo 111 sino 9 bits de longitud: 10000011 1 porque el noveno bit inicial se omite en esa notación.

Si hago el cálculo con eso:

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

Voilá el resultado de la calculadora saldrá 0x08.

Cuando se trata de CRC, siempre se habla de división polinómica y no de división normal con el resto.

Le sugiero que lea la sección matemáticas detrás de eso y, como le interesa una implementación de VHDL, supongo que < a href="https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks"> los cálculos también son bastante útiles.

El paso a) corresponde a un valor de inicio en la calculadora de todo FF en caso de que alguien se pregunte. Con ese paso añadido, el resultado se ve así:

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

Entonces el resultado es 0xFB. La calculadora vinculada en el OP no proporciona ese valor (no parece un polinomio estándar). Esta calculadora permite definir usted mismo un CRC. Y si uso el polinomio CRC-8 y un valor inicial de 0xFF, el resultado es el siguiente:

Lo mismo que el cálculo de mi mano.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas