¿El diseño del enrutador Verilog y la mejor manera de manejar paquetes de tamaño variable en verilog?

3

Tengo una pregunta de diseño lógico / Verilog sintetizable. Mi pregunta es más lógica que la sintaxis.

Deseo implementar algún tipo de enrutador que tenga tres puertos de entrada / salida de UART RS232 dúplex completo, que se envían paquetes entre sí.

Principales puntos de diseño:

  • Los paquetes son de tamaño variable y contienen los siguientes campos: origen (1 byte), destino (1 byte), longitud de carga útil (2 bytes), carga útil.
  • la longitud de la carga útil es variable entre 4-2000 bytes.
  • Quiero tener algún tipo de tabla de enrutamiento "qué destino se enrutará a cuál de los puertos UART", y algún tipo de firewall (no estoy seguro del nombre correcto) como "qué fuentes permitieron enviar paquetes a los cuales UART puertos ".
  • se permite el bucle invertido (el paquete que se recibe y envía a través del mismo puerto)
  • se permite la transmisión (tal vez la dirección de destino que se enruta a más de un puerto UART)
  • el módulo debe ser genérico para que pueda expandirlo a más de 4 puertos.

Para mí, creo que la parte más difícil para comenzar es cómo manejar los paquetes de tamaño variable. Si los paquetes tuvieran un tamaño fijo y no fueran demasiado grandes, habría tenido una entrada FIFO y una salida FIFO para cada puerto UART:

reg [packet_size-1: 0] fifo [num_of_packets]

cada entrada FIFO habría almacenado en cada quince [I] un paquete completo que se recibió de la uart, y un módulo que lee paquetes completos de cada entrada FIFO, verifica la fuente del destino de cada paquete y el uso de esa ruta paquete a la salida FIFO deseada, y desde allí un transmisor UART que toma un paquete y lo envía byte tras byte. El problema es que un paquete puede ser realmente muy grande, por lo que no quiero mantener un fifo que tenga 2000 bytes en cada celda ...

¿Eso también plantea la cuestión de cómo transferir los paquetes entre los módulos internos? Como se dijo, un paquete puede llegar a ser muy grande.

Comprendo que hay muchas preguntas en mi publicación, pero agradeceré cualquier ayuda. Además, si hay algunos diseños de referencia o algo similar que puedan ayudarme, con gusto lo revisaré.

Gracias por la ayuda.

    
pregunta shush

3 respuestas

0

En pocas palabras, "Análisis del peor caso", y en este caso, supongo que tiene pocos requisitos de rendimiento, y solo desea recibir datos y transmitirlos.

2kB no es mucha memoria, pero, aparentemente, el preámbulo tiene toda la información que necesita para transmitir "en tiempo real". Una vez que sepa a dónde va (destino), y suponiendo que no necesita interpretar u operar con los datos, todo lo que necesita hacer, después de recibir el preámbulo y configurar su transmisor, es recolectar un byte / palabra (lo que sea su tamaño de datos es para la carga útil) y transmítalo, una y otra vez, hasta que haya alcanzado el número de bytes. Debería poder hacer esto con una arquitectura de "ping-pong FIFO" ... probablemente, con una latencia cercana a la longitud del preámbulo (es decir, un retraso en la tubería).

El almacenamiento mínimo (memoria y / o registros) para lo que describí es ~ (número de bytes en preámbulo) + (2 * número de bits para datos)

    
respondido por el CapnJJ
0

Bueno, necesita usar FIFO, pero almacenarán bytes en lugar de paquetes y utilizará las máquinas de estado para controlar las transferencias, de modo que se transfiera el número correcto de bytes para cada paquete. También es posible dividir el encabezado de las cargas útiles y almacenarlas en FIFO separados, lo que puede o no ser útil dependiendo de la aplicación.

¿Pero es realmente una buena aplicación para un FPGA? Los UART suelen ser bastante lentos, y puede obtener microcontroladores que tienen muchos UART de hardware (es decir, Atmel xmega).

    
respondido por el alex.forencich
0

Suponiendo que varios puertos de entrada pueden recibir datos a la vez, no puede garantizar que pueda transmitir de un puerto a otro en tiempo real. Porque dos puertos podrían intentar enrutarse al mismo destino al mismo tiempo.

Por lo tanto, necesitará un búfer de paquetes para cada puerto de entrada.

Ciertamente no quieres un FIFO de 2000 bytes x N porque eso desperdiciaría mucha memoria.

La consecuencia de perder memoria, por supuesto, es que no se puede almacenar tantos paquetes. En situaciones donde hay mucho tráfico, esto podría provocar la caída de paquetes.

En lugar de usar un FIFO con cada elemento como un paquete, use un byte circular de byte. De esa manera, no habrá desperdiciado espacio al almacenar paquetes más pequeños.

Para implementar el búfer circular solo mantenga unos pocos índices.

Deje que el índice P1 apunte al inicio del primer paquete en el búfer. Deje que el índice P2 apunte justo después del final del último paquete completo en el búfer. Deje que el índice P3 apunte al último byte recibido.

A medida que los paquetes entran en proceso, su encabezado en tiempo real. Solo colóquelos en el búfer si tiene espacio (que se puede calcular a partir de P1, P2 y el tamaño de su búfer).

Si puede ajustar el paquete, coloque sus bytes en el búfer a medida que ingresan. P3 se incrementa para cada byte.

Si un paquete solo se recibe parcialmente y se produce un tiempo de espera, puede restablecer P3 nuevamente a P2.

    
respondido por el user4574

Lea otras preguntas en las etiquetas