Ayuda con múltiples canales de receptor y arquitectura de almacenamiento único

4

Quiero crear un registrador de datos que tenga varios canales receptores que se ejecuten en el protocolo de comunicación en serie RS232 y luego recopilar la información de los canales en un solo almacenamiento al que otro controlador podría acceder cuando se llene.

Estoy usando Spartan-6 para el trabajo. Me imaginé que podría usar

  1. Presente de datos
  2. Búfer lleno
  3. Búfer medio lleno

y tengo que adjuntar un ID de canal cada vez que leo datos del receptor-búfer para que el controlador que lee mi FIFO sepa qué datos provienen de qué canal, esto genera una sobrecarga. Quiero que mi algoritmo tenga la sobrecarga más baja posible, ya que quiero adjuntar una parte apropiada de datos (bytes) con cada identificador. Mi velocidad de transmisión es de 115.200 kBd y mi reloj es de 16 MHz. Estoy pensando en tener 4 canales receptores.

Al principio, decidí ejecutar un FSM que comenzaría cada vez que una señal media completa fuera alta y leer de ese búfer en particular hasta que su señal data-present sea cero. También calculé que si mantenía la profundidad 4 del búfer en cada canal del receptor y si la lectura de cada byte tomaba 2 ciclos, aún me quedaría el ciclo de reloj apropiado para leer todos los búferes, escríbalo a un solo FIFO y pida al controlador que leer todo

El problema con este enfoque es que podría perder datos en caso de que un canal no envíe más de 7 bytes (porque kcuart6 tiene un FIFO de profundidad 16 que no puedo cambiar a 4).

Chicos, quiero sugerencias para una arquitectura a prueba de tontos que garantice que no se pierdan bytes mientras mi lógica de cola lee los buffers del receptor y también mientras el controlador accede a mi memoria de almacenamiento (porque no puedo escribir mientras el controlador está leyendo mi FIFO).

    
pregunta MavenMerkel

1 respuesta

1

Si entiendo su diseño correctamente, creo que tiene un problema de diseño que debe abordarse primero.

Está capturando datos de uno de varios búferes de recepción de UART y los está cargando directamente en un búfer de transmisión de UART.

Esto tendrá el impacto de mezclar bytes de cada búfer entrante en el flujo de salida sin una forma aparente de desmarcarlos.

Generalmente, al multiplexar secuencias como esta, recibiría un paquete delimitado de algún tipo, probablemente terminado con un salto de línea. Almacena en búfer la entrada hasta que obtiene el terminador y luego transmite el búfer, probablemente con una marca de encabezado con la que está asociada la línea.

Esto conduce a responder el problema que estás abordando. Hay dos enfoques para esto, su enfoque actual se conoce como tiempo real. La velocidad de entrada máxima es X por segundo, los proceso en Y ns, el tiempo funciona todo es dulce.

Una vez que se cambia a los buffers, se dificulta un enfoque difícil en tiempo real. Un enfoque suave en tiempo real usaría la tasa promedio de los datos entrantes, un búfer (o cuatro en su caso) que absorbe alguna variación en esa tasa y una tasa de salida promedio. Usted diseña en algún margen, por lo que la entrada promedio no es más del 80% de la salida y se coloca en un controlador para el improbable caso de que el búfer comience a desbordarse (la eliminación de paquetes es normal).

Por cierto. Los buffers de anillo son agradables para este tipo de flujo de trabajo constante de entrada y salida de datos.

    
respondido por el lod

Lea otras preguntas en las etiquetas