Taula de continguts:

Joc Mastermind en VHDL: 3 passos
Joc Mastermind en VHDL: 3 passos

Vídeo: Joc Mastermind en VHDL: 3 passos

Vídeo: Joc Mastermind en VHDL: 3 passos
Vídeo: BEST DEFENCE ACADEMY IN DEHRADUN | NDA FOUNDATION COURSE AFTER 10TH | NDA COACHING #shorts #nda #ssb 2024, Desembre
Anonim
Joc Mastermind en VHDL
Joc Mastermind en VHDL
Joc Mastermind en VHDL
Joc Mastermind en VHDL

Per al nostre projecte, vam crear el joc "Mastermind" en VHDL per jugar al tauler Basys3. Mastermind és un joc de trencament de codi que tradicionalment es juga amb clavilles i un tauler de joc. El jugador 1 col·loca clavilles de colors variats en una fila de 4, amagades del jugador dos. Aleshores, el jugador dos té un nombre x d’endevinalles que col·loquen clavilles al tauler d’una fila visible per al jugador primer. Després de cada conjectura, es informa al jugador dos de 2 nombres: quantes clavilles tenen el color correcte i quantes clavilles estan en la posició correcta de la fila. Utilitzant aquestes pistes, el jugador dos ha d’endevinar la seqüència correcta de pins que el jugador ha col·locat en el número assignat.

En la nostra implementació, el joc és un sol jugador. El programa genera una combinació aleatòria de clavilles i el jugador ha d’utilitzar el tauler Basys3 per endevinar la seqüència correcta. Hi ha quatre "colors" representats per valors binaris. La pantalla de 7 segments mostra tres valors: girs restants, nombre de pins a la posició correcta i nombre de pins que tenen el color correcte a la posició incorrecta (aquests valors comencen a 9, 0 i 0). El jugador utilitza els commutadors del tauler per seleccionar els valors binaris per a la seva suposició i gira un altre commutador per enviar la suposició. Si són correctes, el joc finalitza i la pantalla de 7 segments mostra "GG". Si no, el comptador de girs disminueix 1 i el jugador rep comentaris basats en el nombre de pins que coincideixen amb el color o la posició dels pins de la combinació. Si el jugador es queda sense torns sense endevinar correctament, la pantalla mostra "GO" (que representa el joc acabat). El jugador també pot girar el commutador de reinici per tornar a començar en qualsevol moment.

Pas 1: materials

Materials
Materials
Materials
Materials
Materials
Materials

Com que tot el joc es pot jugar al propi tauler, els únics materials necessaris són el tauler Basys3, un cable micro USB per connectar-lo al tauler i un ordinador / portàtil que es pot utilitzar per codificar.

Pas 2: el codi

El codi
El codi
El codi
El codi

Perquè aquest joc funcioni a FPGA, la forma més senzilla d’escriure-ho seria crear una màquina d’estats. Disposar d’una màquina d’estats permet l’experiència interactiva i seqüencial necessària perquè el joc funcioni realment. Perquè tot funcioni sense problemes, la màquina d'estats es basarà en el senyal de rellotge intern de l'FPGA, garantint que tot estigui sincronitzat. El mòdul principal és una màquina d'estats amb quatre estats; Estat inicial (inicial), estat SubmitAnswer (SubAns), estat de visualització (Dis) i estat CheckEndGame (CheckEnd). Juntament amb la màquina d'estats, el mòdul principal té dos submòduls, una pantalla de set segments de 4 dígits (que té el seu propi submòdul ClkDivider) i el generador de números aleatoris (en realitat un generador de números psuedo-aleatoris). També hi ha un bloc de procés bàsic perquè els LED situats a sobre de cada commutador s’encenguin quan s’encenguin perquè les persones vegin més fàcilment el que introdueixen. Es pot veure una visió general bàsica del codi al mapa mental de la imatge.

El primer component a tenir en compte és el generador de números aleatoris (randomgen). Com que tècnicament no és possible obtenir nombres aleatoris reals generats a partir de maquinari, la solució més senzilla era que el gen aleatori fos realment un registre de desplaçament de retroalimentació lineal (LFSR). El LFSR té una entrada de clk i una sortida “a” (un número de 12 bits). Cada cicle de rellotge es genera un nou número de 12 bits a partir de "000000000001", que finalment passa per totes les combinacions de 12 bits d'1 i 0 abans de repetir-se. La sortida "a" es dóna cada cicle de rellotge, de manera que es troba en funcionament continu. El clk s’assigna al Clk des del mòdul principal, i “a” s’assigna al senyal RandNum del mòdul principal.

El segon submòdul és la pantalla de set segments de 4 dígits. Aquesta és una manera bastant senzilla de mostrar una pantalla de set segments de 4 dígits. La visualització es configura al Clk des del mòdul principal, però aquest submòdul té el seu propi submòdul d’un ClkDivider. El ClkDivider (definit a 1298 Hz) s'utilitza per accelerar el rellotge del segment de set, de manera que tots els dígits semblen estar activats al mateix temps (ja que només es pot activar un dígit alhora). La variable "dígit" s'utilitza per circular pels punts de la pantalla i, amb cada dígit, apareixen les condicions d'una pantalla bàsica d'entrada de 4 bits, amb opcions per mostrar els dígits del 0 al 9 i també res. El dígit esquerre més llunyà de la pantalla no es defineix perquè no s'utilitza en aquest joc.

El mòdul principal consisteix en la màquina d'estats. Els quatre estats del procés són Initial, SubAns, Dis i CheckEnd. Quan es troba a l’estat inicial, si el botó SubmitBtn (commutador que s’utilitza per enviar la resposta per comprovar-lo) està configurat a ‘1’, la màquina es desplaça a l’estat SubAns. Sempre que Rbtn (commutador que s’utilitza per restablir la màquina) s’estableix a ‘1’, la màquina torna a l’estat inicial. Quan es troba a l'estat SubAns, quan el SubmitBtn = '0' torna a passar a l'estat Dis. Quan es troba a l'estat Dis, si el compte enrere = 0 (gira a l'esquerra per endevinar cau a 0) o si el RSpotCount = 4 (és a dir, el jugador té tots els colors correctes als punts correctes), la màquina passa a l'estat CheckEnd. Si no es produeix cap d'aquests, llavors quan SubmitBtn = '1' torni a tornar a l'estat SubAns per permetre una altra conjectura. Quan es troba a l'estat CheckEnd, aquest és el final del joc i l'única sortida és colpejar el restabliment i tornar-lo a l'estat inicial. Això es pot visualitzar fàcilment al diagrama de la màquina d'estats. Comportamentalment, l'estat inicial inicialitza tot de nou a la posició inicial. El compte enrere (senyal que guarda quantes voltes deixa el jugador) es posa a 9, RSpotCount (senyal que guarda quants dels colors que heu endevinat al lloc correcte) es posa a 0, RColorCount (senyal que estalvia quants de els colors que heu endevinat són correctes, però en un punt incorrecte) s’estableix a 0 i el compte enrere petit (senyal que finalment s’assigna a compte enrere, que realment canvia cada torn en estats posteriors), s’estableix a 9. A més, a l’estat inicial el RandNum (el número generat aleatòriament) es divideix en quatre controls diferents (un per cada color de 3 bits) i es desa als senyals check1, check2, check3, check4. Amb aquestes comprovacions es compara realment la vostra suposició, de manera que, tot i que el LFSR sempre fa que RandNum canviï cada cicle, un cop deixeu l'estat inicial, les comprovacions es mantindran iguals, cosa que permetrà comparar la vostra resposta amb un valor guardat. Això també significa que cada vegada que es reinicia la màquina, el jugador té un nou valor per endevinar.

L'Estat SubmitAnswer (SubAns) canvia el compte enrere (senyal de "canvi") a "1". Això és necessari més endavant perquè el seguiment de torns funcioni. Després d'això, l'estat compara les entrades del reproductor dels commutadors amb les comprovacions realitzades a l'estat anterior. Els senyals rs1, rs2, rs3, rs4 i els senyals rc1, rc2, rc3, rc4 són tipus enters que, segons les sentències If, es defineixen a 1 o 0. El senyal rs és per al punt adequat i rc per al color adequat. Per exemple, si la suposició del jugador de color 1 és igual a la comprovació 1 del RandNum, llavors rs1 = 1, ja que això significa que el color adequat es troba al punt adequat. Si el color 1 no és igual a check1, però igual a un dels altres controls, llavors rc = 1. Això es fa per a cada color i cada comprovació.

L’estat de visualització (Dis) cerca primer l’activador del compte enrere. Si és «1», el compte enrere redueix 1 (de manera que al primer torn passa de 9 a 8, etc.). En cas contrari, el torn no canvia. Independentment d’aquesta habilitació, tots els valors rs de dalt es sumen i s’assignen al senyal RSpotCounter. També s’afegeixen tots els valors rc i s’assignen al RColorCounter. Finalment, a Countdown se li assigna el valor de smallcountdown. Els senyals RSpotCounter, RColorCounter i Countdown es converteixen en std_logic_vectors de 4 bits fora del procés i s’envien al submòdul de visualització de set segments a través d’un mapa de ports. D’aquesta manera, la pantalla mostra les coses correctes fins que no envieu una resposta nova.

L'estat CheckEnd és per si heu guanyat o perdut. Si heu guanyat (els 4 colors es troben al lloc adequat, també conegut com a RSpotCounter = 4), aleshores apareixerà “GG” (tècnicament 66) que mostra el set segment per mostrar que heu guanyat. Si heu perdut (el compte enrere ha arribat a 0), apareix a la pantalla "GO" (que es mostra tècnicament com a 60) per a Game Over. Amb qualsevol dels dos resultats, si premeu el commutador de reinici a l’activació, la màquina tornarà a l’estat inicial per tornar a jugar.

El codi font es pot trobar aquí.

Pas 3: Conclusió

La realització d’aquest projecte ens va ensenyar molt a construir circuits més complicats. El nostre disseny inicial no era una màquina d’estats finits. Ens va costar depurar i tornar a escriure el codi diverses vegades mitjançant diferents mètodes (inclòs un FSM). Segons el suggeriment de l’instructor, ens vam quedar amb l’enfocament FSM i vam poder acabar el joc. Vam aprendre que és molt més eficaç dissenyar el codi basat en el maquinari que amb un enfocament de programació tradicional. També vam afrontar diversos reptes relacionats amb la visualització de set segments. Aconseguir que es mostressin diversos números sense "fantasmes" va ser difícil i vam haver d'utilitzar un divisor de rellotge per aconseguir-ho. Si volguéssim desenvolupar aquest projecte, connectaríem els LED de colors al Basys3 perquè l'usuari pugui veure colors (com en el joc tradicional) en lloc de representacions numèriques de colors. En última instància, hem comprès millor el disseny de circuits complexos, les aplicacions de la vida real i els desafiaments d’utilitzar maquinari en lloc d’executar simulacions amb condicions perfectes.

Recomanat: