Índice:

Jogo de asteróides FPGA: 7 etapas (com imagens)
Jogo de asteróides FPGA: 7 etapas (com imagens)

Vídeo: Jogo de asteróides FPGA: 7 etapas (com imagens)

Vídeo: Jogo de asteróides FPGA: 7 etapas (com imagens)
Vídeo: Como utilizar o ChatGPT no desenvolvimento de jogos (Construindo o jogo Asteróides na Unity)-Aula 02 2024, Novembro
Anonim
FPGA Asteroid Game
FPGA Asteroid Game

Para o nosso projeto final CPE 133, decidimos criar um jogo de asteróides em nosso FPGA usando dois botões e uma tela de 7 segmentos. O jogo funciona de forma que um asteróide nasce em uma das três fileiras selecionadas aleatoriamente e se lança em direção à nave do outro lado do display de 7 segmentos. Os botões superior e inferior podem ser usados para mover sua nave para fora do caminho do asteróide. Se não o fizer, o visor mostra ‘BAnG’ por um momento e, em seguida, reinicia rapidamente o jogo para que o usuário possa tentar novamente. A seguir, uma breve descrição de como o projeto foi feito para que qualquer usuário possa replicar ou aprimorar nosso design.

Etapa 1: Visão geral

Visão geral
Visão geral
Visão geral
Visão geral

O projeto consiste em grande parte em máquinas de estado finito (FSMs), que usam lógica para transferir o FPGA entre estados que armazenam e exibem diferentes valores de posição de navio e rocha. Os dois módulos principais são os FSMs do jogo para o rock and ship, e o decodificador FSM de display binário para 7 segmentos, que são integrados usando um modelo estrutural muito simples em VHDL.

FSMs foram criados para a posição do navio, a posição da rocha e para o decodificador de 7 segmentos. O objetivo do FSM do navio é para que o navio possa se mover para a posição correta quando o jogador pressiona um botão para cima ou para baixo. O FSM é necessário porque ele precisa se lembrar em qual posição estava por último para mover para a posição correta.

O objetivo do FSM da rocha é mover a rocha para a posição correta com base em qual linha ela está e a última posição nessa linha. Além disso, ele rastreia a posição do módulo que irá exibi-lo e pseudo-aleatoriamente escolhe uma nova linha para aparecer a seguir.

O FSM para o decodificador de exibição de 7 segmentos foi usado não apenas para exibir o navio e a rocha, mas também para exibir “BAnG” quando a posição do navio e a posição da rocha são iguais.

Etapa 2: Materiais

Os materiais utilizados no projeto foram:

  • Basys3 Development Board da Digilent, Inc.
  • Suíte Vivado Design
  • sseg_dec.vhd (Este arquivo foi fornecido para nós no Polylearn e foi escrito por Bryan Mealy)
  • Clk_div.vhd (Este arquivo foi fornecido para nós no Polylearn e foi escrito por Bryan Mealy)
  • Três máquinas de estado finito (FSMs)

Etapa 3: Fazendo o jogo

Fazendo o jogo
Fazendo o jogo
Fazendo o jogo
Fazendo o jogo
Fazendo o jogo
Fazendo o jogo
Fazendo o jogo
Fazendo o jogo

O módulo do jogo foi criado usando modelagem comportamental para descrever os estados do navio e da rocha para seus respectivos FSMs. A vantagem disso é que é muito mais fácil modelar o circuito comportamentalmente, descrevendo o que ele faz, em vez de descobrir todos os componentes necessários para projetar o hardware.

Os estados da rocha foram feitos usando um gerador de números pseudo-aleatórios para a primeira posição da rocha. Para fazer isso, demos ao gerador seu próprio relógio, que era extremamente rápido em relação à velocidade do jogo. Em cada borda ascendente, um número de três bits é incrementado e todos os seus valores correspondem a um dos três estados iniciais do navio. Portanto, três valores correspondem à posição 3 (canto superior direito), três correspondem à posição 7 (centro) e dois correspondem à posição 11 (canto inferior direito).

Uma vez que a geração aleatória ocorreu e o asteróide recebeu um estado inicial, ele flui horizontalmente em direção à nave sem interrupção.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

O relógio usado para a próxima lógica de estado da rocha controla a velocidade do jogo; descobrimos por tentativa e erro que 9999999 é um bom valor para sua contagem máxima.

A lógica do navio funciona inicializando na posição central (posição 4) no lado esquerdo. Se o botão superior ou o botão inferior forem pressionados, o navio se moverá para cima e para baixo para as posições 0 e 11 correspondentes ao botão que foi pressionado.

Para que o movimento da nave seja bom para o usuário, não tornamos seu movimento assíncrono. Usamos um relógio para suas mudanças de estado e usamos uma contagem máxima de 5555555.

Etapa 4: Exibindo o resultado

O decodificador binário para 7 segmentos leva as variáveis de posição de 4 bits para a nave e o asteróide e exibe a imagem apropriada (a nave e rocha ou a mensagem “BAnG”).

Ele faz isso verificando primeiro se os dois são iguais e, em seguida, exibindo a mensagem “BAnG” se a verificação retornar verdadeira.

Se não retornar verdadeiro, o decodificador exibirá a nave e a rocha alternando entre eles em uma frequência de clock muito alta e enganando o olho para vê-los como se estivessem sendo exibidos ao mesmo tempo.

Etapa 5: juntando tudo

Juntando tudo
Juntando tudo

Incluímos o FSM do navio e do rock em um grande FSM que conectamos ao FSM de exibição. As entradas para o jogo são o botão para cima e o botão para baixo na placa BASYS3 e o relógio do sistema. As saídas são os vetores de segmento e ânodo de exibição de sete segmentos.

Essas entradas e saídas serão vistas no arquivo de restrições onde são mapeadas as portas.

Etapa 6: Modificações futuras

No futuro, adicionar mais funcionalidade de movimento de navio ao projeto seria uma melhoria. Isso pode ser feito simplesmente fornecendo mais 2 entradas de botão e permitindo que a nave assuma posições (estados) diferentes de 0, 4 e 8. Outra modificação possível poderia ser controlar o tempo do próximo estado do asteróide para que ele comece lentamente e aumente a velocidade em 1.5x toda vez que ele erra o navio até que seja atingido, onde ele reiniciaria e ficaria lento novamente. Isso aumentaria a dificuldade do jogo e o tornaria mais divertido para o usuário se fosse implementado, e poderia ser feito criando uma variável para a contagem máxima do próximo relógio de estado da rocha, multiplicando essa variável por 1,5 toda vez que o asteróide não acertar, e reconfigurando-o para seu valor inicial toda vez que a pedra acertar.

Etapa 7: Conclusão

Este projeto nos ajudou a entender melhor as máquinas de estado finito, relógios e exibições interativas nos visores de sete segmentos.

O mais importante sobre as máquinas de estado finito é que é importante saber (lembrar) em que estado você está atualmente para passar para o próximo estado desejado. Ironicamente, um bom conselho de vida; você deve saber onde está para saber para onde está indo.

Ao manipular diferentes instâncias de relógios, fomos capazes de gerar números aleatoriamente, mover a pedra para a próxima posição e gerenciar a exibição do navio, da pedra e da mensagem de fim de jogo.

Aprendemos que mais de um ânodo não pode ser exibido ao mesmo tempo. O módulo que nos foi dado aproveitou que o olho humano só consegue ver a diferença até uma determinada frequência. Portanto, foi escolhida uma frequência mais alta de comutação de ânodos. O navio e a rocha vistos ao mesmo tempo são, na verdade, uma alusão, já que cada um é exibido separadamente, mas muito rapidamente. Esse conceito foi aplicado para exibir o movimento do navio, a rocha e a mensagem “BAnG”.

Recomendado: