Índice:

Câmera ZYBO OV7670 com controle de panorâmica / inclinação: 39 etapas (com imagens)
Câmera ZYBO OV7670 com controle de panorâmica / inclinação: 39 etapas (com imagens)

Vídeo: Câmera ZYBO OV7670 com controle de panorâmica / inclinação: 39 etapas (com imagens)

Vídeo: Câmera ZYBO OV7670 com controle de panorâmica / inclinação: 39 etapas (com imagens)
Vídeo: SN65LVDS324 Overview 2024, Novembro
Anonim
Image
Image
Câmera ZYBO OV7670 com controle de panorâmica / inclinação
Câmera ZYBO OV7670 com controle de panorâmica / inclinação

Comece na etapa um para obter detalhes sobre a criação de um controlador PWM servo de 2 eixos.

Comece no diagrama de blocos massivo (Etapa 19) para o projeto completo.

Configuração de câmera + panorâmica / inclinação que usamos:

O PmodCON3 da Digilent foi usado para conectar os servos.

Etapa 1: Construindo um Módulo PWM - Arquivo Fonte

Etapa 2: Construindo um Módulo PWM - Configuração Vivado

Construindo um Módulo PWM - Vivado Setup
Construindo um Módulo PWM - Vivado Setup

Primeiro, baixe o Vivado Design Suite do site da Xilinx. Instale todo o pacote de design, incluindo o Kit de Desenvolvimento de Software (SDK) Vivado. Este projeto usa a versão 2017.2.

Nesse ínterim, Digilent Adept 2 também deve ser instalado como um driver de placa Zybo.

Etapa 3: Construindo um Módulo PWM - Criar um Arquivo de Projeto

Construindo um Módulo PWM - Criar um Arquivo de Projeto
Construindo um Módulo PWM - Criar um Arquivo de Projeto

Antes de criar um arquivo de projeto, você deve se certificar de que já instalou o arquivo Zybo corretamente, conforme o tutorial aqui:

Vivado versão 2015.1 e posterior Instalação do arquivo de placa

Abra Vivado 2017.2. No Quick Start, clique em Criar Projeto -> Avançar -> Nome do Projeto (Nomeie o nome do seu projeto aqui) -> Tipo de Projeto. Em Tipo de projeto, selecione Projeto RTL e marque “Não especificar fontes neste momento”. Em seguida, para a parte padrão, selecione “Boards” e “Zybo” como nome de exibição. Em seguida, clique em Concluir para iniciar o projeto.

Etapa 4: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (I)

Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (I)
Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (I)

No Flow Navigator, clique em “” Criar Desenho de Bloco”e pressione OK. clique no sinal “+” para adicionar os IPs necessários. Adicionar:

  • Um sistema de processamento ZYNQ7 dois temporizador AXI
  • Dois AXI Timer

Etapa 5: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (II)

Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrições (II)
Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrições (II)

Depois de adicionar IPs, execute Block Automation e automação de conexão. Concluída a automação, no bloco “axi_timer_0”, clique com o botão direito em pwm0 -> Make External. Nomeie o pino externo pwm0 como pwm_Xaxis. Além disso, repita o processo acima no bloco “axi_timer_1” e nomeie o pino externo pwm0 como pwm_Zaxis.

Etapa 6: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (III)

Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrições (III)
Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrições (III)

Observe que toda vez que terminarmos o Desenho do Bloco no Vivado, precisamos criar um Wrapper HDL. Uma vez que será o módulo de nível superior para cada projeto.

Etapa 7: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (IV)

Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (IV)
Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (IV)

Agora, precisamos configurar nosso arquivo de restrição para atribuir pinos conectados ao nosso diagrama de blocos. Feche a janela Block Design, na guia Sources, “Add Sources” -> Adicione ou crie restrições-> adicione o Zybo-Master.xdc como nossos arquivos de restrição.

Etapa 8: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (V)

Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (V)
Construindo um Módulo PWM - Desenho de Bloco e Configuração de Arquivo de Restrição (V)

Abra o arquivo de restrição Zybo-Master.xdc da pasta Constraints, descomente as portas que queremos especificar como sinais de saída e renomeie “get_ports {XXXX}”, que XXXX denota o pino externo nomeado no Diagrama de Bloco. A configuração do arquivo de restrição é mostrada na figura.

Etapa 9: Construindo um Módulo PWM - Instalação de Hardware

Construindo um Módulo PWM - Instalação de Hardware
Construindo um Módulo PWM - Instalação de Hardware

Conecte os servo motores ao Pmod CON3. TowerPro SG90 é o modelo de servo motor que usamos neste projeto. Para os fios do servo motor, o fio laranja representa o sinal PWM, conectado ao pino SIG no Pmod CON3. O fio vermelho Vcc é um fio de alimentação conectado ao pino VS no Pmod CON3. Finalmente, o fio marrom Gnd é um fio terra conectado ao pino GND. Em seguida, insira o Pmod CON3 na linha superior da porta JD na placa Zybo.

Etapa 10: Construindo um Módulo PWM - Gerar Bitstream e Iniciar SDK

1. Na guia Project Navigator, execute Generate BitStream.

2. Exportar hardware: Arquivo> Exportar> Exportar Hardware-> marcar em “incluir bitstream” -> OK 3. Iniciar SDK: Arquivo -> Iniciar SDK.

Etapa 11: Construindo um Módulo PWM - Criar um Novo Aplicativo no SDK Xilinx

Construindo um Módulo PWM - Criar um Novo Aplicativo no SDK Xilinx
Construindo um Módulo PWM - Criar um Novo Aplicativo no SDK Xilinx

Criar uma nova aplicação:

Arquivo> Novo> Projeto do Aplicativo -> Insira o nome do seu projeto -> Concluir

No Project Explorer, deve haver três pastas.

Neste caso, “design_1_wrapper_hw_platform_0” é a pasta exportada anteriormente pela Vivado. Axis_2_PWM_SDK_bsp é a pasta do pacote de suporte da placa. E Axis_2_PWM_SDK é a nossa pasta de projeto principal no SDK. Você pode ver o arquivo “helloworld.c” na pasta “src” de Axis_2_PWM_SDK, onde “helloworld.c” é o arquivo principal.

Etapa 12: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (I)

Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (I)
Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (I)

Vamos verificar alguns arquivos no Project Explorer. Primeiro, na pasta “design_1_wrapper_hw_platform_0”, abra o “system.hdf”. Este arquivo demonstra o mapa de endereços para o processador ps7_cortex9 e os blocos de IP presentes em nosso projeto.

Etapa 13: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (II)

Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (II)
Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (II)

Em seguida, verifique os arquivos “include” e “libsrc” na pasta “Axis_2_PWM_SDK_bsp”. Os arquivos de biblioteca aqui nos permitem interagir com periféricos de hardware sem “reproduzir” registros.

Etapa 14: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (III)

Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (III)
Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (III)

Por meio da documentação do BSP, xtmrctr.h é encontrado como uma biblioteca de controle de cronômetro Xilinx relacionada ao cronômetro AXI. Normalmente, podemos encontrar a função PWM desejada aqui. No entanto, se você leu a documentação “tmrctr_v4_3”, mostra que o driver não suporta atualmente a operação PWM do dispositivo. Devido à deficiência na função PWM, temos que encerrar nossa função PWM com a ajuda de xtmrctr.h e AXI Timer v2.0 LogiCORE IP Product Guide.

Etapa 15: Construindo um Módulo PWM - Função PWM (I)

Construindo um Módulo PWM - Função PWM (I)
Construindo um Módulo PWM - Função PWM (I)

De volta ao arquivo principal “helloworld.c”, inclua os seguintes arquivos de cabeçalho:

Etapa 16: Construindo um Módulo PWM - Função PWM (II)

Construindo um Módulo PWM - Função PWM (II)
Construindo um Módulo PWM - Função PWM (II)

Defina os endereços de base de dois AXI TImer através de “xparameters.h”.

Etapa 17: Construindo um Módulo PWM - Função PWM (III)

Construindo um Módulo PWM - Função de Conclusão PWM (III)
Construindo um Módulo PWM - Função de Conclusão PWM (III)

Crie a função PWM desejada.

Duty_val: converte o valor do grau em duty cycle. PWM_Freq_Duty: define a frequência desejada e o duty cycle para gerar PWM. O período do relógio também deve ser atribuído.

PWM_START: atribua o endereço de registro PWM e comece a gerar PWM.

PWM_STOP: atribua o endereço de registro PWM e pare de gerar PWM.

O resto do código de demonstração é mostrado em “helloworld.c” em “Axis_2_PWM_SDK”

Etapa 18: Construindo um Módulo PWM - Faça-o Funcionar

1. Programe o FPGA por meio do SDK

  • Conecte a placa Zybo através da porta USB ao PC.
  • Ferramentas Xilinx -> Programa FPGA

2. Execute o programa

Clique no ícone “Executar” e selecione o menu -> Executar como -> Iniciar no Hardware

3. Terminal SDK

  • Abra o Terminal SDK -> Conectar à Porta Serial -> OK
  • Execute o programa. Se o código de demonstração for executado com sucesso, você deverá ver “Inicialização concluída!” no Terminal SDK.

Etapa 19: Processamento de streaming de vídeo na Digilent ZYBO com OV7670

Arquivo de arquivo completo anexado.

Etapa 20: Diagrama de blocos completo

Diagrama de Bloco Completo
Diagrama de Bloco Completo

Isso mostra o diagrama completo de todas as conexões e blocos de IP no projeto

Etapa 21: Conecte o OV7670 ao ZYBO

Conecte o OV7670 ao ZYBO
Conecte o OV7670 ao ZYBO

Crie uma conexão para conectar o módulo ov7670 aos Pmods ZYBO

Dados Pmod é Pmod D

Pmod de controle é Pmod C

Além disso, conecte o PmodCON3 e os servos conforme especificado na primeira metade deste tutorial

Etapa 22: Criar Design de Bloco

Criar Desenho de Bloco
Criar Desenho de Bloco

No Flow Navigator, clique em "Create Block Design" e, a seguir, pressione OK.

Etapa 23: Adicionar arquivos VHDL para controle e captura de câmera OV7670

Adicione os arquivos VHDL anexados a esta etapa para o projeto

Etapa 24: Adicionar Arquivo de Restrições

Adicione o arquivo de restrições anexado ao seu projeto.

Etapa 25: Adicionar Repo de IP para HLS IP

Adicionar IP Repo para HLS IP
Adicionar IP Repo para HLS IP

Pegue o arquivo Zip anexado e descompacte-o em uma nova pasta com o mesmo nome em um novo diretório (pasta) chamado "HLS_repo".

Adicione um repositório de IP ao seu projeto acessando o catálogo de IP e clicando com o botão direito e selecionando "Adicionar Repositório …"

Navegue até o diretório "HLS_repo" e selecione-o.

Opcional: Crie o bloco de processamento de vídeo HLS para você!

Etapa 26: Adicionar Módulos e IP

Adicionar Módulos e IP
Adicionar Módulos e IP
Adicionar Módulos e IP
Adicionar Módulos e IP

Adicione os módulos ov7670_axi_stream_capture, debounce e ov7670_controller ao diagrama de blocos clicando com o botão direito do mouse no plano de fundo e selecionando "Adicionar Módulo…"

Da mesma forma, adicione os IPs:

  • HLS_Video_Track
  • Gravação de buffer de quadro de vídeo
  • Leitura do buffer de quadro de vídeo
  • Controlador de tempo de vídeo
  • AXI4-Stream para saída de vídeo
  • 3 de "fatia"
  • Constante
  • 2 do temporizador AXI

Etapa 27: Definições de configuração de IP

Definições de configuração de IP
Definições de configuração de IP
Definições de configuração de IP
Definições de configuração de IP
Definições de configuração de IP
Definições de configuração de IP

Conforme mostrado nas fotos

Etapa 28: adicionar e configurar o bloco de IP PS

Adicionar e configurar PS IP Block
Adicionar e configurar PS IP Block
Adicionar e configurar PS IP Block
Adicionar e configurar PS IP Block

Adicione o sistema de processamento ZYNQ7 ao diagrama de blocos

edite a configuração:

  • Configuração PS-PL

    • HP

      • Habilitar S HP 0
      • Habilitar S HP 1
  • Configuração do relógio

    • Relógios de Tecido PL

      • FCLK_0 a 100 MHz
      • FCLK_1 a 25 MHz (OutputClock)
      • FLCK_2 a 35 MHz (<= 50 MHz) (CameraClock)

Etapa 29: Parte 1. Construindo um Módulo PWM para Servo Motores

Traga axi_timer_0 pwm0 para a nova porta de saída pwm_Xaxis

Traga axi_timer_1 pwm0 para a nova porta de saída pwm_Zaxis

Etapa 30: Conexões laterais de entrada de vídeo (aclk em destaque)

Conexões laterais de entrada de vídeo (aclk em destaque)
Conexões laterais de entrada de vídeo (aclk em destaque)

Conecte os blocos de IP do lado da entrada de vídeo corretamente

(* essas conexões devem ser criadas selecionando as opções corretas durante a automação da conexão) "aclk" de axi_stream_capture vai para:

  • ap_clk na gravação do frame buffer do vídeo
  • ap_clk no bloco de processamento de stream de vídeo HLS
  • * aclk no IP smartconnect AXI do Video Frame Buffer Write para o S_AXI_HP0
  • * aclk correspondente aos canais do IP de interconexão AXI para os canais S_AXI do bloco de processamento de vídeo HLS e o buffer de quadro de vídeo escrever S_AXI_HP0_ACLK no bloco PS

O sinal de fluxo de vídeo é simplesmente conectado em série do bloco de captura à interface de memória Zynq.

  • O vídeo vai do bloco de captura ao bloco de processamento HLS.
  • O vídeo processado do bloco HLS vai para o bloco de gravação do buffer de quadros.
  • * O bloco de gravação do buffer de quadro se conecta à interface HP0 no bloco Zynq PS.
  • O sinal m_axis_tuser da saída do bloco de captura é conectado manualmente ao sinal de entrada video_in_TUSER no bloco de processamento HLS e ao sinal ap_start no mesmo bloco.

O sinal TUSER (tuser) é usado pelo protocolo de fluxo de vídeo AXI para indicar o início de um quadro do vídeo. AP_Start diz ao bloco HLS para iniciar o processamento. Portanto, estamos usando tuser para acionar o bloco HLS para processar cada quadro à medida que ele entra. Ao conectar um único sinal de um barramento e dividi-lo desta forma, é necessário conectá-lo também ao ponto de terminação normal do resto do barramento. O Vivado assume que se você estiver conectando o sinal manualmente, deseja desconectar o que normalmente faria.

Definições de configuração de blocos de IP:

Gravação do buffer de quadro de vídeo:

Formatos de vídeo: RGB8

1 amostra por relógio Máx. Colunas: 1280 (> = 640) Máx. Linhas: 960 (> = 480) Largura máxima de dados: 8

Etapa 31: Conexões ao OV7670

Conexões para OV7670
Conexões para OV7670

No bloco ov7670_axi_stream_capture

  • Torne todas as entradas externas (clique com o botão direito em um pino e selecione no menu, ou clique com o botão esquerdo -> ctrl + T)
  • Deixe os nomes como estão

No bloco ov7670_controller

  • Tornar todas as saídas do bloco externas
  • Renomeie a porta config_finished para led0
  • conectar clk ao CameraClock (<= 50MHz) (FCLK_2)

No bloco de debounce

  • conecte a entrada do botão 1 a uma porta de entrada externa chamada btn0
  • conecte a saída1 à linha de reenvio no bloco de IP ov7670_controller
  • conecte a entrada do botão2 a uma porta de entrada externa chamada btn3
  • conecte o out2n à entrada ext_reset_in no IP de redefinição do sistema do processador para o domínio do relógio de captura de vídeo. (* Isso pode precisar ser feito depois que o IP for gerado *)
  • conectar clk ao CameraClock (<= 50MHz) (FCLK_2)

Etapa 32: Conexões no lado externo do vídeo

Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo
Conexões no lado externo do vídeo

Conexões para blocos Controlador de temporização de vídeo (VTC), AXI4-Stream para saída de vídeo e fatias

  • Use relógio de 25 MHz (FCLK_1) para vid_io_out_clk e VTC clk
  • Use relógio de 100 MHz (FCLK_0) para aclk em AXI4-Stream para saída de vídeo
  • vtiming_out para vtiming_in
  • Leitura do buffer de quadro de vídeo m_axis_video vai para AXI4-Stream para saída de vídeo video_in
  • vtg_ce vai para gen_clken
  • Associe VTC clken, aclken, vid_io_out_ce a Constant dout [0: 0]
  • Traga vid_hsync e vid_vsync para as portas de saída externas vga_hs e vga_vs, respectivamente. (não retratado)

Fatias:

  • As fatias devem ser configuradas como mostrado nas imagens anexas

    • renomeie os blocos para slice_red, slice_green e slice_blue
    • A configuração da fatia varia conforme mostrado nas imagens de acordo com o nome do bloco
    • conecte cada saída de fatia a uma saída de porta externa, conforme mostrado na imagem.
  • vid_data [23: 0] se conecta às entradas para cada fatia (Din [23: 0])

Etapa 33: Executar Bloco e Automação de Conexão

Executar Bloco e Automação de Conexão
Executar Bloco e Automação de Conexão
Executar Bloco e Automação de Conexão
Executar Bloco e Automação de Conexão
Executar Bloco e Automação de Conexão
Executar Bloco e Automação de Conexão

Execute Block Automation para conectar as coisas do bloco ZYNQ7 PS. Conforme mostrado na imagem.

Execute a automação de conexão para criar todos os IPs de interconexão. Preste muita atenção a todas as opções em cada imagem.

No bloco debounce, conecte out2n à entrada ext_reset_in do domínio do relógio de captura de vídeo.

Etapa 34: Gerar Wrapper HDL

Gerar Wrapper HDL
Gerar Wrapper HDL

Gere o Wrapper HDL para seu projeto de bloco.

Defina-o como o módulo superior.

Etapa 35: Gerar Bitstream, Exportar Hardware para SDK, Lançar SDK do Vivado

Certifique-se de incluir bitstream na exportação.

A geração de fluxo de bits pode levar muito tempo.

Em seguida, inicie o SDK

Etapa 36: SDK (sem FreeRTOS)

SDK (sem FreeRTOS)
SDK (sem FreeRTOS)

Esta versão faz tudo sem usar FreeRTOS, condensando bem o código.

Crie um BSP independente com base no design do hardware. As opções padrão devem ser adequadas. Certifique-se de que as fontes BSP foram geradas.

Crie o aplicativo conforme mostrado na imagem. (aplicativo vazio)

Exclua o principal gerado automaticamente e importe os arquivos anexados.

Etapa 37: Implementação do FreeRTOS

Implementação FreeRTOS
Implementação FreeRTOS

Esta versão usa FreeRTOS. Create a FreeRTOS901 BSP com base no design do hardware. As opções padrão devem ser adequadas. Certifique-se de que as fontes BSP foram geradas.

Crie o aplicativo conforme mostrado na imagem. (aplicativo vazio)

Exclua o principal gerado automaticamente e importe os arquivos anexados.

Etapa 38: Instruções de uso

Este projeto é um pouco complicado de executar. Siga as etapas em ordem.

Certifique-se de que seu ZYBO não esteja carregando nada ao ser ligado. Isso significa que o LED Concluído não deve acender. Uma maneira de fazer isso é definir o jumper da fonte de inicialização para JTAG.

Abra o projeto (FreeRTOS ou não) que deseja programar a partir do SDK

  1. Ligue o seu ZYBO. O LED Concluído não deve acender.
  2. Programe o FPGA com o arquivo de bits. O LED Concluído deve acender. O Led0 não deve acender.
  3. Execute o código (lembre-se de ir além do ponto de interrupção de início se estiver fazendo isso).

Neste ponto, você deve estar obtendo uma saída em seu monitor VGA.

Para reiniciar (se houver algum bug ou qualquer outra coisa): toque rapidamente no botão PS-SRST ou desligue o ZYBO e ligue-o novamente. Continue a partir da etapa 2.

Parar o processador com o depurador fará com que a câmera mantenha a posição em vez de se mover. O stream de vídeo continuará de qualquer maneira.

Etapa 39: Referências e links

Guias de referência e documentação do Xilinx:

  • PG044 - AXI-Stream para saída de vídeo
  • PG278 - Leitura / Gravação do Buffer de Quadro de Vídeo

Outros links:

  • Blog de Lauri - entrada VDMA
  • Blog de Lauri - OV7670 para saída VGA usando BRAM
  • Hamsterworks wiki, de Mike Fields, a fonte original do código OV7670
  • Folha de dados mostrando especificações básicas de tempo

Recomendado: