Innehållsförteckning:

Mastermind -spel i VHDL: 3 steg
Mastermind -spel i VHDL: 3 steg

Video: Mastermind -spel i VHDL: 3 steg

Video: Mastermind -spel i VHDL: 3 steg
Video: BEST DEFENCE ACADEMY IN DEHRADUN | NDA FOUNDATION COURSE AFTER 10TH | NDA COACHING #shorts #nda #ssb 2024, November
Anonim
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL

För vårt projekt skapade vi "Mastermind" -spelet i VHDL som ska spelas på Basys3 -brädet. Mastermind är ett kodbrytande spel som traditionellt spelas med pinnar och ett spelbräda. Spelare ett placerar pinnar av olika färger i en rad med 4, dolda från spelare två. Spelare två har sedan "x" antal gissningar som placerar pinnar på brädet i en rad som är synlig för spelare ett. Efter varje gissning informeras spelare två om två nummer: hur många av pinnarna har rätt färg och hur många pinnar som är på rätt plats i raden. Med hjälp av dessa ledtrådar måste spelare två gissa rätt sekvens av stift som spelaren en placerade i antalet gissningar tilldelade.

I vår implementering är spelet en spelare. En slumpmässig kombination av pinnar genereras av programmet, och spelaren måste använda Basys3 -kortet för att gissa rätt sekvens. Det finns fyra "färger", representerade av binära värden. Displayen med 7 segment visar tre värden: återstående varv, antal stift i rätt position och antal stift som har rätt färg i fel position (dessa värden börjar vid 9, 0 och 0). Spelaren använder omkopplarna på tavlan för att välja de binära värdena för hans/hennes gissning, och vänder en annan omkopplare för att skicka gissningen. Om de stämmer slutar spelet och 7-segmentskärmen visar "GG". Om inte, minskar vändräknaren med 1 och spelaren får feedback baserat på hur många pinnar i deras gissning som matchar färgen eller positionen på pinnarna i kombinationen. Om spelaren tar slut utan att gissa korrekt visar displayen “GO” (representerar spelet över). Spelaren kan också vända återställningsknappen för att börja om när som helst.

Steg 1: Material

Material
Material
Material
Material
Material
Material

Eftersom hela spelet kan spelas på själva brädet är det enda material som behövs Basys3 -kortet, en mikro -USB -kabel för anslutning till brädet och en dator/bärbar dator som du kan använda för att koda!

Steg 2: Koden

Koden
Koden
Koden
Koden

För att detta spel ska fungera på FPGA skulle det enklaste sättet att skriva det vara att skapa en statsmaskin. Med en tillståndsmaskin kan den sekventiella och interaktiva upplevelsen som krävs för att spelet faktiskt ska fungera. För att allt ska fungera smidigt kommer tillståndsmaskinen att baseras på FPGA: s interna klocksignal, så att allt är synkroniserat. Huvudmodulen är en tillståndsmaskin med fyra tillstånd; Initial State (Initial), SubmitAnswer State (SubAns), Display State (Dis), and CheckEndGame State (CheckEnd). Tillsammans med tillståndsmaskinen har huvudmodulen två submoduler, en fyrsiffrig sju segmentdisplay (som har sin egen ClkDivider-submodul) och slumpgenerator (faktiskt en psuedo-slumpgenerator). Det finns också ett grundläggande processblock för att lysdioderna ovanför varje strömbrytare ska tändas när de är påslagna, så att människor lättare kan se vad de matar in. En grundläggande översikt över koden kan ses på tankekartan på bilden.

Den första komponenten att titta på är Random Number Generator (randomgen). Eftersom det inte är tekniskt möjligt att få sanna slumpmässiga nummer genererade från hårdvara, var den enklaste lösningen att låta slumpgenet faktiskt vara ett Linear-feedback Shift Register (LFSR). LFSR har en ingång på clk och en utgång "a" (ett 12-bitars tal). Varje klockcykel genereras ett nytt 12-bitars tal som börjar på "000000000001" och slutligen går igenom alla kombinationer av 12-bitars 1: or och 0: or innan de upprepar sig. Utgången "a" ges varje klockcykel, så den körs kontinuerligt hela tiden. Clk mappas till Clk från huvudmodulen, och "a" mappas till signalen RandNum i huvudmodulen.

Den andra delmodulen är den fyrsiffriga sjusegmentdisplayen. Detta är ett ganska enkelt sätt att visa upp en fyrsiffrig sju segmentskärm. Displayen är inställd på Clk från huvudmodulen, men denna submodul har sin egen submodul av en ClkDivider. ClkDivider (inställd på 1298 Hz) används för att påskynda klockan för det sju segmentet så att alla siffror verkar vara på samtidigt (eftersom bara en siffra faktiskt kan vara på i taget). Variabeln "siffra" används för att bläddra igenom fläckarna på displayen, och för varje siffra kommer villkoren för en grundläggande 4-bitars inmatningsdisplay, med alternativ för att visa siffrorna 0 till 9 och inte heller någonting. Den längsta vänstra siffran på displayen är inställd på ingenting eftersom den inte används i det här spelet.

Huvudmodulen består av tillståndsmaskinen. De fyra tillstånden i processen är Initial, SubAns, Dis och CheckEnd. När det är i utgångsläget, om SubmitBtn (omkopplare som används för att skicka ditt svar för kontroll) är inställd på ‘1’, flyttar maskinen till delans status. När som helst Rbtn (omkopplare som används för att återställa maskinen) är inställd på ‘1’, sedan återgår maskinen till utgångsläget. I SubAns -tillståndet, när SubmitBtn = ‘0’ igen, går det vidare till Dis -tillståndet. I Dis -tillståndet, om nedräkningen = 0 (svängarna till vänster för att gissa faller till 0) eller om RSpotCount = 4 (vilket betyder spelaren som alla rätt färger på de rätta platserna), går maskinen till CheckEnd -tillståndet. Om inget av dessa inträffar, när SubmitBtn = ‘1’ igen, går det tillbaka till delans status för att tillåta en annan gissning. När det är i CheckEnd -tillståndet är detta slutet på spelet, och den enda vägen ut är att slå återställningen och återföra den till utgångsläget. Detta är lätt att se i tillståndsmaskindiagrammet. Beteendemässigt initialiserar initialtillståndet allt tillbaka till utgångsläget. Nedräkningen (signal som sparar hur många varv kvar spelaren har) är inställd på 9, RSpotCount (signal som sparar hur många av färgerna du gissade är på rätt plats) är inställd på 0, RColorCount (signal som sparar hur många av färgerna du gissade är rätt men på fel plats) är satt till 0, och den lilla nedräkningen (signalen som så småningom mappas till nedräkning som faktiskt ändrar varje sväng i senare tillstånd) är inställd på 9. Dessutom, i initialtillståndet är RandNum (psuedo-slumpmässigt genererat nummer) delas upp i fyra olika kontroller (en för varje 3-bitars färg) och sparas i signalerna check1, check2, check3, check4. Dessa kontroller är vad din gissning faktiskt jämförs med, så även om LFSR alltid orsakar RandNum att ändra varje cykel, förblir kontrollerna densamma när du lämnar det ursprungliga tillståndet, så att ett sparat värde kan jämföra ditt svar mot. Detta innebär också att varje gång maskinen återställs har spelaren ett nytt värde att gissa.

SubmitAnswer State (SubAns) ändrar nedräkningsfunktionen (signal "ändra") till "1". Detta behövs senare för att svängspårningen ska fungera. Därefter jämför staten spelarens ingångar från switcharna med de kontroller som gjorts i ovanstående tillstånd. Signal rs1, rs2, rs3, rs4 och signaler rc1, rc2, rc3, rc4 är heltalstyper som beroende på if -satserna är inställda på antingen 1 eller 0. Signalen rs är för rätt plats och rc för rätt färg. Till exempel om färg 1 -spelarens gissning är lika med check1 i RandNum, då rs1 = 1 eftersom det betyder att rätt färg är på rätt plats. Om färg 1 inte är lika med check1, men är lika med en av de andra kontrollerna, är rc = 1. Detta görs för varje färg och för varje kontroll.

Displaytillståndet (Dis) letar först efter nedräkningen. Om det är '1', går nedräkningen nedåt 1 (så vid första svängen går den från 9 till 8 etc.). Annars ändras inte turen. Oavsett vilken aktivering, alla rs -värden från ovan läggs till och tilldelas signal RSpotCounter. Alla rc -värden läggs till och tilldelas RColorCounter. Slutligen tilldelas nedräkningen värdet på liten nedräkning. Signalerna RSpotCounter, RColorCounter och Countdown konverteras alla till 4-bitars std_logic_vectors utanför processen och skickas till undermodulen för sju segment genom en portkarta. På så sätt visar displayen rätt saker tills du skickar in ett nytt svar.

CheckEnd -status är för om du har vunnit eller förlorat. Om du har vunnit (alla fyra färgerna är på rätt plats, annars känd som RSpotCounter = 4), visas “GG” (visas tekniskt som 66) i det sju segmentet för att visa att du har vunnit. Om du har förlorat (nedräkningen har nått 0) visas “GO” (visas tekniskt som 60) på displayen för Game Over. Med båda resultaten kommer maskinen att återgå till utgångsläget för att spela igen genom att trycka på återställningsknappen.

Källkoden hittar du här.

Steg 3: Slutsats

Att slutföra detta projekt lärde oss mycket om att bygga mer komplicerade kretsar. Vår första design var inte en slutlig tillståndsmaskin. Vi fann det svårt att felsöka och skrev om koden ett antal gånger med olika metoder (inklusive en FSM). På instruktörens förslag höll vi fast vid FSM -tillvägagångssättet och vi kunde avsluta spelet. Vi lärde oss att det är mycket mer effektivt att utforma koden baserat på hårdvaran än med en traditionell programmeringsmetod. Vi mötte också flera utmaningar relaterade till displayen med sju segment. Det var svårt att få det att visa flera nummer utan att "spöka", och vi var tvungna att använda en klockavdelare för att uppnå detta. Om vi skulle vidareutveckla detta projekt skulle vi ansluta färgade lysdioder till Basys3 så att användaren kan se färger (som i det traditionella spelet) snarare än numeriska representationer av färger. I slutändan fick vi en större förståelse för komplex kretsdesign, verkliga applikationer och utmaningarna med att använda hårdvara snarare än att köra simuleringar med perfekta förhållanden.

Rekommenderad: