ic-logo.gif (1448 bytes)

MC613 - Laboratório de Circuitos  Digitais

Propostas de Temas para Projeto

unicamp-logo.gif (1666 bytes)

 

 

 


 

voltar

 

Lista de sugestões de projetos finais para MC613 

 

A lista seguinte possui diversas sugestões para os projetos finais. As sugestões devem ser estendidas para uma sugestão mais completa e formal. A sugestão mais completa deve ser enviada para o seu professor COM CÓPIA PARA O(s) MONITOR(es). Observe as regras para envio de emails para evitar que seu email seja classificado como spam. A sugestão deve estar em PDF e deve acompanhar a fonte (em texto puro ou OpenOffice; seu professor deve passar recomendações específicas para sua turma).  

 

Cada projeto pode ser alocado somente para UM grupo. A ordem de chegada das propostas será o critério de desempate caso mais de um grupo solicite o mesmo projeto.    

 

Observações: 

 

 

1- Pong 

Clássico jogo onde os jogadores controlam um PAD com movimento vertical, um em cada extremo da tela (direita e esquerda). Um bola é rebatida pelos PADs e marca ponto quem conseguir acertar a bola na extremidade adversária. O ângulo de rebatida depende do ângulo de chegada da bola no PAD e da posição do PAD utilizada para rebater a bola. Ganha o primeiro adversário a atingir 7 pontos. 

 

2- Snakes 

Clássico jogo da "cobra". O jogador controla uma cobra que anda sem parar pelo tabuleiro através de dois comandos: virar para a direita e virar para a esquerda. Aleatoriamente aparecem maçãs na tela. Ao passar por uma maçã, uma nova maçã é posicionada aleatoriamente (para manter o número fixo de maçãs) e a cobra cresce uma unidade. O jogo acaba quando a cobra tocar uma das bordas do tabuleiro. A pontuação é calculada com base no número de maçãs comidas, o tempo que foi gasto e a velocidade da cobra (que pode ser fixa no início ou alterável de acordo com o número de maçãs). 

 

3- Boliche 

Contador automático de placar de boliche. Pode-se ter de um a seis jogadores, com jogadas alternadas. Na sua jogada, o jogador entra com os pinos derrubados através de dez dip-switches e confirma com o pressionando o push-button. O contador atualiza o placar automaticamente e faz a contagem de pontos de acordo com as regras. Ao detectar um strike, os LEDs do display circulam por inteiro (segmentos a-b-c-d-e-f) e ao detectar um spare, parcialmente (segmentos a-b-g-f), por dois segundos. O contador deve indicar de qual jogador é a vez e qual das duas jogadas ele está jogando, além de qual turno o jogo está (de um a dez). Ao final o contador mostra a pontuação em ordem decrescente, do vencedor ao último jogador. 

 

4- Controlador de Elevador 

O controlador de elevador pode controlar um elevador para um prédio de exatamente oito andares. Cada andar possui botões de chamada independentes para subida e descida, indicado por dois dip-switches cada. O controlador deve mostrar o andar corrente do elevador, o estado do motor (subindo, descendo ou parado), os andares esperando para serem atendidos (LEDs) e possuir um sensor de abertura de porta (chave que enquanto acionada não permite que o elevador ande). A implementação deve ser modular para permitir que outros controladores sejam ligados entre si e possam coordenar o funcionamento. 

Teclado Musical 

O teclado musical simula o comportamento de um instrumento, tocando uma nota para cada tecla pressionada no mesmo. O projeto deve suportar pelo menos duas oitavas, sustentar a nota enquanto a tecla estiver pressionada e permitir ao menos duas vozes (duas teclas pressionadas ao mesmo tempo). É necessário um hardware específico (buzzer) que será fornecido pelo professor. 

 

5- Traçador de retângulos 

Utilize o mouse e o monitor para traçar retângulos na tela. O usuário clica com o botão em um dos cantos e arrasta até formar o retângulo desejado. Ao clicar novamente, o mesmo é fixado na tela indefinidamente, sobrescrevendo outros retângulos que por ventura estejam na tela (somente as áreas sobrepostas). Outra opção é manter apenas um triângulo na tela a cada momento, mas desta forma é exigido um tracejado indicando a posição do novo triângulo enquanto se movimenta o mouse. Em ambos os projetos a tela deverá ser renderizada on-the-fly. 

 

6- BreakOut 

O jogo consiste de um PAD horizontal inferior controlado pelo jogador (direita e esquerda). Uma bola é rebatida pelo PAD e atinge tijolos posicionados na parte superior da tela. O ângulo de rebatida depende do ângulo de chegada da bola no PAD e da posição do PAD utilizada para rebater a bola. Cada tijolo atingido pela bola some da tela e é contabilizado como ponto. O jogador não pode deixar a bola escapar para a borda horizontal inferior ou perderá uma vida. O jogo termina quando o jogador perder as três vidas disponíveis e caso o jogador destrua todos os triângulos, o jogo recomeça com velocidade dobrada. 

 

7- Space Invaders 

Jogo onde o jogador controla uma nave com movimento horizontal inferior com possibilidade de atirar. As naves inimigas movimentam-se a partir da borda superior, com movimentos alternados horizontais e verticais. O jogo termina se as naves inimigas conseguirem chegar ao solo (nível da nave do jogador). Cada tiro que acerte uma nave inimiga elimina-a do jogo. A pontuação é baseada no tempo gasto para eliminar todas as naves. 

 
8- Tetris 

Jogo clássico de tetris, com sete tipos de peças (tetraminos). A pontuação é o número de linhas eliminadas e o jogo só termina se as peças acumuladas atingirem o topo da pilha. O jogador pode rotacionar ou mover horizontalmente (direita e esquerda) as peças. 

 

9- Velha 

Clássico jogo da velha. O jogador utiliza o mouse para marcar sua opção no monitor. O jogo deve permitir escolher qual jogador começa e jogar contra outro ser humano em turnos ou contra uma IA, que obrigatoriamente deve ganhar sempre que possível (o jogo da velha é determinístico). 

 

 

10- Controlador de máquina de café 

Este controlador permite a entrada de uma opção entre várias (pelo menos três receitas diferentes, ex: café, capuccino e chocolate), cobrar corretamente, devolver o troco e disparar a preparação do café. A máquina aceita qualquer quantia de cédulas e moedas (até R$10,00) e devolve o troco somente em moedas, que devem estar disponíveis na máquina (a quantidade inicial pode ser pré-gravada na memória mas a quantidade correta deve ser mantida mesmo após o reset). A preparação envolve abrir o bico correspondente pelo tempo correto (ex. para preparar um café com leite de 300ml deve-se disparar os bicos de café e de leite durante 5s, se a vazão dos bicos for de 30ml/s). 

 

11- Campo minado 

Clássico jogo do windows. O objetivo do jogo é desativar todas as minas de um campo minado. Para tanto o jogador deverá encontrar todas as minas sem 'clicar' em nenhuma, ou seja, deverá descobrir todos os locais onde não há bomba. Locais já limpos indicam quantas bombas existem ao seu redor (1, 2, 3, 4). Uma mina é descoberta quando todos os espaços limpos ao seu redor são expostos. O jogo termina quando todas as minas são descobertas.  Para esse jogo será utilizado uma placa UP2 com mouse e tela.

 

12- Memória 

Jogo clássico de salão, em que cada jogador tenta identificar onde estão as duplas de cartas de baralho dispostas com a face para baixo em um quadrado. Cada acerto conta um ponto e a cada erro as cartas são 

escondidas novamente. A implementação na UP2 deve usar números coloridos (o número ou o fundo da célula) e mostrá-los no monitor. Alternativas a serem configuradas: número de cartas, número de jogadores, forma de representação (apenas número, apenas cor (8 combinações) ou número e cor). Mostrar pontuação e identificar jogador que deve jogar e o vencedor no final. 

 

13- Balístico 

O jogo consiste de um canhão com controle do ângulo de tiro (de 0 a 85°) e da velocidade da bala. O canhão fica disposto no canto inferior esquerdo do monitor. Há um obstáculo (muro) vertical no meio do monitor e o alvo fica no lado direito. Após cada tiro o alvo é mudado de local aleatoriamente (horizontal e vertical). Há um vento horizontal definido aleatoriamente antes de cada tiro e cujo valor é mostrado para o jogador calibrar o tiro. Mostrar contagem de acertos e erros. O movimento da bala deve ser o mais natural possível (velocidade e formato parabólico. Controles: canhão (ângulo e velocidade) em dipswitches e disparo em push button. Display no monitor. Opcional: uso do teclado para controle. 

 

14- Batalha naval 

Cada jogador tem uma placa, um monitor e um mouse. As placas devem se comunicar para sinalizar a posição do tiro e para responder resultado (água ou acerto). Os monitores devem mostrar a configuração inicial do jogador no lado esquerdo e o resultado dos tiros nos navios do adversário no lado direito. A configuração inicial pode ser carregada de um arquivo (mais fácil) ou pode ser carregada no início do jogo (mais complexo). 

 

15- Palitinho (porrinha) 

O jogo deve implementar o popular porrinha, onde cada pessoa pode apresentar na mão fechada (escondido) de 0 a 3 palitos e cada jogador chuta o número total de palitos em todas as mãos. Os chutes não podem ser repetidos. A ordem dos chutes (prioridade) circula entre os jogadores de jogada em jogada. Implementação: cada jogador tem uma placa, as placas se comunicam entre si. Além disso, cada jogador tem um monitor e mouse onde ele pode escolher quantos palitos quer jogar e também escolher (com o mouse) que chute ele fará. O sistema deve sinalizar no monitor quando é a vez do jogador chutar e deve desabilitar os chutes já feitos para evitar repetições. Deve mostrar também o placar geral. 

 

16- Gerador de Lissajous 

O objetivo é gerar no monitor as figuras de Lissajous  normalmente geradas em osciloscópio em que a variável x recebe um sinal periódico com freqüência fx (por exemplo senoidal, onda quadrada, dente de serra etc) e a variável y recebe outro sinal também periódico com freqüência fy. As freqüências fx e fy devem ser múltiplas de inteiros nx e ny. Por exemplo, para desenhar um formato parecido com um dígito 8 podemos definir nx=2 e ny=1. Implementação:  placa e monitor. Nos dipswitches, definir nx, ny e o tipo do sinal em x e em y. 

 

17- Gerador de fractal 

Fractais são formas geométricas em que há um módulo inicial e pequeno definido arbitrariamente e a imagem geral é construída a partir deste módulo de forma recursiva. O aluno deve procurar na web maiores informações e propor ao professor uma implementação. A  implementação deve permitir que se escolha a semente ou forma inicial. 

 

18- Genius 

Implementar o jogo Genius que era popular a algumas décadas atrás. Implementação: placa,  monitor e mouse. O sistema apresenta para o jogador o display típico do Genius (círculo com 4 quadrantes cada um com uma cor) e apresenta uma cor. O jogador pressiona a cor que foi mostrada. Em seguida o sistema apresenta a cor nº 1 seguida de outra gerada aleatoriamente. O jogador tenta reproduzir a seqüência. E assim por diante, até que o jogador erre a seqüência. 

 

19- Morse 

Este projeto consiste em implementar um decodificador de código morse. O usuário entra com uma mensagem em código morse através do push-button. A cada caractere entrado, o caracter correspondente é mostrado no monitor. O sistema deve ser robusto suficientemente para permitir que qualquer pessoa o opere sem confundir o traço com o ponto (não é permitido fixar o tamanho do pulso, por exemplo). 

 

20- Enduro 

Clássico jogo de corrida da plataforma ATARI (com algumas modificações). O jogo consiste de um carrinho com a posiçao fixa  no centro da tela . A pista se move simulando curvas e retas. Os possíveis comandos para o carrinho são: virar para a direita (o carro se inclina para a direita e a pista se move para a esquerda), virar para a esquerda, acelerar (a pista “passa” mais rápido) , frear (pista “passa” mais devagar). O jogador começa com uma pontuação Y, a cada batida o jogador perde um ponto. O jogo termina depois de X minutos (deve ser mostrado na tela o tempo atual de jogo).  

Bónus: implementar obstáculos na pista. Usar teclado. ?  

Exemplos de possíveis situações.  

        •        ||            ||   

        •        ||            ||

        •        ||   0=0    ||

        •        ||    |M|    || 

        •        ||   0=0    ||  

        •        ||            ||   

        •        ||            ||

        •        (reta) 

        •                   ||              ||   

        •                ||              ||

        •              ||  0=0     ||

        •            ||    |M|     || 

        •          ||    0=0     ||  

        •        ||                ||   

        •        ||                ||

        •        (curva a direita) 

  ||               ||    

  ||               || 

  ||       0=0   || 

  ||       |M|    ||  

  ||      0=0    ||   

  ||                ||    

  ||                || 

      (virando para a direita em uma reta) 

 

21- Truco 

Clássico jogo de cartas. O jogo será disputado por dois jogadores (utilizar duas placas), cada um com apenas uma tela. A tela de cada jogador deve mostrar suas cartas atuais, assim como a “vira”. Deve ser possível a visualização dos pontos atuais da rodada e o número de rodadas ganhas por cada jogador. Implementar a opção de trucar (3, 6, 9, 12 pontos).  Usar teclados. 

 

22- Boxe 

Simulação de uma partida de Boxe em 2D (vista superior). O jogo consiste em dois lutadores em um ringue. Para tal implementação será necessário duas placas e uma tela. Cada lutador pode executar os seguintes movimentos: andar para frente, para trás, esquivar para a direita, para a esquerdar, rotacionar 90 graus para direita, rotacionar 90 graus para esquerda e golpear. A cada golpe desferido com sucesso o jogador ganha um ponto. O jogo termina depois de X minutos (deve ser mostrado na tela o tempo atual de jogo), ganha quem fez mais pontos. 

Exemplos de possíveis situações.  

      ====================== 

        •        ||               ||   

        •        ||               ||

        •        ||  xox        ||

        •        ||               || 

        •        ||               ||  

        •        ||  xox        ||   

        •        ||               ||

      ====================== ?  

      ====================== 

        •        ||               ||   

        •        ||               ||

        •        ||               ||

        •        ||   ox        || 

        •        ||  I            ||  

        •        ||  xox        ||   

        •        ||               ||

      ====================== 

      (jogador golpeando o adversário)   

 

23- Futebol de Robôs 

Simulação de uma partida de futebol entre dois robôs em 2D (vista superior). Para tal implementação será necessário duas placas e uma tela. Cada lutador pode executar os seguintes movimentos: andar para frente, para trás, para a direita, para a esquerdar, rotacionar 90 graus para direita, 90 graus para esquerda e chutar. O jogo termina depois de X minutos (deve ser mostrado na tela o tempo atual de jogo), ganha quem fez mais gols. ?  

Exemplos de possíveis situações.  

      ====================== 

        •        ||                  ||   

        •        ||                  ||

        •        ||                  ||

        •              >  o < 

        •        ||                  ||  

        •        ||                  ||   

        •        ||                  ||

      =====================  

      ====================== 

        •        ||                   ||   

        •        ||                   ||

        •        ||                   ||

        •                  >  - - - o

        •        ||                   ||  

        •        ||   ^              ||   

        •        ||                   ||

      ====================== 

      (Gol)  ?  

 

 

24- Type to Shoot (Datilografia)

O objetivo deste jogo é testar a habilidade do jogador em digitar rapida e corretamente as teclas do teclado. A tela principal do jogo deve mostrar letras aleatórias caindo, com quantidade e velocidade de queda crescentes com a fase do jogo. O jogador deve pressionar as teclas destruindo a imagem da letra correspondente antes que a letra atinja o "chão". Para cada fase, o jogo deve contabilizar e mostrar o número total de acertos e o número total de erros. Opcionalmente, pode mostrar o número de teclas certas por unidade de tempo (carac/seg). O aluno deve propor um critério razoável para que uma fase seja concluída (por exemplo, número total de letras ou tempo transcorrido), assim como o critério de sucesso (passar para a próxima fase) ou fracasso (perdeu o jogo). Os critérios para fase podem ser mútiplos, por exemplo, critério para fracasso pode ser tempo esgotado com acertos abaixo de determinado limite, ou pode ser número de erros acima de determinado limite. É importante penalizar os erros para evitar que o jogador fique pressionando várias teclas ao acaso. A implementação do jogo pode ser feita apenas com o teclado e o monitor. Opcionalmente, podem ser acrescentados efeitos sonoros ao jogo. O uso de letras isoladas, palavras, maiúsculas, números ou outros caracteres especiais fica a critério da implementação do aluno. Ver implementação em flash em http://www.phoboslab.org/ztype/

 

25- Corrida de vetores (Vector Racing)

Este jogo simula a corrida de varios carros em uma pista sobre um campo quadriculado. Os jogadores jogam cada um por vez, escolhendo a aceleração que desejam aplicar ao seu carro (intensidade 0 ou 1 grid e 8 possibilidades de sentido/direção, acima/abaixo/esquerd/direita/45 graus).  O jogo pode ser jogado com papel quadriculado e canetas coloridas e era muito popular nas escolas de Engenharia no século passado. A implementação para este curso pode basear-se nas descrições nos sites abaixo (o último link é uma versão online):

 

26- Gerador de FFT (Fast Fourier Transform) em tempo real

Gerar a transformada rápida de Fourier (FFT) de sinal análogico da entrada de áudio. Mostrar o resultado no monitor como um analisador de espectro, em tempo real. Em um primeiro momento, o projeto pode ser feito em duas etapas ou por duas equipes: uma faz a FFT e outra o processamento gráfico.

 

27- Conversor para VGA com imagem em alta resolução baseada em sprites


Gerado de sinais para a VGA em alta resolução, sem uso exaustivo de memória de video, como o VGA_CON. O conversor pode ter 2 layers. O layer de fundo, ou estático, é gerado sobre uma matriz de espaços retangulares, onde cada retângulo tem área e aspecto de sprites armazenados em banco de sprites (podem ser, por exemplo, caracteres, ou módulos de figuras). As dimensões da matriz devem ser parametrizáveis. O conversor deve ler consultar o banco de sprites para cada posição XY do feixe do monitor e enviar para ele os bits adequados em tempo real e de acordo com a sincronização do monitor. Um segundo layer, de frente, é composto também por um ou dois sprites que podem ser mover de acordo com uma posição XY especificada por dispositivo externo (mouse ou teclado, ou botões da placa) ou interno (variáveis internas do programa, contadores, etc). Este conversor poderia ser usado pela maioria dos demais projetos, com a vantagem de ter resolução melhor do que o obtido pelo VGA_CON sem usar exaustivamente a memória interna da FPGA.

 

28- Jogo 2048


Jogo popular na web: 2048. Ver exemplos aqui ou aqui. Como possíveis sofisticações na implementação: (a) implementar animação ao mover as peças; (b) implementar "undo" de 1 ou mais jogadas; (c) implementar gráfico com resolução alta e código de cores; (d) implementar cálculo/display de score.

29- Ant Brain


Veja descrição aqui e aqui. Consiste no projeto do "cérebro" de uma  formiga, na forma de uma FSM, de modo que ela consiga encontrar a saída de um labirinto inserido arbitrariamente pelo usuário.
 

  (modificado em 07/jun/2016