Índice:

Jogo de reação FPGA: 10 etapas
Jogo de reação FPGA: 10 etapas

Vídeo: Jogo de reação FPGA: 10 etapas

Vídeo: Jogo de reação FPGA: 10 etapas
Vídeo: O MR BEAST Me DESAFIOU Por 24h! 2024, Julho
Anonim
Jogo de reação FPGA
Jogo de reação FPGA

Por Summer Rutherford e Regita Soetandar

Etapa 1: Introdução

Para nosso projeto final para o CPE 133, projetamos um jogo de reação em VHDL para uma placa Basys3. Este jogo pode ser comparado mais de perto com o jogo de arcade “Stacker”, onde o jogador tem que soltar os blocos no momento certo. A placa Basys3 é conectada a uma placa de ensaio, que possui LEDs alternados. Essas luzes LED irão alternar em uma frequência específica, dependendo do nível. Este jogo usa o divisor de relógio e o display de 4 dígitos e 7 segmentos, bem como uma máquina de estados finitos. Quando o jogador ativa a chave correta conforme o LED do meio acende, o jogador avança para o próximo nível do jogo, aumentando a frequência dos LEDs alternados. Isso torna cada nível sucessivo mais difícil do que o nível anterior. Quando o jogador bate com sucesso o nível 7, o nível mais alto, uma mensagem será exibida no display de segmento e todos os LEDs piscarão simultaneamente, acendendo e apagando.

Etapa 2: Materiais

Materiais
Materiais
Materiais
Materiais
Materiais
Materiais

Os materiais de que você precisa são:

  • Placa Digilent Basys3 com cabo micro USB
  • Tábua de pão
  • 5 LEDs
  • 5 resistores (usamos 220 ohms)
  • 11 fios de jumper
  • Computador com vivado

Etapa 3: Design de caixa preta do diagrama de nível superior

Diagrama de nível superior Design de caixa preta
Diagrama de nível superior Design de caixa preta
Diagrama de nível superior Design de caixa preta
Diagrama de nível superior Design de caixa preta

Como você pode ver, nosso diagrama de blocos de nível superior começa obtendo os relógios necessários de nosso submódulo, ClkDivide. Esses relógios são entradas em vários blocos de processo. Essencialmente, o jogo deve reconhecer que, quando um usuário liga o interruptor corretamente, os LEDs devem começar a alternar mais rápido e o display precisa subir um nível. O diagrama de blocos pode parecer um pouco maluco, mas isso é porque existem muitos sinais que são estabelecidos em um determinado processo e então esse sinal define outro sinal em outro bloco de processo.

No final, as únicas entradas que o jogo leva são o relógio de entrada na placa Basys3 que funciona a 100 Mhz, sete interruptores na placa Basys3 e o botão de reset. O que é emitido é o ânodo para a tela de sete segmentos, os sete segmentos para a tela e os LEDs.

Etapa 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Este submódulo divisor de clock criou um clock mais lento dependendo do valor que mapeamos para ele em nosso arquivo principal. Usamos esse submódulo para determinar Clk400, PushClk e newlck. Esse submódulo usa um relógio e um divisor de 32 bits como entradas. Um relógio lento é emitido. Há um bloco de processo para o divisor e o relógio retardado. No processo, há uma variável temporária, que chamamos de contagem, que conta um cada vez que uma borda ascendente do relógio inserido é atingida. Quando atinge o número do divisor, o relógio desacelerado é alternado e a contagem é redefinida para zero.

Etapa 5: Bloco de Processo de Mudança

Bloco de Processo de Mudança
Bloco de Processo de Mudança

O bloco de processo Shift controla o movimento alternado e a velocidade dos LEDs. Na lista de sensibilidade estão os sinais newclk e Stop. Parar causa um breve atraso quando o usuário passa de nível. Se a parada não estiver alta, os LEDs alternam normalmente com base na velocidade de newclk. Este padrão alternado é controlado por duas variáveis: Rastreie e conte. A contagem determina qual LED deve estar ligado, enquanto a trilha determina se a contagem deve ser contada para cima ou para baixo. Há outro sinal, Final, que se aplica apenas quando o Nível é “111”, indicando que o jogador venceu o jogo. Final alterna entre 0 e 1 a cada transição do clock para ligar e desligar os LEDs continuamente. Este é apenas um elemento visual para a exibição final.

Este processo de mudança é o lugar perfeito para começar para este projeto. Se você conseguir fazer com que seus LEDs alternem correta e consistentemente, a partir daqui basta adicionar o comportamento ao subir de nível!

Etapa 6: Máquina de Estados Finitos

Máquina de estados finitos
Máquina de estados finitos

Criamos uma máquina de estados finitos para ditar o comportamento quando a chave de entrada ou o botão de reinicialização é pressionado. Cada estado é um “nível” e se o interruptor for ligado na hora errada ou reset for pressionado, o nível volta para “000”. Caso contrário, se a chave estiver corretamente ligada, o nível sobe até atingir o estado final, “111” e a exibição final ocorre. O FSM é baseado nos dois blocos de processo sync_proc e comb_proc. Sync_proc usa o relógio que chamamos de PushClk. Este relógio controla a rapidez com que o próximo estado se torna o estado atual. Este relógio deve ser bastante rápido; escolhemos uma velocidade cerca de duas vezes mais rápida do que nossa velocidade de LED mais rápida.

Implementamos este código usando um FSM para os níveis; no entanto, após este projeto, percebemos que um uso mais eficiente de um FSM pode ter sido um estado de contagem, um estado de reinicialização ou um estado de permanência. Se nada estiver sendo pressionado, ele estará no estado de permanência. Se reiniciar estiver sendo pressionado ou o reprodutor estiver bagunçado, ele estará no estado de reinicialização. Se pressionado corretamente, está no estado de contagem progressiva. Existem muitas outras maneiras de usar um FSM neste jogo também!

Etapa 7: Controlando o Bloco de Processo de Exibição com Nível

Controlando Bloco de Processo de Exibição com Nível
Controlando Bloco de Processo de Exibição com Nível

Nível controla o bloco de processo de exibição. As variáveis na lista de sensibilidade são Level, Reset e Clk400. O display de 7 segmentos começa exibindo '1' para o primeiro nível. Ele conta até 7 cada vez que o usuário passa de um nível para mostrar ao usuário em que nível ele está. Depois que o usuário passa do nível 7, ele exibe “COOL” para significar que o jogador venceu o jogo. Este display “COOL” funciona com um clock de 400 Hz que chamamos de Clk400. Se Reiniciar for pressionado, a tela volta para “1”.

Etapa 8: Controlando a velocidade do LED com o nível

Controlando a velocidade do LED com o nível
Controlando a velocidade do LED com o nível

Finalmente, o nível controla a velocidade dos LEDs. O nível é o único sinal na lista de sensibilidade. D1 é o sinal que vai para o processo Clock Divider para obter newclk. Cada vez que o Nível é alterado, ou o estado muda, o processo bloqueia "Velocidade". Este processo determina o valor de D1. Existem 8 valores definidos de D1 que escolhemos com base na rapidez com que queríamos que cada nível fosse executado. D1 fica menor a cada vez que o nível aumenta para que o newclk seja executado mais rápido.

Etapa 9: Montagem de Hardware

Montagem de Hardware
Montagem de Hardware

Conectamos a placa de ensaio ao Basys3 com um dos conectores pmod. Seis das portas pmod foram usadas para conectar um conector macho a macho, um para aterramento e os outros cinco para os 5 LEDs. Também colocamos um resistor para cada LED. Esses resistores são de 220Ω e evitam que os LEDs entrem em curto-circuito e queimem. Embora cada LED tenha alguma resistência, a resistência não é suficiente para impedir a tensão da fonte.

Etapa 10: Divirta-se

Este jogo é muito fácil de jogar. O jogador começa no switch 1 da extrema direita do tabuleiro, V17. Eles devem girar a chave para o alto quando o LED do meio estiver aceso. Eles então movem um botão para a esquerda e fazem a mesma coisa! Se o jogador chegar ao fim, ele vai parar na sétima chave, W14. Se eles vencerem o jogo, terão uma exibição de final muito divertida!

Algo a se notar é que, ao criar este jogo, as velocidades dependem totalmente de você! Se as velocidades que escolhemos forem muito lentas, fique à vontade para aumentá-las e torná-las ainda mais desafiadoras! Também não há um número definido de níveis. Se você quiser que ele tenha ainda mais níveis, há modificações que devem ser feitas no FSM e nos blocos de processo determinados por Nível, mas essas alterações são muito simples.

Também optamos por usar interruptores na placa como a entrada do usuário, mas isso também é possível com um botão na placa Basys3; o botão eliminará a necessidade de redefinir os interruptores toda vez que o usuário reiniciar. Inicialmente, usamos um botão, no entanto, isso causou erros na definição do nível porque ele pularia vários níveis se duas bordas ascendentes do PushClk fossem pressionadas quando o botão estivesse sendo pressionado.

Abaixo está um vídeo demonstrando como jogar, passando pelos primeiros 4 níveis e a exibição final final.

O arquivo principal deste projeto está incluído abaixo.

Fontes

Manual de referência Basys3

Inspiração para o projeto - jogo Arduino Stop It

Recomendado: