Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
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
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
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
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”.