Tengo un flujo de datos de 181 bytes con un valor CRC32 de 4 bytes al final. La longitud total del mensaje es de 185 bytes.
El flujo de datos se almacena en la memoria de un chip FPGA y está a la espera de que TCP lo conecte.
Antes de enviar el mensaje, hay que modificar algunos datos de 32 bits en el flujo de datos, por lo que es necesario revisar el valor de CRC.
La ubicación de los nuevos valores de bit son desde 41st - 63rd bit (comenzando el quinto byte) desde el LSB del flujo.
Como el CRC está dentro de la carga útil del mensaje tcp, el encabezado tcp y la suma de comprobación ip también deben revisarse.
Actualmente tengo que construir un módulo de canalización para volver a calcular el CRC de esta manera:
module crc32 (
input rst,
input clk,
input [255:0] in_data,
input crc_en,
output crc_out
);
Funciona pero necesita gastar 181 bytes / 256 bits ~ = 6 ciclos para revisar el valor CRC de un mensaje TCP de 181 bytes.
Aunque el CRC se encuentra al final del mensaje de negocios, la suma de control del encabezado tcp (que es más importante que la carga útil del TCP) solo se puede revisar cuando se calcula el nuevo valor de CRC. Esa es la razón por la que tiene que esperar 6 ciclos.
¿Hay algún algoritmo CRC de revisión inteligente para poder usar menos ciclos para revisar el CRC de un flujo de datos modificado?
Ideas:
- ¿Hay alguna forma de volver a calcular el CRC en función del antiguo valor CRC? CRC (nuevo) = revisar (CRC (antiguo))?
- Aprendo de este documento que parcheando el flujo de datos para mantener el antiguo valor CRC.
CH5: OBTENER UN CRC ELEGIDO ALTERANDO UNA POSICIÓN ELEGIDA
Es interesante pero requiere volver a calcular crc de n bit a m bit
donde n = ubicación de bit de inicio del campo modificado
m = ubicación de bit de inicio del campo de parche
que no se ve bien para guardar ciclos de reloj.