Detección de paquetes en datastream en FPGA

1

Hardware:

Tengo un "sensor" asic que me envía paquetes de 32 bits (serie). Necesito detectar estos paquetes con un FPGA.

Cuando comienzo la lectura, el sensor me está enviando paquetes de datos hasta que detengo la lectura. Puede haber tiempos de inactividad (sin longitud específica) entre los paquetes de datos. Si el asic no está enviando ningún paquete (tiempo de inactividad), recibo 0xA3 como datos de inactividad.

El sensor envía LSB primero (de un paquete). Eso significa que primero obtengo los datos. Recibo el encabezado al final de una transferencia de paquetes. En mi FPGA quiero detectar estos paquetes. ¿Hay una forma general de hacer esto?

Ya logré formatear el flujo de bits en serie en datos paralelos de 8 bits.

Demostración del problema que tengo:

El problema general es que puede haber datos que parecen inactivos o datos que parecen un encabezado. Lo cual no está mal cuando no es el último byte de datos del paquete, como en el 2. Ejemplo:

I - > 0xA3 (datos de inactividad)

H - > 0x6 (cabecera del paquete)

D - > 0x00 - 0xFF (datos en el paquete)

ID - > 0xA3 (datos que parecen inactivos)

HD - > 0x6 (datos que parecen un encabezado)

1. Ejemplo (el sensor envía el LSB primero):

 MSB
| packet 2  | packet 1  |
 H  D  D  D  H  D  D  D  I  I

estos 2 paquetes son fáciles de detectar porque no hay una "ID" o "HD".

2. Ejemplo (el sensor envía el LSB primero):

 MSB
| packet 3  | packet 2  | packet 1  |
 H  D  D  D  H  D  D  HD H  D  D  ID I

Difícil de detectar. El primer paquete comienza con una secuencia inactiva y el segundo paquete tiene datos que parecen un encabezado.

¿Hay una forma general de detectar esto? Pensé en la convolución, pero no estoy seguro de cómo implementarla aquí. Estoy usando VHDL.

    
pregunta puzzled

2 respuestas

3

No hay garantías con un diseño de protocolo desafortunado como este. Pero puede hacerlo al menos tan bien como lo hace un UART en datos seriales asíncronos. Déjame explicarte.

Dado que ya ha encontrado los límites de bytes en el flujo de datos, puede pensar que el byte del encabezado (H) es similar a un bit de inicio de UART, y que el byte inactivo (I) es similar a un (opcional) Bit de parada UART.

Configure una máquina de estados que se inicie en un estado "inactivo" y busque el siguiente byte de encabezado, ignorando cualquier cosa que no sea una H (incluidos los I bytes reales). Una vez que encuentre una H, capturará los siguientes 3 bytes de datos, independientemente de su valor. Luego, dependiendo de si el siguiente byte después de eso es H o no, avanzará al estado de "encabezado" o "inactivo".

Sí,aligualqueunUART,estopuedebloquearseenunadesalineaciónsilospaquetesdedatos(prefieroeltérmino"paquetes") contienen H bytes repetidamente, pero a menos que los datos sean particularmente patológicos, la máquina de estado debería alinearse rápidamente. en los encabezados "reales": todo lo que necesita es un paquete que no contenga un byte H falso.

Si puede asegurarse de que el ASIC no envíe su primer paquete hasta que se inicialice la máquina de estado, entonces no debería haber ningún problema. De lo contrario, si la máquina de estado se inicia en un punto arbitrario en un flujo de datos que ya está en ejecución, puede tener problemas. Puedes verificar los bytes que no son I cuando estás en el estado "inactivo", esto indica que estás fuera de alineación.

EDITAR: La respuesta anterior se basó en la suposición errónea de que el byte "H" aparece antes de los datos en cualquier paquete dado; Resulta que estaba equivocado sobre eso. Sin embargo, voy a dejar esa parte como está, porque ese es, con mucho, el caso más común. A continuación, abordaré el problema al que se enfrenta el OP, que tiene el byte "H" siguiendo los bytes de datos.

En una situación como esta, es necesario configurar una canalización (registro de desplazamiento) que pueda contener el paquete completo de 4 bytes.

Losbytessedesplazanatravésdeloscuatroregistrosenlapartesuperiorensecuencia.Elbytemásantiguo(elLSB,quellegóprimero)terminaenelregistrodeladerechaalmismotiempoqueelbyte"H" para ese paquete llega al registro de la izquierda.

La máquina de estado supervisa el contenido del registro "H", y si de hecho es el valor "H" cuando está en el estado "encabezado", se confirma su salida, lo que habilita el registro de captura en el segundo fila, y también afirma la señal de "salida válida".

El diagrama de estado se ve así:

ComenzamosporlaizquierdayhacemosunasecuenciaatravésdelostresestadosdedatosantesdebuscarelprimerbyteH.Siestamosenelestadode"encabezado" cuando encontramos un byte H, los tres bytes anteriores DEBEN haber sido bytes de datos, para que sean capturados. Luego, volvemos a recorrer los tres estados de datos para capturar al menos tres bytes más antes de comenzar a buscar la H nuevamente.

Lamentablemente, este protocolo puede desincronizarse fácilmente si cualquier paquete que contenga un byte "HD" (encabezado falso) también está precedido por I (inactivo) bytes. Para que esta implementación se mantenga sincronizada, se debe cumplir al menos una de las dos condiciones:

  • No hay bytes HD en los paquetes.
  • No hay bytes I entre paquetes.

De lo contrario, simplemente no existe una forma sólida de mantener la alineación de paquetes. Como dije, esta es una elección "desafortunada" de protocolo por parte del diseñador ASIC. Si el byte H apareciera primero en el paquete en lugar de en el último, estas restricciones desaparecerían.

    
respondido por el Dave Tweed
0

Supongo que no tiene control sobre el diseño del ASIC y, por lo tanto, no puede resolverlo allí (por ejemplo, mediante la señalización fuera de banda del inicio del paquete, o mediante el uso de una codificación de datos que permita que un valor ilegal especifique el inicio inactivo o del paquete marcadores). Si puede cambiar el asic, sería mejor hacerlo.

De lo contrario, comenzaría escribiendo una expresión regular que describa los posibles formatos de paquetes. Una vez que tenga eso, se puede convertir en una máquina de estado que reconoce un paquete completo. Luego, debe implementar esa máquina de estado y usarla para generar un pulso de sincronización.

Perderá el primer paquete completo que reciba después de reiniciar. También es posible que reconozca un paquete válido completo dentro de los datos de otro paquete, pero es poco probable que esté seguro de que desearía detectar datos inválidos repetidos y restablecerlos si eso sucede. Esto puede causar la pérdida de un número no trivial de paquetes en raras ocasiones. Esto puede o no ser apropiado para su aplicación, pero es mucho más fácil que la alternativa (lo que implica almacenar una cantidad significativa de datos para que pueda estar seguro de cuándo está sincronizado y luego procesarlo de forma retrospectiva).

    
respondido por el Jules

Lea otras preguntas en las etiquetas