Índice:
- Etapa 1: Construindo um Módulo PWM - Arquivo Fonte
- Etapa 2: Construindo um Módulo PWM - Configuração Vivado
- Etapa 3: Construindo um Módulo PWM - Criar um Arquivo de Projeto
- Etapa 4: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (I)
- Etapa 5: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (II)
- Etapa 6: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (III)
- Etapa 7: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (IV)
- Etapa 8: Construindo um Módulo PWM - Projeto de Bloco e Configuração de Arquivo de Restrição (V)
- Etapa 9: Construindo um Módulo PWM - Instalação de Hardware
- Etapa 10: Construindo um Módulo PWM - Gerar Bitstream e Iniciar SDK
- Etapa 11: Construindo um Módulo PWM - Criar um Novo Aplicativo no SDK Xilinx
- Etapa 12: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (I)
- Etapa 13: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (II)
- Etapa 14: Construindo um Módulo PWM - Visão Geral do Explorador de Projetos (III)
- Etapa 15: Construindo um Módulo PWM - Função PWM (I)
- Etapa 16: Construindo um Módulo PWM - Função PWM (II)
- Etapa 17: Construindo um Módulo PWM - Função PWM (III)
- Etapa 18: Construindo um Módulo PWM - Faça-o Funcionar
- Etapa 19: Processamento de streaming de vídeo na Digilent ZYBO com OV7670
- Etapa 20: Diagrama de blocos completo
- Etapa 21: Conecte o OV7670 ao ZYBO
- Etapa 22: Criar Design de Bloco
- Etapa 23: Adicionar arquivos VHDL para controle e captura de câmera OV7670
- Etapa 24: Adicionar Arquivo de Restrições
- Etapa 25: Adicionar Repo de IP para HLS IP
- Etapa 26: Adicionar Módulos e IP
- Etapa 27: Definições de configuração de IP
- Etapa 28: adicionar e configurar o bloco de IP PS
- Etapa 29: Parte 1. Construindo um Módulo PWM para Servo Motores
- Etapa 30: Conexões laterais de entrada de vídeo (aclk em destaque)
- Etapa 31: Conexões ao OV7670
- Etapa 32: Conexões no lado externo do vídeo
- Etapa 33: Executar Bloco e Automação de Conexão
- Etapa 34: Gerar Wrapper HDL
- Etapa 35: Gerar Bitstream, Exportar Hardware para SDK, Lançar SDK do Vivado
- Etapa 36: SDK (sem FreeRTOS)
- Etapa 37: Implementação do FreeRTOS
- Etapa 38: Instruções de uso
- Etapa 39: Referências e links
Vídeo: Câmera ZYBO OV7670 com controle de panorâmica / inclinação: 39 etapas (com imagens)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:39
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
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
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)
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)
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)
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)
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)
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
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
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)
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)
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)
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)
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)
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)
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
Isso mostra o diagrama completo de todas as conexões e blocos de IP no projeto
Etapa 21: 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
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
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
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
Conforme mostrado nas fotos
Etapa 28: adicionar e configurar o bloco de IP PS
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)
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
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 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
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
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)
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
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
- Ligue o seu ZYBO. O LED Concluído não deve acender.
- Programe o FPGA com o arquivo de bits. O LED Concluído deve acender. O Led0 não deve acender.
- 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:
Lâmpada de cubo Rubik sem fio de fácil mudança de cor baseada na inclinação: 10 etapas (com imagens)
Lâmpada Rubik's Cube sem fio com mudança de cor baseada na inclinação fácil: Hoje vamos construir esta lâmpada Rubik's Cube incrível que muda de cor com base no lado que está para cima. O cubo funciona com uma pequena bateria LiPo, carregada por um cabo micro-usb padrão e, em meus testes, tem uma bateria com duração de vários dias. Esse
Mecanismo de panorâmica e inclinação para lapsos de tempo DSLR: 7 etapas (com imagens)
Mecanismo de Pan e Tilt para Lapsos de Tempo de DSLR: Eu tinha alguns motores de passo por aí e realmente queria usá-los para fazer algo legal. Eu decidi que faria um sistema Pan and Tilt para minha câmera DSLR para que eu pudesse criar lapsos de tempo legais. Itens de que você precisa: 2 motores de passo -htt
Interruptor de inclinação: 9 etapas (com imagens)
Tilt Switch: Este tutorial serve como uma introdução aos circuitos flexíveis. Por meio da aplicação, você obterá uma compreensão das propriedades de funcionamento de materiais têxteis eletrônicos (e-têxteis), como tecido condutor e fio condutor. Ao construir um f
Caixa de luz de inclinação LED: 5 etapas (com imagens)
LED Tilt Light Box: Este instrutível irá mostrar-lhe como fazer uma placa de circuito simples com um interruptor de mercúrio (interruptor de inclinação) e LEDs e, em seguida, uma pequena caixa de madeira com uma janela para colocá-la
Sensor de inclinação de cinco centavos: 4 etapas (com imagens)
Sensor de inclinação de cinco centavos: Este é um sensor de inclinação básico inspirado em sensores tipo bola e gaiola, mas 2d em vez de 3d. Um níquel capturado conecta pares de fios dependendo da orientação do sensor. Eles são rápidos de construir e muito baratos; Eu vim com eles para um projeto w