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
- Presente de datos
- Búfer lleno
- 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).