Índice:

WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq): 9 etapas (com imagens)
WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq): 9 etapas (com imagens)

Vídeo: WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq): 9 etapas (com imagens)

Vídeo: WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq): 9 etapas (com imagens)
Vídeo: ESSAS BOLAS CRIAM UM "CABO HDMI" INVISÍVEL DE 30 METROS PARA 4K E 120Hz 2024, Julho
Anonim
WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq)
WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq)
WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq)
WIDI - HDMI sem fio usando Zybo (placa de desenvolvimento Zynq)

Você já desejou poder conectar sua TV a um PC ou laptop como monitor externo, mas não queria ter todos aqueles cabos chatos no caminho? Em caso afirmativo, este tutorial é apenas para você! Embora existam alguns produtos que alcançam esse objetivo, um projeto DIY é muito mais satisfatório e potencialmente mais barato.

Este conceito é diferente de produtos como o chromecast, pois se destina a substituir um cabo HDMI conectado a um monitor em vez de ser um dispositivo de streaming.

Nosso projeto foi criado como um projeto final para um curso de Sistemas Operacionais em Tempo Real na California State Polytechnic University, San Luis Obispo.

O objetivo do projeto é utilizar duas placas Digilent Zybo para atuar como interface de comunicação sem fio entre um dispositivo transmissor HDMI (PC, blu-ray, etc) para um dispositivo receptor HDMI (monitor de mesa, projetor, TV, etc).

Um Digilent Zybo será conectado via HDMI ao dispositivo de transmissão e o outro será conectado via HDMI ao dispositivo receptor.

A comunicação sem fio será feita por meio de uma rede local sem fio dedicada ao transmissor e ao receptor, sem ser roteada por um roteador doméstico ou outro dispositivo semelhante. O módulo wireless utilizado para este projeto é o nanorouter tplink wr802n, um dos quais opera como ponto de acesso para estabelecer a rede e o outro para operar como cliente para conexão à rede. Cada nanorouter será conectado via cabo Ethernet a qualquer uma das placas Zybo. Quando conectados a esses roteadores, os dispositivos se comunicarão via TCP como se estivessem conectados a um único cabo Ethernet (o que significa que a única configuração necessária para estabelecer uma conexão é o endereço IP do cliente).

Embora o objetivo do projeto fosse facilitar um fluxo de vídeo 1080x720 a 60 Hz, isso não foi possível devido às limitações de largura de banda na rede sem fio e à falta de compressão de vídeo em tempo real para reduzir os dados necessários para o envio. Em vez disso, este projeto serve como estrutura para desenvolvimento futuro para atingir esse objetivo, pois restringiu severamente as limitações na taxa de quadros para transmitir dados HDMI de maneira adequada, conforme pretendido.

Requisitos do projeto:

2 placas de desenvolvimento Digilent Zybo (deve ter pelo menos uma porta HDMI)

2 cabos HDMI

2 cabos microusb (para conectar Zybo ao PC para desenvolvimento)

2 nanorrouters tplink wr802n (incluindo adtl. 2x microusb e adaptadores de energia de tomada de parede)

2 cabos Ethernet

*** Nota: Este tutorial pressupõe familiaridade com o conjunto de design Vivado e experiência na criação de um novo projeto e design de bloco. ***

Etapa 1: Configurar a lógica programável Zynq para o transmissor

Configure a lógica programável Zynq para o transmissor
Configure a lógica programável Zynq para o transmissor
Configure a lógica programável Zynq para o transmissor
Configure a lógica programável Zynq para o transmissor
Configure a lógica programável Zynq para o transmissor
Configure a lógica programável Zynq para o transmissor

Nossa abordagem para desenvolver a lógica programável do transmissor foi realizar uma passagem HDMI para HDMI do PC para o monitor usando dois blocos de Acesso Direto à Memória de Vídeo (VDMA), um para gravação e outro para leitura.

Ambos são selecionados para execução livre, modo de buffer de 3 quadros (0-1-2). Como o núcleo de vídeo é otimizado para 60 quadros por segundo, isso significa que o VDMA gravará ou lerá em um novo quadro a cada 16,67 ms nesta ordem: 0, 1, 2, 0, 1, 2, 0, 1, 2. Os locais de memória DDR para cada quadro são diferentes para os dois VDMAs porque eles não estão mais sincronizados um com o outro. Em vez disso, um temporizador de hardware (TTC1), configurado para 60 Hz, é usado para sincronizar o movimento de dados entre os dois locais de memória.

A imagem acima mostra 3 quadros, suas dimensões e a quantidade de memória que cada um requer (à direita do quadro). Se atribuirmos o VDMA de gravação a esses locais de memória, podemos atribuir os locais de memória VDMA de leitura além desse conjunto, digamos, começando com 0x0B000000. Cada quadro é composto de 1280 * 720 pixels e cada pixel é composto de 8 bits de vermelho, verde e azul para um total de 24 bits. Isso significa que um quadro é composto de 1280 * 720 * 3 bytes (2,76 MB).

Dentro do temporizador, o IRQ, que é descrito na configuração do driver VDMA, tratará da cópia de dados entre os dois locais de memória VMDA. O VDMA fornece um ponteiro para o quadro atual que está sendo gravado ou lido. O quadro é representado por um determinado código cinza, que é convertido em software. As definições de código cinza para uma configuração de buffer de 3 quadros podem ser encontradas no AXI VDMA Product Guide no apêndice C.

Isso nos permite copiar o conteúdo que está sendo gravado na memória sem ler de um quadro que está sendo gravado no momento.

*** Observe que o VDMA de leitura não é usado ao enviar dados pela rede sem fio. Seu único objetivo é verificar o funcionamento adequado da memória de cópia do VMDA de gravação. O VMDA de leitura deve ser desativado. ***

Aqui estão as etapas para criar o bloco de design do transmissor:

  1. Ao criar um novo projeto, é uma boa ideia atribuir um chip ou placa ao projeto. Este link descreve como adicionar novos arquivos de cartão ao diretório Vivado e associar o cartão correto ao seu projeto. Será útil ao adicionar o bloco do Sistema de processamento e fazer a transição do hardware para o software (lado do SDK).
  2. Adicione os seguintes blocos:

    • dvi2rgb
    • Video in para Axi4-stream
    • Controlador de tempo
    • axi4-stream para vídeo
    • rgb2dvi
    • AXI VDMA x2
    • AXI GPIO x2
    • Assistente de relógio
    • Constante
    • Sistema de processamento Zynq
  3. Ao adicionar o sistema de processamento, clique em "Executar automação de bloco" na barra superior de cor verde e certifique-se de que a opção "Aplicar predefinição de placa" esteja selecionada. Deixe todo o resto padrão.
  4. As imagens da janela de configuração de cada bloco podem ser encontradas nas imagens acima. Se você não vir uma imagem para uma janela específica, deixe-a como padrão.
  5. Comece configurando o sistema de processamento Zynq:

    • Na configuração PS-PL AXI não seguro Habilitar GP Master AXI, habilitar interface M AXI GP0
    • Na configuração PS-PL, interface HP Slave AXI, habilite HP0 e HP1
    • Na configuração MIO, certifique-se de que ENET0 está habilitado em I / O Peripherals, então Application Processor Unit, habilite Timer0
    • Em Clock Configuration PL Fabric Clocks, habilite FCLK_CLK0 e defina para 100 MHz.
    • Clique OK
  6. Antes de clicar em "Executar automação de conexão", certifique-se de conectar os blocos de vídeo conforme visto na imagem do design do bloco TX acima. Você vai querer renomear a constante para VDD e definir o valor como 1. Conecte os blocos de vídeo de acordo.
  7. Torne o relógio HDMI TMDS e os pinos de dados externos nos blocos rgb2dvi e dvi2rgb
  8. Crie uma porta de entrada e saída para o sinal de detecção de hot plug (HPD) e conecte-as. Essas são definidas no arquivo de restrições
  9. O clock de pixel é recuperado do TMDS_Clk_p, que é criado no arquivo de restrições. Será de 74,25 MHz de acordo com a resolução de 720p. É importante conectar o clock de pixel (do bloco dvi2rgb) aos seguintes pinos:

    • vid_io_in_clk (vid em bloco de fluxo axi)
    • vid_io_out_clk (fluxo axi para bloco vid out)
    • clk (controlador de tempo)
    • PixelClk (rgb2dvi)
  10. *** Nota: Atualmente, para ativar a recuperação do clock de pixel, os conectores HDMI rx e tx devem ser plugados em uma fonte / coletor ativo. Uma maneira de contornar isso é separar os blocos rx e tx de vídeo em domínios de clock diferentes (em outras palavras, gerar um novo clock de 74,25 MHz para alimentar o bloco tx). ***
  11. Em seguida, configure o assistente de relógio para que você tenha uma entrada de 100 MHz (fonte de buffer global) e 3 relógios de saída a 50 MHz (relógio AXI-Lite), 150 MHz (relógio AXI4-Stream), 200 MHz (pino RefClk dvi2rgb).
  12. Conecte o pino do sistema de processamento FCLK_CLK0 à entrada do assistente de relógio
  13. Neste ponto, clique em "Executar automação de conexão" na barra verde na parte superior da janela de design. É uma boa ideia fazer isso para um bloco de cada vez e seguir a imagem do desenho do bloco TX acima.
  14. A ferramenta tentará adicionar a Interconexão AXI, que atua como a interconexão mestre / escravo para os blocos que usam o barramento AXI-Lite (VDMAs e GPIOs).
  15. Ele também adicionará AXI SmartConnect, que atua como a interconexão mestre / escravo para as interfaces de processador AXI4-Stream e High Performance usadas pelo VDMA (Stream to Memory Map e vice-versa).
  16. A ferramenta também adicionará uma reinicialização do sistema do processador. Certifique-se de que ele esteja conectado apenas aos VDMAs, GPIOs e blocos relacionados ao processador. Não o conecte a nenhum bloco de vídeo (ou seja, dvi2rgb, controlador de tempo, vídeo para transmitir etc.)
  17. Assim que a automação da conexão for concluída, verifique se as conexões correspondem às da imagem de design do bloco TX. Você notará um bloco extra do ILA do sistema que não foi mencionado. Isso é apenas para depuração e não é necessário por enquanto. Ele usa o processador 150M Reset, então isso também não é necessário. Onde quer que você veja pequenos "bugs" verdes em ônibus, é por causa do ILA e pode ser ignorado.
  18. A etapa final é clicar com o botão direito no design do bloco na árvore de fontes do projeto e selecionar "Criar Wrapper HDL". Se você planeja adicionar lógica ao wrapper, ela será sobrescrita toda vez que for selecionada.
  19. Consulte a seção Configuração do driver VDMA para obter detalhes sobre o SDK.

Relógios e reinicializações

Descobri que os aspectos mais importantes de qualquer projeto de lógica programável é a consideração cuidadosa dos domínios do relógio e dos sinais de reinicialização. Se eles estiverem configurados corretamente, você terá uma boa chance de fazer seu design funcionar.

Pixel Clock e Timing Locked

Para verificar se certos sinais estão ativos, é uma boa ideia vincular esses sinais aos LEDs (relógios, reinicializações, bloqueios, etc.). Dois sinais que achei úteis para rastrear na placa do transmissor foram o clock de pixel e o sinal "bloqueado" no bloco AXI4-Stream para saída de vídeo, que informa que o tempo de vídeo foi sincronizado com o controlador de tempo e a fonte de vídeo dados. Eu adicionei alguma lógica ao invólucro do bloco de design que rastreia o clock do pixel usando o sinal PixelClkLocked no bloco dvi2rgb como uma reinicialização. Anexei o arquivo como hdmi_wrapper.v aqui. O arquivo de restrições também está anexado aqui.

Etapa 2: Configurar a lógica programável Zynq para o receptor

Configurar a lógica programável Zynq para o receptor
Configurar a lógica programável Zynq para o receptor
Configurar a lógica programável Zynq para o receptor
Configurar a lógica programável Zynq para o receptor
Configurar a lógica programável Zynq para o receptor
Configurar a lógica programável Zynq para o receptor

O bloco lógico programável para o receptor é mais simples. A principal diferença, além dos blocos de entrada HDMI ausentes, é a ausência de um clock de pixel recuperado. Por esse motivo, temos que gerar o nosso próprio a partir do assistente do relógio. Este design deve ser feito em um projeto separado do transmissor. Para nossos propósitos, o projeto do receptor seguiu a placa Zybo 7Z-20 enquanto o Transmissor seguiu a placa Z7-10. Os FPGAs nas placas são diferentes, então … tome cuidado.

Aqui estão as etapas para criar o bloco de design do receptor:

  1. Adicione os seguintes blocos de IP ao seu projeto:

    • Controlador de tempo
    • AXI4-Stream para saída de vídeo
    • RGB para DVI
    • AXI VDMA
    • AXI GPIO
    • Sistema de Processamento
    • Assistente de relógio
    • Constante (VDD definido como 1)
  2. Siga o mesmo padrão para configurar esses blocos do Transmissor. Imagens para as diferenças notáveis na configuração foram incluídas aqui. Os outros permanecem iguais ao Transmissor.
  3. Configure o VDMA para este projeto apenas como canal de leitura. Desative o canal de gravação.
  4. O assistente de relógio deve ser configurado para as seguintes saídas:

    • clk_out1: 75 MHz (clock de pixel)
    • clk_out2: 150 MHz (clock de fluxo)
    • clk_out3: 50 MHz (relógio axi-lite)
  5. Conecte os blocos de vídeo conforme mostrado na imagem do design do bloco RX.
  6. Em seguida, execute a automação da conexão, que adicionará os blocos AXI Interconnect, AXI SmartConnect e System Reset e tentará fazer as conexões apropriadas. Vá devagar aqui para ter certeza de que ele não realiza conexões indesejadas.
  7. Torne o relógio HDMI TMDS e os pinos de dados externos no bloco rgb2dvi
  8. Não há necessidade de sinal hot plug neste projeto.

Etapa 3: Configurar o driver VDMA

Configurar driver VDMA
Configurar driver VDMA

A configuração dos diferentes blocos que são configurados por meio da interface AXI-Lite é melhor realizada usando projetos de demonstração incluídos com o BSP como referência. Depois de exportar o hardware de design e lançar o SDK da Vivado, você desejará adicionar um novo pacote de suporte de placa e incluir a biblioteca lwip202 na janela de configurações do BSP. Abra o arquivo system.mss do BSP e você verá os drivers periféricos presentes no design do seu bloco. A opção "Importar exemplos" permite importar projetos de demonstração que utilizam esses periféricos e, assim, mostrar como configurá-los no software usando os drivers Xilinx disponíveis (ver imagem em anexo).

Este foi o método usado para configurar o VDMA, Timer & Interrupt e GPIO. O código-fonte para transmissão e recepção foi incluído aqui. As diferenças são quase exclusivamente em main.c.

*** NOTA: Como o sistema não está totalmente funcional no momento em que este tutorial foi escrito, o código-fonte nesta seção não inclui o código da rede sem fio. Vários bugs precisam ser corrigidos como resultado da combinação dos projetos de transmissão / recepção do núcleo de vídeo com os projetos de transmissão / recepção da rede. Portanto, este tutorial os trata separadamente por enquanto. ***

Função de manipulador de interrupção TX (IRQHandler)

Esta função lê os códigos cinza fornecidos pelos VDMAs de leitura e gravação por meio dos blocos GPIO. Os códigos cinza são convertidos em decimais e usados para selecionar a localização da memória de base do quadro do quadro atual. O quadro copiado é o quadro anterior ao que está sendo gravado pelo VDMA (por exemplo, se o VDMA está gravando no quadro 2, copiamos o quadro 1; se estiver gravando no quadro 0, enrolamos e lemos do quadro 2).

A função captura apenas a cada 6 quadros para reduzir a taxa de quadros para 10 Hz em vez de 60 Hz. O limite superior da rede é 300 Mbps. A 10 quadros por segundo, é necessária uma largura de banda de 221,2 Mbps.

Comentar / descomentar duas linhas nesta função permitirá que o usuário mude para o modo HDMI intermediário para fins de depuração / teste (o código é comentado para indicar as linhas apropriadas). Atualmente, ele copia o quadro para um local de memória usado pelo código Ethernet.

Função de manipulador de interrupção RX (IRQHandler)

Esta função é muito semelhante à função TX, mas copia de um FIFO de 2 buffers usado pela ethernet para gravar os dados de entrada. O código ethernet indica em qual quadro do FIFO está sendo escrito, os dados são copiados do quadro oposto. Os dados são copiados para o quadro diretamente atrás daquele que está sendo lido pelo VDMA para evitar rasgo.

Etapa 4: Configurar Rede Nanorouter

Configurar Rede Nanorouter
Configurar Rede Nanorouter

Para criar uma rede usando os nanorrouters TPlink, ligue-os individualmente e conecte-se ao SSID wi-fi padrão para os dispositivos. Mais informações sobre as definições de configuração para este dispositivo específico podem ser encontradas no manual do usuário do dispositivo.

Configure um dos dispositivos como um ponto de acesso, ele atuará como a conexão principal para a rede. Certifique-se de nomear a rede e anote o nome, e desabilite o DHCP (não queremos que o roteador configure os endereços IP dinamicamente, queremos que as placas transmissor e receptor Zybo definam seus próprios endereços IP para que sejam consistentes). Após a configuração, certifique-se de que o dispositivo seja reinicializado e estabeleça esta rede.

Configure o outro dispositivo como um cliente e certifique-se de que ele se conecta ao SSID da rede que você configurou com o primeiro nanorrouter. Mais uma vez, certifique-se de que o DHCP esteja desabilitado para o cliente.

Assim que o cliente terminar e reiniciar, ele deve se conectar ao nanorouter do ponto de acesso (se não, provavelmente há um problema na configuração de um dos dispositivos). Você notará que a luz do LED no cliente ficará sólida depois de conectado ao ponto de acesso.

O LED do nanorouter do ponto de acesso provavelmente continuará piscando neste ponto, tudo bem! A luz piscando significa que ele não está conectado a outro dispositivo de sua porta Ethernet e, uma vez conectado a um Zybo configurado, o LED permanecerá sólido indicando uma conexão de rede bem-sucedida.

Agora que configuramos nossos nanorrouters, temos uma rede sem fio que nos permitirá a comunicação. Uma observação importante é que nosso método de configuração para os nanorrouters (como ponto de acesso e cliente) nos permite comunicar da placa Zybo transmissora para a placa Zybo receptora como se as duas estivessem conectadas com um único fio Ethernet. Isso torna a configuração de nossa rede menos difícil, já que a alternativa provavelmente incorporaria a configuração das placas Zybo para se conectar ao servidor explicitamente junto com a conexão pretendida.

Assim que ambos os dispositivos estiverem configurados, os nanorrouters estarão configurados e prontos para serem implementados em sua rede WIDI. Não há nenhum emparelhamento específico entre os nanorrouters e as placas Zybo, pois o ponto de acesso ou o cliente funcionará para o dispositivo de transmissão ou recepção.

Etapa 5: configurar o sistema de processamento Zynq para transmissão de dados via Ethernet

Configuração do sistema de processamento Zynq para transmissão de dados via Ethernet
Configuração do sistema de processamento Zynq para transmissão de dados via Ethernet
Configure o sistema de processamento Zynq para transmissão de dados via Ethernet
Configure o sistema de processamento Zynq para transmissão de dados via Ethernet

Para transmitir os dados HDMI de uma placa Zybo para outra, devemos incorporar um protocolo Ethernet em nosso driver VDMA. Nosso objetivo aqui é transmitir quadros de vídeo individuais por meio do periférico Ethernet no sistema de processamento, a uma taxa definida que seja consistente com a largura de banda de nossa rede. Para o nosso projeto, utilizamos o TCP fornecido pela API LwIP bare-metal. Uma vez que ambos os membros do projeto são relativamente inexperientes com utilitários de rede, essa escolha foi feita sem reconhecer totalmente as implicações e restrições envolvidas com o TCP. O principal problema com essa implementação era a largura de banda limitada e o fato de que ela realmente não foi projetada com o propósito de alimentar grandes volumes de dados. Soluções alternativas para substituir o TCP e melhorar tbe neste projeto serão discutidas mais tarde.

Uma breve descrição do TCP com LwIP: Os dados são enviados pela rede em pacotes de tamanho tcp_mss (tamanho máximo do segmento TCP), que geralmente é de 1460 bytes. Chamar tcp_write pegará alguns dados referenciados por um ponteiro e configurará pbufs (buffers de pacote) para manter os dados e fornecer uma estrutura para as operações TCP. A quantidade máxima de dados que podem ser enfileirados de uma vez é definida como tcp_snd_buf (espaço de buffer do emissor TCP). Como este parâmetro é um número de 16 bits, estamos limitados a um tamanho de buffer de envio de 59695 bytes (há algum preenchimento obrigatório no buffer de envio). Depois que os dados foram enfileirados, tcp_output é chamado para começar a transmitir os dados. Antes de enviar o próximo segmento de dados, é imperativo que todos os pacotes anteriores tenham sido transmitidos com sucesso. Este processo é feito utilizando a função recv_callback, pois esta é a função que é chamada quando o reconhecimento é visto do receptor.

Utilizar os projetos de exemplo no Vivado SDK é muito útil para aprender como a operação LwIP TCP e é um bom ponto de partida para começar um novo projeto.

O procedimento para o dispositivo de transmissão WiDi é o seguinte:

  1. Inicialize a rede TCP usando as chamadas de função do driver LWIP bare-metal.
  2. Especifique quaisquer funções de retorno de chamada necessárias para operações de rede.
  3. Conecte-se ao receptor WiDi conectando-se ao seu endereço IP e porta (nossa configuração: IP do receptor é 192.168.0.9, conecte-se à porta 7).
  4. Quando o temporizador do driver VDMA expirar, insira o TX ISR.
  5. Determine o buffer de quadro atual para acessar com base no código cinza VDMA
  6. Enfileirar o primeiro segmento de dados no buffer de envio TCP
  7. Produza os dados e atualize as variáveis locais para manter o controle de quantos dados foram enviados do quadro atual.
  8. Ao atingir o retorno de chamada recebido (chamada de função feita após o transmissor receber uma confirmação da recuperação de dados), enfileire o próximo segmento de dados.
  9. Repita as etapas 7 e 8 até que todo o quadro seja enviado.
  10. Retorne ao estado inativo para aguardar a próxima interrupção do temporizador para indicar que um novo quadro está pronto (Voltar para a etapa 4).

Certifique-se de definir as configurações de LwIP do pacote de suporte da placa conforme mostrado na imagem acima. Todos os valores são padrão, exceto tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg. Observe também que a depuração detalhada pode ser obtida alterando os parâmetros BSP para o grupo debug_options.

Etapa 6: configurar o sistema de processamento Zynq para recepção de dados via Ethernet

A placa de desenvolvimento Zybo que atuará como receptor sem fio operará de forma semelhante ao dispositivo de transmissão. As configurações do pacote de suporte da placa para LwIP serão idênticas às da etapa anterior.

O dispositivo receberá pacotes contendo os segmentos de quadro de vídeo do nanorouter e copiará os dados do quadro de vídeo no espaço de buffer de quadro triplo para o VDMA receptor. A fim de evitar a substituição de quaisquer dados, um buffer de dados duplo (vamos nos referir como o buffer de rede) é usado ao coletar dados do nanorouter, para que o tráfego de rede possa continuar fluindo enquanto o quadro de vídeo completo anterior está sendo copiado para o Buffer VDMA.

O procedimento para o dispositivo receptor WiDi requer duas tarefas, uma das quais é receber dados Ethernet e a outra é copiar quadros de vídeo do buffer de rede para o buffer triplo de quadros do VDMA.

Tarefa de recepção Ethernet:

  1. Inicialize a rede TCP usando as chamadas de função do driver LWIP bare-metal (configuração com o endereço IP ao qual o transmissor se conectará, 192.168.0.9 no nosso)
  2. Especifique quaisquer funções de retorno de chamada necessárias para operações de rede.
  3. Ao receber o pacote Ethernet, copie os dados do pacote no buffer da rede atual e aumente os dados acumulados atuais.
  4. Se o pacote preencher o buffer de quadro da rede, continue com as etapas 5 e 6. Caso contrário, volte para a etapa 3 desta tarefa.
  5. sinalize que a tarefa de buffer de quadro triplo VDMA deve copiar do buffer de rede recém-concluído.
  6. Mude para o outro buffer de rede e continue coletando dados via ethernet.
  7. Inativo até que um novo pacote Ethernet seja recebido (etapa 3).

Copie o buffer de rede para o buffer de quadro triplo VDMA:

  1. Quando o temporizador do driver VDMA expirar, insira o RX ISR.
  2. Determine o buffer de quadro atual para acessar com base no código cinza VDMA.
  3. Determine qual buffer de rede será copiado para o buffer VDMA e copie esses dados

Etapa 7: conecte suas placas Zybo à fonte HDMI e ao coletor HDMI

Conecte suas placas Zybo à fonte HDMI e ao dissipador HDMI
Conecte suas placas Zybo à fonte HDMI e ao dissipador HDMI

Agora conecte os cabos HDMI para o receptor e transmissor, programe os FPGAs e execute o sistema de processamento. A taxa de quadros provavelmente será muito lenta, devido à imensa sobrecarga na operação LwIP e largura de banda limitada. Se houver algum problema, conecte-se via UART e tente identificar quaisquer avisos ou erros.

Etapa 8: Idéias alternativas para melhoria

Idéias alternativas para melhoria
Idéias alternativas para melhoria

Um grande problema para este projeto foi a quantidade de dados necessários para enviar por wi-fi. Isso era esperado, no entanto, subestimamos o impacto que isso teria e resultou em mais uma explosão de imagens em uma tela do que em um feed de vídeo. Existem várias maneiras de melhorar este projeto:

  • Compressão de vídeo em tempo real. Compactar o feed de vídeo de entrada quadro a quadro reduziria muito a quantidade de dados necessária para ser enviada pela rede. Idealmente, isso seria feito em hardware (o que não é uma tarefa fácil), ou poderia ser feito em software usando o outro núcleo ARM para executar algoritmos de compressão (isso precisaria de mais análises para garantir que o tempo acabe). Existem alguns componentes de compressão de vídeo em tempo real de código aberto que encontramos na web, mas a maioria são IP.
  • Implementar o fluxo Ethernet em hardware, em vez de software. Havia uma tonelada de sobrecarga devido à falta de espaço disponível para enfileirar os dados de saída no transmissor, devido à limitação do tamanho do segmento. Um processo muito mais eficiente é usar o IP Ethernet AXI com um buffer FIFO ou DMA para alimentar os dados nele. Isso reduziria a bagagem extra do TCP LwIP e permitiria mais fluxo de dados.

Etapa 9: Acessibilidade

O produto resultante desse projeto WiDi deve ser um par compacto e totalmente integrado de dispositivos que um usuário pode conectar a qualquer fonte HDMI e, em seguida, direcionar a alimentação de vídeo para um monitor com capacidade HDMI sem fio. Os dispositivos apresentariam o SoC Zynq-7000 encontrado na placa de referência Zybo e incorporariam o hardware de rede encontrado nos nano-roteadores TP-Link. Idealmente, o usuário seria capaz de controlar o módulo de transmissão de um local discreto dentro do sistema operacional de destino, com pouca necessidade de habilidade técnica significativa.

Segurança e conectividade

Os dispositivos também devem incorporar Segurança da Camada de Transporte (TLS) e ter capacidade limitada de conexão automática, ambos para fins de privacidade. A intenção dos projetistas é fazer da conexão com um monitor por meio de uma interface sem fio uma ação deliberada em nome do usuário para evitar a transmissão indevida de material sensível.

Status atual

Até este ponto, o estado do projeto ainda é um trabalho em andamento. Para que o usuário final atual se beneficie deste tutorial, ele deve ter um forte conhecimento técnico de design de sistema embarcado e deve ter alguma familiaridade com hardware programável e software embarcado trabalhando juntos.

Os dados enviados pela rede não são criptografados neste ponto e são considerados uma transmissão bruta de pacotes TCP / IP.

O projeto do núcleo de vídeo foi testado com sucesso para transmissão e recepção. Por outro lado, a conexão sem fio entre duas placas zybo foi estabelecida e os dados do quadro de teste foram enviados com sucesso. Ainda é necessário, no entanto, combinar o código de rede para cada projeto de núcleo de vídeo e testar a transmissão de quadros de vídeo reais.

Recomendado: