Tabla de contenido:

WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq): 9 pasos (con imágenes)
WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq): 9 pasos (con imágenes)

Video: WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq): 9 pasos (con imágenes)

Video: WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq): 9 pasos (con imágenes)
Video: Unboxing TySOM-3A-ZU19EG Embedded Development Board 2024, Junio
Anonim
WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq)
WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq)
WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq)
WIDI - HDMI inalámbrico con Zybo (placa de desarrollo Zynq)

¿Alguna vez ha deseado poder conectar su televisor a una PC o computadora portátil como monitor externo, pero no quería tener todos esos molestos cables en el camino? Si es así, ¡este tutorial es solo para ti! Si bien hay algunos productos que logran este objetivo, un proyecto de bricolaje es mucho más satisfactorio y potencialmente más económico.

Este concepto es diferente de productos como Chromecast, ya que está destinado a reemplazar un cable HDMI que se conecta a un monitor en lugar de ser un dispositivo de transmisión.

Nuestro proyecto fue creado como un proyecto final para un curso de Sistemas Operativos en Tiempo Real en la Universidad Politécnica del Estado de California, San Luis Obispo.

El objetivo del proyecto es utilizar dos placas Digilent Zybo para que actúen como interfaz de comunicación inalámbrica entre un dispositivo transmisor HDMI (PC, blu-ray, etc.) y un dispositivo receptor HDMI (monitor de escritorio, proyector, TV, etc.).

Un Digilent Zybo se conectará a través de HDMI al dispositivo de transmisión y el otro se conectará a través de HDMI al dispositivo de recepción.

La comunicación inalámbrica se realizará mediante el uso de una red de área local inalámbrica dedicada al transmisor y al receptor, sin enrutarse a través de un enrutador doméstico u otro dispositivo similar. El módulo inalámbrico utilizado para este proyecto es el nanorouter tplink wr802n, uno de los cuales funciona como punto de acceso para establecer la red y el otro como cliente para conectarse a la red. Cada nanorouter se conectará mediante un cable ethernet a cualquiera de las placas Zybo. Cuando se conectan a estos enrutadores, los dispositivos se comunicarán a través de TCP como si estuvieran conectados con un solo cable Ethernet (lo que significa que la única configuración necesaria para establecer una conexión es la dirección IP del cliente).

Si bien el objetivo del proyecto era facilitar una transmisión de video de 1080x720 a 60Hz, esto no se pudo lograr debido a las limitaciones de ancho de banda en la red inalámbrica y la falta de compresión de video en tiempo real para reducir los datos necesarios para enviar. En cambio, este proyecto sirve como marco para el desarrollo futuro para lograr este objetivo, ya que tiene limitaciones severamente restringidas en la velocidad de fotogramas para transmitir correctamente los datos HDMI según lo previsto.

Requerimientos del proyecto:

2x placas de desarrollo Digilent Zybo (deben tener al menos un puerto HDMI)

2x cables HDMI

2x cables microusb (para conectar Zybo a PC para desarrollo)

2x tplink wr802n nanorouters (incluidos adtl. 2x microusb y adaptadores de corriente de toma de corriente)

2x cables ethernet

*** Nota: Este tutorial asume familiaridad con la suite de diseño Vivado y experiencia en la creación de un nuevo proyecto y diseño de bloques. ***

Paso 1: configurar la lógica programable de Zynq para el transmisor

Configurar la lógica programable de Zynq para el transmisor
Configurar la lógica programable de Zynq para el transmisor
Configurar la lógica programable de Zynq para el transmisor
Configurar la lógica programable de Zynq para el transmisor
Configurar la lógica programable de Zynq para el transmisor
Configurar la lógica programable de Zynq para el transmisor

Nuestro enfoque para desarrollar la lógica programable del transmisor fue realizar un paso de hdmi a hdmi desde la PC al monitor utilizando dos bloques de acceso directo a memoria de video (VDMA), uno para escritura y otro para lectura.

Ambos se seleccionan para el modo de búfer de 3 cuadros de ejecución libre (0-1-2). Dado que el núcleo de video está optimizado para 60 cuadros por segundo, esto significa que el VDMA escribirá o leerá en un nuevo cuadro cada 16.67 ms en este orden: 0, 1, 2, 0, 1, 2, 0, 1, 2. Las ubicaciones de la memoria DDR para cada cuadro son diferentes para los dos VDMA porque ya no están sincronizados entre sí. En su lugar, se utiliza un temporizador de hardware (TTC1), configurado para 60 Hz, para sincronizar el movimiento de datos entre las dos ubicaciones de memoria.

La imagen de arriba muestra 3 fotogramas, sus dimensiones y la cantidad de memoria que cada uno requiere (a la derecha del fotograma). Si asignamos el VDMA de escritura a estas ubicaciones de memoria, entonces podemos asignar las ubicaciones de memoria de VDMA leídas más allá de este conjunto, digamos, comenzando con 0x0B000000. Cada cuadro está compuesto por 1280 * 720 píxeles y cada píxel está compuesto por 8 bits de rojo, verde y azul para un total de 24 bits. Esto significa que una trama se compone de 1280 * 720 * 3 bytes (2,76 MB).

Dentro del temporizador, la IRQ, que se describe en la configuración del controlador VDMA, manejará la copia de datos entre las dos ubicaciones de memoria VMDA. El VDMA proporciona un puntero al marco actual que se está escribiendo o leyendo. El marco está representado por un código gris particular, que se convierte en software. Las definiciones del código gris para una configuración de búfer de 3 tramas se pueden encontrar en la Guía del producto AXI VDMA en el apéndice C.

Esto nos permite copiar el contenido que se está escribiendo en la memoria sin leer desde un marco en el que se está escribiendo actualmente.

*** Tenga en cuenta que el VDMA leído no se utiliza al enviar datos a través de la red inalámbrica. Su único propósito es verificar el funcionamiento correcto de la copia de memoria desde el VMDA de escritura. La lectura de VMDA debe estar deshabilitada. ***

Estos son los pasos para crear el bloque de diseño del transmisor:

  1. Al crear un nuevo proyecto, es una buena idea asignar un chip o placa al proyecto. Este enlace describe cómo agregar nuevos archivos de tablero al directorio Vivado y asociar el tablero correcto con su proyecto. Será útil al agregar el bloque del sistema de procesamiento y realizar la transición de hardware a software (lado del SDK).
  2. Agregue los siguientes bloques:

    • dvi2rgb
    • Entrada de vídeo en Axi4-stream
    • Controlador de tiempo
    • axi4-stream para salida de video
    • rgb2dvi
    • AXI VDMA x2
    • AXI GPIO x2
    • Asistente de reloj
    • Constante
    • Sistema de procesamiento Zynq
  3. Al agregar el sistema de procesamiento, haga clic en "Ejecutar automatización de bloques" en la barra superior de color verde y asegúrese de que la opción "Aplicar ajuste preestablecido de tablero" esté seleccionada. Deje todo lo demás por defecto.
  4. Las imágenes de la ventana de configuración de cada bloque se pueden encontrar en las imágenes de arriba. Si no ve una imagen para una ventana en particular, déjela como predeterminada.
  5. Comience a configurar el sistema de procesamiento Zynq:

    • En PS-PL Configuration AXI Non Secure Enable GP Master AXI, enable M AXI GP0 Interface
    • En la interfaz AXI esclava HP de configuración PS-PL, habilite HP0 y HP1
    • En la configuración de MIO, asegúrese de que ENET0 esté habilitado en Periféricos de E / S, luego en Unidad de procesador de aplicaciones, habilite Timer0
    • En Clock Configuration PL Fabric Clocks, habilite FCLK_CLK0 y configúrelo en 100 MHz.
    • Haga clic en Aceptar
  6. Antes de hacer clic en "Ejecutar automatización de conexión", asegúrese de conectar los bloques de video como se ve en la imagen de diseño del bloque TX arriba. Deberá cambiar el nombre de la constante a VDD y establecer el valor en 1. Conecte los bloques de video en consecuencia.
  7. Haga que el reloj HDMI TMDS y los pines de datos sean externos en los bloques rgb2dvi y dvi2rgb
  8. Cree un puerto de entrada y salida para la señal de detección de conexión en caliente (HPD) y conéctelos juntos, estos se definen en el archivo de restricciones
  9. El reloj de píxeles se recupera del TMDS_Clk_p, que se crea en el archivo de restricciones. Será 74,25 MHz de acuerdo con una resolución de 720p. Es importante conectar el reloj de píxeles (del bloque dvi2rgb) a los siguientes pines:

    • vid_io_in_clk (vid en el bloque de flujo axi)
    • vid_io_out_clk (flujo de axi al bloque de salida de vid)
    • clk (controlador de tiempo)
    • PixelClk (rgb2dvi)
  10. *** Nota: Actualmente, para activar la recuperación del reloj de píxeles, los conectores HDMI rx y tx deben estar conectados a una fuente / receptor activo. Una forma de evitar esto es separar los bloques de video rx y tx en diferentes dominios de reloj (en otras palabras, generar un nuevo reloj de 74.25 MHz para alimentar al bloque tx). ***
  11. A continuación, configure el asistente de reloj para que tenga una entrada de 100 MHz (fuente de búfer global) y 3 relojes de salida a 50 MHz (reloj AXI-Lite), 150 MHz (reloj AXI4-Stream), 200 MHz (pin dvi2rgb RefClk).
  12. Conecte el pin del sistema de procesamiento FCLK_CLK0 a la entrada del asistente de reloj
  13. En este punto, haga clic en "Ejecutar automatización de conexión" en la barra verde en la parte superior de la ventana de diseño. Es una buena idea hacer esto para un bloque a la vez y seguir la imagen de diseño del bloque TX de arriba.
  14. La herramienta intentará agregar la interconexión AXI, que actúa como interconexión maestro / esclavo para los bloques que usan el bus AXI-Lite (VDMA y GPIO).
  15. También agregará AXI SmartConnect, que actúa como la interconexión maestro / esclavo para las interfaces de procesador AXI4-Stream y High Performance utilizadas por el VDMA (Stream to Memory Map y viceversa).
  16. La herramienta también agregará un reinicio del sistema del procesador. Asegúrese de que esto solo esté conectado a los VDMA, GPIO y bloques relacionados con el procesador. No lo conecte a ningún bloque de video (es decir, dvi2rgb, controlador de tiempo, vid para transmitir, etc.)
  17. Una vez que se haya completado la automatización de la conexión, verifique que las conexiones coincidan con las de la imagen de diseño del bloque TX. Notará un bloqueo adicional de System ILA que no se ha mencionado. Esto es solo para depurar y no es necesario por ahora. Utiliza el reinicio del procesador 150M, por lo que tampoco es necesario. En cualquier lugar donde vea pequeños "bichos" verdes en los autobuses, es debido a la ILA y puede ser ignorado.
  18. El paso final es hacer clic derecho en el diseño del bloque en el árbol de fuentes del proyecto y seleccionar "Crear envoltorio HDL". Si planea agregar lógica al contenedor, se sobrescribirá cada vez que se seleccione.
  19. Consulte la sección Configuración del controlador VDMA para obtener detalles sobre el lado del SDK.

Relojes y reinicios

Descubrí que los aspectos más importantes de cualquier proyecto de lógica programable es la consideración cuidadosa de los dominios del reloj y las señales de reinicio. Si están configurados correctamente, tiene una buena oportunidad de hacer que su diseño funcione.

Reloj de píxeles y sincronización bloqueados

Para verificar que ciertas señales están activas, es una buena idea vincular estas señales a los LED (relojes, reinicios, bloqueos, etc.). Dos señales que encontré útiles para rastrear en la placa del transmisor fueron el reloj de píxeles y la señal "bloqueada" en el bloque AXI4-Stream to video out, que le dice que la sincronización del video se ha sincronizado con el controlador de tiempo y la fuente de video datos. Agregué algo de lógica al contenedor de bloques de diseño que rastrea el reloj de píxeles usando la señal PixelClkLocked en el bloque dvi2rgb como reinicio. Adjunté el archivo como hdmi_wrapper.v aquí. El archivo de restricciones también se adjunta aquí.

Paso 2: configurar la lógica programable de Zynq para el receptor

Configurar la lógica programable de Zynq para el receptor
Configurar la lógica programable de Zynq para el receptor
Configurar la lógica programable de Zynq para el receptor
Configurar la lógica programable de Zynq para el receptor
Configurar la lógica programable de Zynq para el receptor
Configurar la lógica programable de Zynq para el receptor

El bloque de lógica programable para el receptor es más simple. La diferencia clave, además de los bloques de entrada HDMI que faltan, es la ausencia de un reloj de píxeles recuperado. Por esa razón tenemos que generar el nuestro a partir del asistente de reloj. Este diseño debe realizarse en un proyecto separado del transmisor. Para nuestros propósitos, el proyecto del receptor siguió a la placa Zybo 7Z-20 mientras que el transmisor siguió a la placa Z7-10. Los FPGA de las placas son diferentes, así que … tenga cuidado.

Estos son los pasos para crear el bloque de diseño del receptor:

  1. Agregue los siguientes bloques de ip a su diseño:

    • Controlador de tiempo
    • Salida AXI4-Stream to Video
    • RGB a DVI
    • AXI VDMA
    • AXI GPIO
    • Sistema de procesamiento
    • Asistente de reloj
    • Constante (VDD establecido en 1)
  2. Siga el mismo patrón para configurar estos bloques que el transmisor. Aquí se han incluido imágenes de las notables diferencias en la configuración. Los demás siguen siendo los mismos que el transmisor.
  3. Configure el VDMA para este diseño como solo canal de lectura. Desactive el canal de escritura.
  4. El asistente de reloj debe configurarse para las siguientes salidas:

    • clk_out1: 75 MHz (reloj de píxeles)
    • clk_out2: 150 MHz (reloj de transmisión)
    • clk_out3: 50 MHz (reloj axi-lite)
  5. Conecte los bloques de video como se muestra en la imagen de diseño del bloque RX.
  6. Luego, ejecute la automatización de la conexión, que agregará los bloques AXI Interconnect, AXI SmartConnect y System Reset e intentará realizar las conexiones adecuadas. Vaya despacio aquí para asegurarse de que no realice conexiones no deseadas.
  7. Haga que el reloj HDMI TMDS y los pines de datos sean externos en el bloque rgb2dvi
  8. No se necesita señal de conexión en caliente en este diseño.

Paso 3: Configurar el controlador VDMA

Configuración del controlador VDMA
Configuración del controlador VDMA

La configuración de los diferentes bloques que se configuran a través de la interfaz AXI-Lite se realiza mejor utilizando proyectos de demostración incluidos con el BSP como referencia. Después de exportar el hardware de diseño y ejecutar el SDK de Vivado, querrá agregar un nuevo paquete de soporte de placa e incluir la biblioteca lwip202 en la ventana de configuración de BSP. Abra el archivo system.mss del BSP y verá los controladores periféricos presentes en el diseño de su bloque. La opción "Importar ejemplos" le permite importar proyectos de demostración que utilizan estos periféricos y así mostrarle cómo configurarlos en software usando los controladores Xilinx disponibles (vea la imagen adjunta).

Este fue el método utilizado para configurar VDMA, Timer & Interrupt y GPIO. El código fuente tanto para transmitir como para recibir se ha incluido aquí. Las diferencias están casi exclusivamente en main.c.

*** NOTA: Dado que el sistema no es completamente funcional al momento de escribir este tutorial, el código fuente en esta sección no incluye el código de red inalámbrica. Es necesario solucionar varios errores como resultado de la combinación de los proyectos de transmisión / recepción del núcleo de video con los proyectos de transmisión / recepción de la red. Por lo tanto, este tutorial los trata por separado por el momento. ***

Función de controlador de interrupción de TX (IRQHandler)

Esta función lee los códigos grises proporcionados por los VDMA de lectura y escritura a través de los bloques GPIO. Los códigos grises se convierten a decimales y se utilizan para seleccionar la ubicación de la memoria base del marco del marco actual. El fotograma copiado es el fotograma anterior al que está escribiendo el VDMA (por ejemplo, si el VDMA está escribiendo en el fotograma 2, copiamos el fotograma 1; si escribimos en el fotograma 0, envolvemos y leemos desde el fotograma 2).

La función solo captura cada sexto fotograma para reducir la frecuencia de fotogramas a 10 Hz en lugar de 60 Hz. El límite superior de la red es 300 Mbps. A 10 fotogramas por segundo, se requiere un ancho de banda de 221,2 Mbps.

Al comentar / descomentar dos líneas en esta función, el usuario podrá cambiar al modo de paso a través de HDMI con fines de depuración / prueba (el código se comenta para indicar las líneas apropiadas). Actualmente copia el marco en una ubicación de memoria utilizada por el código Ethernet.

Función de controlador de interrupciones RX (IRQHandler)

Esta función es muy similar a la función TX, pero copia desde un FIFO de 2 búfer utilizado por ethernet para escribir datos entrantes. El código de Ethernet indica en qué trama se está escribiendo de la FIFO, los datos se copian desde la trama opuesta. Los datos se copian en el marco directamente detrás del que está leyendo el VDMA para evitar que se rompan.

Paso 4: Configurar la red de nanorouter

Configurar la red de Nanorouter
Configurar la red de Nanorouter

Para crear una red utilizando los nanorouters TPlink, enciéndalos individualmente y conéctese al SSID wifi predeterminado para los dispositivos. Puede encontrar más información sobre los ajustes de configuración para este dispositivo en particular a través del manual de usuario del dispositivo.

Configure uno de los dispositivos como punto de acceso, esto actuará como la conexión principal para la red. Asegúrese de nombrar la red y anote el nombre, y deshabilite DHCP (no queremos que el enrutador configure las direcciones IP dinámicamente, queremos que las placas Zybo transmisor y receptor establezcan sus direcciones IP para que sean consistentes). Después de la configuración, asegúrese de que el dispositivo se reinicie y establezca esta red.

Configure el otro dispositivo como cliente y asegúrese de que se conecte al SSID de red que configuró con el primer nanorouter. Una vez más, asegúrese de que DHCP esté desactivado para el cliente.

Una vez que el cliente haya terminado y reiniciado, debería conectarse al nanorouter del punto de acceso (si no lo hace, es probable que haya un problema en la configuración de uno de los dispositivos). Notará que la luz LED en el cliente será sólida una vez que se haya conectado al punto de acceso.

Es probable que el LED del nanorouter del punto de acceso continúe parpadeando en este punto, ¡está bien! La luz intermitente significa que no está conectado a otro dispositivo desde su puerto ethernet, y una vez que está conectado a un Zybo configurado, el LED permanecerá fijo indicando una conexión de red exitosa.

Ahora que tenemos nuestros nanorouters configurados, tenemos una red inalámbrica que nos permitirá comunicarnos. Una nota importante es que nuestro método de configuración para los nanorouters (como punto de acceso y cliente) nos permite comunicarnos desde la placa Zybo transmisora a la placa Zybo receptora como si las dos estuvieran conectadas con un solo cable Ethernet. Esto hace que la configuración de nuestra red sea menos difícil, ya que la alternativa probablemente incorporaría la configuración de las placas Zybo para conectarse al servidor explícitamente junto con la conexión prevista.

Una vez que ambos dispositivos están configurados, los nanorouters están configurados y listos para implementarse en su red WIDI. No existe un emparejamiento específico entre los nanorouters y las placas Zybo, ya que el punto de acceso o el cliente funcionarán para el dispositivo de transmisión o recepción.

Paso 5: Configure el sistema de procesamiento Zynq para la transmisión de datos a través de Ethernet

Configurar el sistema de procesamiento Zynq para la transmisión de datos a través de Ethernet
Configurar el sistema de procesamiento Zynq para la transmisión de datos a través de Ethernet
Configurar el sistema de procesamiento Zynq para la transmisión de datos a través de Ethernet
Configurar el sistema de procesamiento Zynq para la transmisión de datos a través de Ethernet

Para transmitir los datos HDMI de una placa Zybo a la otra, debemos incorporar un protocolo Ethernet con nuestro controlador VDMA. Nuestro objetivo aquí es transmitir cuadros de video individuales a través del periférico Ethernet en el sistema de procesamiento, a una velocidad establecida que sea consistente con el ancho de banda de nuestra red. Para nuestro proyecto, utilizamos TCP proporcionado por la API LwIP completa. Dado que ambos miembros del proyecto carecen relativamente de experiencia en las utilidades de redes, esta elección se tomó sin reconocer plenamente las implicaciones y limitaciones del TCP. El principal problema con esta implementación fue el ancho de banda limitado y el hecho de que en realidad no está diseñado con el propósito de transmitir grandes volúmenes de datos. Soluciones alternativas para reemplazar TCP y mejorar tbe en este proyecto se discutirán más adelante.

Una breve descripción de TCP con LwIP: Los datos se envían a través de la red en paquetes de tamaño tcp_mss (tamaño de segmento máximo de TCP), que generalmente es de 1460 bytes. Llamar a tcp_write tomará algunos datos referenciados por un puntero y configurará pbufs (búferes de paquetes) para contener los datos y proporcionar una estructura para las operaciones de TCP. La cantidad máxima de datos que se pueden poner en cola a la vez se establece como tcp_snd_buf (espacio de búfer del remitente de TCP). Dado que este parámetro es un número de 16 bits, estamos limitados a un tamaño de búfer de envío de 59695 bytes (hay algo de relleno requerido en el búfer de envío). Una vez que los datos se han puesto en cola, se llama a tcp_output para comenzar a transmitir los datos. Antes de enviar el siguiente segmento de datos, es imperativo que todos los paquetes anteriores se hayan transmitido con éxito. Este proceso se realiza mediante la función recv_callback, ya que esta es la función a la que se llama cuando se ve el acuse de recibo desde el receptor.

Utilizar los proyectos de ejemplo en Vivado SDK es muy útil para aprender cómo funciona el LwIP TCP y es un buen punto de partida para comenzar un nuevo proyecto.

El procedimiento para el dispositivo de transmisión WiDi es el siguiente:

  1. Inicialice la red TCP utilizando las llamadas de función del controlador LWIP bare-metal.
  2. Especifique las funciones de devolución de llamada necesarias para las operaciones de red.
  3. Conéctese al receptor WiDi conectándose a su dirección IP y puerto (nuestra configuración: la IP del receptor es 192.168.0.9, conéctese al puerto 7).
  4. Cuando expire el temporizador del controlador VDMA, ingrese TX ISR.
  5. Determine el búfer de tramas actual para acceder en función del código gris VDMA
  6. Ponga en cola el primer segmento de datos en el búfer de envío de TCP
  7. Genere los datos y actualice las variables locales para realizar un seguimiento de la cantidad de datos que se han enviado del marco actual.
  8. Al llegar a la devolución de llamada recibida (llamada de función realizada después de que el transmisor recibe un acuse de recibo de la recuperación de datos), ponga en cola el siguiente segmento de datos.
  9. Repita los pasos 7 y 8 hasta que se haya enviado todo el marco.
  10. Regrese a un estado inactivo para esperar la próxima interrupción del temporizador para indicar que un nuevo marco está listo (Volver al paso 4).

Asegúrese de configurar los ajustes LwIP del paquete de soporte de la placa como se muestra en la imagen de arriba. Todos los valores son predeterminados excepto tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg. También tenga en cuenta que se puede lograr una depuración detallada cambiando los parámetros BSP para el grupo debug_options.

Paso 6: Configure el sistema de procesamiento Zynq para la recepción de datos a través de Ethernet

La placa de desarrollo Zybo que actuará como receptor inalámbrico funcionará de manera similar al dispositivo de transmisión. La configuración del paquete de soporte de la placa para LwIP será idéntica a la del paso anterior.

El dispositivo aceptará paquetes que contengan los segmentos de fotogramas de vídeo del nanorouter y copiará los datos del fotograma de vídeo en el espacio de búfer de fotogramas triple para el VDMA receptor. Para evitar sobrescribir cualquier dato, se utiliza un búfer de datos doble (al que nos referiremos como búfer de red) cuando se recopilan datos del nanorouter, de modo que el tráfico de la red pueda continuar transmitiendo mientras se copia el cuadro de video completo anterior en el Búfer VDMA.

El procedimiento para el dispositivo receptor WiDi requiere dos tareas, una de las cuales es recibir datos de Ethernet y la otra es copiar cuadros de video desde el búfer de red al búfer de triple cuadro del VDMA.

Tarea de recepción de Ethernet:

  1. Inicialice la red TCP utilizando las llamadas de función del controlador LWIP bare-metal (configuración con la dirección IP a la que se conectará el transmisor, 192.168.0.9 en la nuestra)
  2. Especifique las funciones de devolución de llamada necesarias para las operaciones de red.
  3. Al recibir el paquete ethernet, copie los datos del paquete en el búfer de red actual, aumente los datos acumulados actuales.
  4. Si el paquete llena el búfer de tramas de la red, continúe con los pasos 5 y 6. De lo contrario, vuelva al paso 3 para esta tarea.
  5. señal de que la tarea de búfer de trama triple VDMA debe copiarse del búfer de red recién terminado.
  6. Cambie al otro búfer de red y continúe recopilando datos a través de Ethernet.
  7. Inactivo hasta que se reciba un nuevo paquete de Ethernet (paso 3).

Copie el búfer de red en el búfer de triple trama VDMA:

  1. Cuando expire el temporizador del controlador VDMA, ingrese el RX ISR.
  2. Determine el búfer de tramas actual al que acceder en función del código gris VDMA.
  3. Determine qué búfer de red se copiará al búfer VDMA y copie esos datos

Paso 7: conecte sus placas Zybo a la fuente HDMI y al disipador HDMI

Conecte sus placas Zybo a la fuente HDMI y al disipador HDMI
Conecte sus placas Zybo a la fuente HDMI y al disipador HDMI

Ahora conecte los cables hdmi tanto para el receptor como para el transmisor, programe los FPGA y ejecute el sistema de procesamiento. Es probable que la velocidad de fotogramas sea muy lenta, debido a la inmensa sobrecarga en la operación LwIP y al ancho de banda limitado. Si hay algún problema, conéctese a través de UART e intente identificar cualquier advertencia o error.

Paso 8: Ideas alternativas para mejorar

Ideas alternativas para mejorar
Ideas alternativas para mejorar

Un gran problema para este proyecto fue la cantidad de datos necesarios para enviar por wifi. Esto era de esperar, sin embargo, subestimamos el impacto que esto tendría y resultó en más una ráfaga de imágenes en una pantalla que en una transmisión de video. Hay varias formas de mejorar este proyecto:

  • Compresión de video en tiempo real. La compresión de la transmisión de video entrante cuadro por cuadro reduciría en gran medida la cantidad de datos necesarios para enviar a través de la red. Idealmente, esto se haría en hardware (que no es una tarea fácil), o podría hacerse en software utilizando el otro núcleo ARM para ejecutar un algoritmo de compresión (esto necesitaría un análisis más detallado para asegurar que el tiempo funcione). Hay algunos componentes de compresión de video en tiempo real de código abierto que encontramos en la web, pero la mayoría son IP.
  • Implementar el flujo de Ethernet en hardware, en lugar de software. Hubo una gran cantidad de gastos generales debido a la falta de espacio disponible para poner en cola los datos salientes en el transmisor, debido a la limitación en el tamaño del segmento. Un proceso mucho más eficiente es utilizar la IP Ethernet AXI con un búfer FIFO o DMA para alimentar datos. Esto reduciría el equipaje adicional de LwIP TCP y permitiría un mayor flujo de datos.

Paso 9: Accesibilidad

El producto resultante de este proyecto WiDi debería ser un par de dispositivos compactos y totalmente integrados que un usuario podría conectar a cualquier fuente HDMI y luego enviar la señal de video a una pantalla con capacidad HDMI de forma inalámbrica. Los dispositivos incluirían el SoC Zynq-7000 que se encuentra en la placa de referencia Zybo e incorporarían el hardware de red que se encuentra en los nano-routers TP-Link. Idealmente, el usuario podría controlar el módulo de transmisión desde una ubicación discreta dentro del sistema operativo de destino, con poca necesidad de una habilidad técnica significativa.

Seguridad y conectividad

Los dispositivos también deben incorporar Transport Layer Security (TLS) y tener una capacidad limitada de conexión automática, ambos por motivos de privacidad. Los diseñadores tienen la intención de hacer de la conexión con una pantalla a través de una interfaz inalámbrica una acción deliberada en nombre del usuario para evitar la transmisión por error de material sensible.

Estado actual

Hasta este punto, el estado del proyecto es todavía un trabajo en progreso. Para que el usuario de punto final actual se beneficie de este tutorial, debe tener una sólida comprensión técnica del diseño de sistemas integrados y debe estar familiarizado con el hardware programable y el software integrado que trabajan juntos.

Los datos que se envían a través de la red no están encriptados en este punto y se supone que son una transmisión sin procesar de paquetes TCP / IP.

El proyecto principal de video se probó con éxito tanto para transmisión como para recepción. Por otro lado, se estableció la conexión inalámbrica entre dos placas zybo y los datos del marco de prueba se enviaron con éxito. Sin embargo, sigue siendo necesario combinar el código de red con cada proyecto central de vídeo y probar la transmisión de fotogramas de vídeo reales.

Recomendado: