Tartalomjegyzék:

Mastermind játék VHDL -ben: 3 lépés
Mastermind játék VHDL -ben: 3 lépés

Videó: Mastermind játék VHDL -ben: 3 lépés

Videó: Mastermind játék VHDL -ben: 3 lépés
Videó: Mastermind 2018 - How To Play 2024, November
Anonim
Mastermind játék VHDL -ben
Mastermind játék VHDL -ben
Mastermind játék VHDL -ben
Mastermind játék VHDL -ben

Projektünkhöz létrehoztuk a „Mastermind” játékot VHDL -ben, amelyet a Basys3 táblán kell játszani. A Mastermind egy kódtörő játék, amelyet hagyományosan csapokkal és játéktáblával játszanak. Az első játékos válogatott színekből álló csapokat helyez el egy 4 -es sorban, elrejtve a második játékos elől. A második játékos ekkor „x” számú találgatást tesz, amelyeken az első játékos számára látható sorban csapokat helyez a táblára. Minden találgatás után a második játékos 2 számról kap tájékoztatást: hány csap a megfelelő színű, és hány csap a megfelelő pozícióban van a sorban. Ezekkel a nyomokkal a második játékosnak kell kitalálnia a megfelelő gombostű -sorrendet, amelyet az egyik játékos elhelyezett a kitalált számban.

A mi megvalósításunkban a játék egyjátékos. A program véletlenszerűen rögzíti a csapokat, és a játékosnak a Basys3 táblával kell kitalálnia a helyes sorrendet. Négy „szín” létezik, amelyeket bináris értékek képviselnek. A 7 szegmenses kijelző három értéket mutat: a hátralévő fordulatokat, a megfelelő pozícióban lévő csapok számát és a megfelelő színű csapok számát a rossz pozícióban (ezek az értékek 9, 0 és 0-tól kezdődnek). A játékos a táblán található kapcsolók segítségével választja ki a bináris értékeit a találgatásához, és egy másik kapcsolóval elfordítja a találgatást. Ha helyesek, a játék véget ér, és a 7 szegmenses kijelzőn a „GG” felirat látható. Ha nem, akkor a fordulószámláló 1 -gyel csökken, és a játékos visszajelzést kap annak alapján, hogy hány tipp felel meg a tippjeiknek a kombinációban lévő csapok színéhez vagy helyzetéhez. Ha a játékos kifogy a kanyarokból anélkül, hogy helyesen tippelne, a kijelzőn a „GO” felirat látható (a játék vége). A lejátszó a visszaállító kapcsolót is elfordíthatja, hogy bármikor újrakezdhesse.

1. lépés: Anyagok

Anyagok
Anyagok
Anyagok
Anyagok
Anyagok
Anyagok

Mivel az egész játék maga a táblán játszható, az egyetlen szükséges anyag a Basys3 tábla, a tábla csatlakoztatásához szükséges mikro USB kábel, valamint egy számítógép/laptop, amellyel kódolni lehet!

2. lépés: A kód

A kód
A kód
A kód
A kód

Annak érdekében, hogy ez a játék működjön az FPGA -n, a legegyszerűbb módja annak írásához az állapotgép létrehozása lenne. Az állapotgép lehetővé teszi a játék tényleges működéséhez szükséges szekvenciális és interaktív élményt. Annak érdekében, hogy minden zökkenőmentesen működjön, az állapotgép az FPGA belső órajelén alapul, biztosítva, hogy minden szinkronban legyen. A fő modul egy négyállapotú állapotgép; Kezdeti állapot (kezdeti), SubmitAnswer állapot (SubAns), Megjelenítési állapot (Dis) és a CheckEndGame állapot (CheckEnd). Az állapotgéppel együtt a fő modulnak két almodulja van, egy 4 számjegyű Hét szegmenses kijelző (amely rendelkezik saját ClkDivider almoduljával) és a Véletlenszám-generátor (valójában egy psuedo-random számgenerátor). Létezik egy alapvető folyamatblokk is, hogy a kapcsoló feletti LED -ek bekapcsoláskor bekapcsoljanak, hogy az emberek könnyebben lássák, mit írnak be. A kód alapvető áttekintése a képen látható gondolattérképen látható.

Az első komponens, amelyet meg kell vizsgálni, a véletlenszám -generátor (randomgen). Mivel technikailag nem lehetséges hardverből előállított valódi véletlen számokat lekérni, a legegyszerűbb megoldás az volt, hogy a randomgen valójában egy lineáris visszacsatolásos eltolásregiszter (LFSR). Az LFSR bemenete clk és kimenete „a” (12 bites szám). Minden órajel ciklusban egy új 12 bites szám jön létre a „000000000001” kezdetétől, amely végül végigmegy az 1-es és a 0-as 12 bites összes kombinációján, mielőtt megismétli önmagát. Az „a” kimenet minden órajelciklusban meg van adva, tehát folyamatosan fut. A clk a főmodulból a Clk -hez van hozzárendelve, az „a” pedig a RandNum jelhez a főmodulban.

A második almodul a 4 számjegyű, hét szegmenses kijelző. Ez egy meglehetősen egyszerű módja a 4 számjegyű, hét szegmenses kijelző bemutatásának. A kijelző a fő modul Clk -jára van állítva, ennek az almodulnak azonban van egy saját ClkDivider almodulja. A ClkDivider (1298 Hz -re állítva) arra szolgál, hogy felgyorsítsa a Hét szegmens óráját úgy, hogy minden számjegy egyszerre jelenjen meg (mivel egyszerre csak egy számjegy lehet bekapcsolva). A „számjegy” változó a képernyő foltjainak körbejárására szolgál, és minden számjegyhez hozzátartozik az alap 4 bites bemeneti kijelző feltételei, a 0 és 9 közötti számjegyek megjelenítésével, és semmi sem. A kijelző legtávolabbi bal számjegye semmihez nincs beállítva, mivel ebben a játékban nem használják.

A fő modul az állapotgépből áll. A folyamat négy állapota: Initial, SubAns, Dis és CheckEnd. Kezdeti állapotban, ha a SubmitBtn (a válasz ellenőrzésre való elküldésére szolgáló kapcsoló) értéke 1, akkor a gép a SubAns állapotba kerül. Bármikor az Rbtn (a gép alaphelyzetbe állítására szolgáló kapcsoló) beállítása „1”, majd a gép visszatér a kezdeti állapotba. Amikor a SubAns állapotban van, amikor a SubmitBtn = '0' ismét a Dis állapotba lép. Ha Dis állapotban van, ha a visszaszámlálás = 0 (A balra kanyarodások 0 -ra esnek), vagy ha az RSpotCount = 4 (azaz a játékos, mint a megfelelő színek a megfelelő helyeken), a gép a CheckEnd állapotba kerül. Ha ezek egyike sem fordul elő, akkor amikor a SubmitBtn = '1' ismét visszatér a SubAns állapotba, és lehetővé teszi egy újabb találgatást. Amikor a CheckEnd állapotban van, ez a játék vége, és az egyetlen kiút az, ha megnyomja a visszaállítást, és visszaküldi a kezdeti állapotba. Ez könnyen megtekinthető az állapotgép diagramon. Viselkedésileg a kezdeti állapot mindent visszaállít a kiindulási helyzetbe. A visszaszámlálás (jel, amely megmenti, hogy hány forduló van hátra a játékosból) 9 -re van állítva, az RSpotCount (jel, amely menti, hogy hány szín van a megfelelő helyen) értéke 0, RColorCount (jel, amely mennyi a színek, amiket sejtettél, hogy igazak, de rossz helyen vannak) 0 -ra van állítva, és a kis visszaszámlálás (a jel, amely végül visszaszámláláshoz van leképezve, amely a későbbi állapotokban minden fordulatot ténylegesen megváltoztat) 9 -re van állítva. A kezdeti állapotban a RandNum (pszuedo-random generált szám) négy különböző ellenőrzésre van felosztva (egy minden 3 bites színre), és a check1, check2, check3, check4 jelzésekbe kerül mentésre. Ezeket az ellenőrzéseket hasonlítja össze a feltételezésével, így bár az LFSR mindig a RandNum változását okozza minden ciklusban, a kezdeti állapotból való kilépés után az ellenőrzések változatlanok maradnak, lehetővé téve, hogy egy mentett érték összehasonlítsa a választ. Ez azt is jelenti, hogy amikor a gép alaphelyzetbe áll, a lejátszónak új értéket kell kitalálnia.

A SubmitAnswer State (SubAns) a visszaszámlálást engedélyezőt (jelzés „change”) „1” -re változtatja. Erre később szükség van, hogy a fordulókövetés működjön. Ezt követően az állapot összehasonlítja a lejátszók bemeneteit a kapcsolókról a fenti állapotban végzett ellenőrzésekkel. Az rs1, rs2, rs3, rs4 és az rc1, rc2, rc3, rc4 jelek egész számok, amelyek az If utasításoktól függően 1 vagy 0 értékre vannak állítva. Például, ha az 1. színű játékos tippje megegyezik a RandNum jelölőnégyzetével, akkor rs1 = 1, mivel ez azt jelenti, hogy a megfelelő szín a megfelelő helyen van. Ha az 1.

A Megjelenítési állapot (Dis) először a visszaszámlálást engedélyezőt keresi. Ha ez az „1”, akkor a kis visszaszámlálás 1 -gyel csökken (tehát az első körben 9 -ről 8 -ra stb.). Ellenkező esetben a fordulat nem változik. Függetlenül attól, hogy engedélyezve van -e, az összes rs érték felülről összeadódik, és hozzá van rendelve az RSpotCounter jelhez. Ezenkívül az összes rc értéket hozzáadja és hozzárendeli az RColorCounterhez. Végül a visszaszámláláshoz a kis visszaszámlálás értéke van hozzárendelve. Az RSpotCounter, az RColorCounter és a Countdown jeleket a folyamaton kívül 4 bites std_logic_vector-okká alakítja át, és a porttérképen keresztül a Hét szegmenses megjelenítési almodulba küldi. Így a kijelzőn a megfelelő dolgok jelennek meg, amíg új választ nem küld.

A CheckEnd állapot arra vonatkozik, hogy nyertél vagy vesztettél. Ha nyertél (mind a 4 szín a megfelelő helyen van, más néven RSpotCounter = 4), akkor a „GG” (technikailag 66) jelenik meg a Hét szegmensben annak jelzésére, hogy nyertél. Ha elveszett (a visszaszámlálás elérte a 0 -t), akkor a „GO” (technikailag 60 -as jelzéssel) jelenik meg a kijelzőn a Game Over esetében. Bármelyik eredmény esetén a reset kapcsoló bekapcsolása visszaállítja a gépet a kezdeti állapotba, hogy újra játszhasson.

A forráskód itt található.

3. lépés: Következtetés

A projekt befejezése sokat tanított nekünk a bonyolultabb áramkörök kiépítéséről. Kezdeti tervezésünk nem véges állapotú gép volt. Nehezen találtuk a hibakeresést, és többször átírtuk a kódot különböző módszerekkel (beleértve az FSM -et is). Az oktató javaslatára ragaszkodtunk az FSM megközelítéshez, és befejeztük a játékot. Megtanultuk, hogy sokkal hatékonyabb a kód hardveres megtervezése, mint hagyományos programozási megközelítéssel. A hét szegmenses kijelzővel kapcsolatban is számos kihívással szembesültünk. Nehéz volt elérni, hogy több számot jelenítsen meg „szellemkép” nélkül, és ehhez óraosztót kellett használnunk. Ha tovább fejlesztenénk ezt a projektet, színes LED -eket csatlakoztatnánk a Basys3 -hoz, hogy a felhasználó a színeket láthassa (mint a hagyományos játékban), nem pedig a színek számszerű ábrázolását. Végső soron jobban megértettük a komplex áramkör -tervezést, a valós életben alkalmazott alkalmazásokat és a hardver használatának kihívásait, nem pedig a tökéletes körülmények között végzett szimulációkat.

Ajánlott: