Satura rādītājs:

Mastermind spēle VHDL: 3 soļi
Mastermind spēle VHDL: 3 soļi

Video: Mastermind spēle VHDL: 3 soļi

Video: Mastermind spēle VHDL: 3 soļi
Video: Squid Game Mastermind is Crazy 2024, Novembris
Anonim
Mastermind spēle VHDL
Mastermind spēle VHDL
Mastermind spēle VHDL
Mastermind spēle VHDL

Mūsu projektam mēs izveidojām spēli “Mastermind” VHDL, lai to spēlētu uz Basys3 tāfeles. Mastermind ir koda laušanas spēle, ko tradicionāli spēlē ar mietiņiem un spēļu galdu. Pirmais spēlētājs ievieto dažādu krāsu mietiņus 4 rindās, kas ir paslēptas no otrā spēlētāja. Otrajam spēlētājam ir “x” minējumu skaits, kas uz galda novieto mietiņus rindā, kas ir redzama pirmajam spēlētājam. Pēc katra minējuma otrais spēlētājs tiek informēts par 2 cipariem: cik knaģu ir pareizā krāsā un cik knaģu ir pareizajā pozīcijā rindā. Izmantojot šīs norādes, otrajam spēlētājam ir jāuzmin pareizā ķegļu secība, ko viens spēlētājs ievietojis norādītajā numurā.

Mūsu ieviešanā spēle ir viena spēlētāja. Programma ģenerē nejaušu tapu kombināciju, un spēlētājam jāizmanto Basys3 dēlis, lai uzminētu pareizo secību. Ir četras “krāsas”, ko attēlo binārās vērtības. Septiņu segmentu displejā ir redzamas trīs vērtības: atlikušie pagriezieni, tapas pareizā stāvoklī un pareizo krāsu tapu skaits nepareizā pozīcijā (šīs vērtības sākas ar 9, 0 un 0). Spēlētājs izmanto slēdžus uz tāfeles, lai izvēlētos binārās vērtības savam minējumam, un pagriež citu slēdzi, lai iesniegtu minējumu. Ja tie ir pareizi, spēle beidzas, un 7 segmentu displejā parādās “GG”. Ja nē, pagrieziena skaitītājs samazinās par 1, un spēlētājs saņem atgriezenisko saiti, pamatojoties uz to, cik spraudītes viņu minējumā atbilst tapas krāsai vai novietojumam kombinācijā. Ja spēlētājs pagriežas bez pagriezieniem, pareizi neuzminot, displejā tiek parādīts “GO” (apzīmē spēles beigas). Atskaņotājs var arī pagriezt atiestatīšanas slēdzi, lai jebkurā brīdī sāktu no jauna.

1. solis: materiāli

Materiāli
Materiāli
Materiāli
Materiāli
Materiāli
Materiāli

Tā kā visu spēli var spēlēt uz tāfeles, vienīgie nepieciešamie materiāli ir Basys3 dēlis, mikro USB kabelis, lai izveidotu savienojumu ar dēli, un dators/klēpjdators, ko varat izmantot, lai kodētu!

2. darbība: kods

Kods
Kods
Kods
Kods

Lai šī spēle darbotos FPGA, vienkāršākais veids, kā to rakstīt, būtu izveidot valsts mašīnu. Stāvokļa iekārtas izmantošana ļauj secīgai un interaktīvai pieredzei, kas nepieciešama, lai spēle patiešām darbotos. Lai viss darbotos nevainojami, valsts mašīna tiks balstīta uz FPGA iekšējā pulksteņa signālu, nodrošinot, ka viss ir sinhronizēts. Galvenais modulis ir stāvokļa mašīna ar četriem stāvokļiem; Sākotnējais stāvoklis (sākotnējais), SubmitAnswer State (SubAns), Displeja stāvoklis (Dis) un CheckEndGame stāvoklis (CheckEnd). Kopā ar stāvokļa mašīnu galvenajam modulim ir divi apakšmoduļi, četrciparu septiņu segmentu displejs (kuram ir savs ClkDivider apakšmodulis) un nejaušo skaitļu ģenerators (faktiski psuedo-random skaitļu ģenerators). Pastāv arī pamata procesa bloks, lai gaismas diodes virs katra slēdža ieslēgtos, kad tās ir ieslēgtas, lai cilvēki varētu vieglāk redzēt, ko viņi ievada. Pamata pārskatu par kodu var redzēt attēlā redzamajā domu kartē.

Vispirms jāaplūko nejaušo skaitļu ģenerators (randomgen). Tā kā tehniski nav iespējams iegūt patiesus nejaušus skaitļus, kas ģenerēti no aparatūras, vienkāršākais risinājums bija panākt, lai nejaušības skaitlis faktiski būtu lineārās atgriezeniskās saites maiņas reģistrs (LFSR). LFSR ir Clk ievade un izeja “a” (12 bitu skaitlis). Katrā pulksteņa ciklā tiek ģenerēts jauns 12 bitu numurs, kas sākas ar “000000000001”, un galu galā tiek atkārtotas visas 12 bitu kombinācijas ar 1 un 0, pirms atkārtojas. Izeja “a” tiek dota katru pulksteņa ciklu, tāpēc tā nepārtraukti darbojas. CLK tiek kartēts uz Clk no galvenā moduļa, un “a” tiek kartēts uz signālu RandNum galvenajā modulī.

Otrs apakšmodulis ir četru ciparu septiņu segmentu displejs. Tas ir diezgan vienkāršs veids, kā demonstrēt 4 ciparu septiņu segmentu displeju. Displejs ir iestatīts uz Clk no galvenā moduļa, tomēr šim apakšmodulim ir savs ClkDivider apakšmodulis. ClkDivider (iestatīts uz 1298 Hz) tiek izmantots, lai paātrinātu septiņu segmentu pulksteni, lai visi cipari vienlaikus būtu ieslēgti (jo vienlaikus var būt ieslēgts tikai viens cipars). Mainīgais “cipars” tiek izmantots, lai pārvietotos displeja punktos, un ar katru ciparu tiek iekļauti pamata 4 bitu ievades displeja nosacījumi ar iespējām parādīt ciparus no 0 līdz 9, kā arī neko. Attālākais kreisais cipars displejā nav iestatīts uz neko, jo tas netiek izmantots šajā spēlē.

Galveno moduli veido valsts mašīna. Četri procesa stāvokļi ir Initial, SubAns, Dis un CheckEnd. Sākotnējā stāvoklī, ja SubmitBtn (slēdzis, ko izmanto, lai iesniegtu atbildi pārbaudei) ir iestatīts uz “1”, iekārta pāriet uz SubAns stāvokli. Jebkurā laikā Rbtn (slēdzis, ko izmanto, lai atiestatītu iekārtu) ir iestatīts uz “1”, pēc tam iekārta atgriežas sākotnējā stāvoklī. Atrodoties SubAns stāvoklī, kad SubmitBtn = ‘0’ atkal pāriet uz Dis stāvokli. Atrodoties dis stāvoklī, ja atpakaļskaitīšana = 0 (pagriezieni pa kreisi, lai uzminētu, nokrīt līdz 0) vai ja RSpotCount = 4 (tas nozīmē, ka spēlētājs ir visas pareizās krāsas pareizajās vietās), iekārta pāriet uz CheckEnd stāvokli. Ja neviens no šiem gadījumiem nenotiek, tad, kad SubmitBtn = ‘1’ atkal, tas atgriežas SubAns stāvoklī, lai atļautu citu minējumu. Atrodoties CheckEnd stāvoklī, šīs ir spēles beigas, un vienīgā izeja ir nospiest atiestatīšanu, atgriežot to sākotnējā stāvoklī. To ir viegli apskatīt stāvokļa mašīnas diagrammā. Uzvedības veidā sākotnējais stāvoklis visu inicializē sākotnējā stāvoklī. Atpakaļskaitīšana (signāls, kas ietaupa spēlētājam atlikušo pagriezienu skaitu) ir iestatīta uz 9, RSpotCount (signāls, kas saglabā to krāsu skaitu, kuras jūs uzminējāt, ir pareizajā vietā) ir iestatīts uz 0, RColorCount (signāls, kas saglabā, cik krāsas, kuras jūs uzminējāt, ir pareizas, bet nepareizā vietā) ir iestatītas uz 0, un mazā atpakaļskaitīšana (signāls, kas galu galā tiek kartēts uz atpakaļskaitīšanu, kas faktiski maina katru pagriezienu vēlākos stāvokļos) ir iestatīts uz 9. Arī sākotnējā stāvoklī RandNum (psuedo-random ģenerēts skaitlis) ir sadalīts četrās dažādās pārbaudēs (viens katrai 3 bitu krāsai) un tiek saglabāts signālos check1, check2, check3, check4. Šīs pārbaudes patiesībā tiek salīdzinātas ar jūsu minējumiem, tāpēc, lai gan LFSR vienmēr liek RandNum mainīt katru ciklu, pēc sākotnējā stāvokļa pārbaudes pārbaudes paliek nemainīgas, ļaujot saglabātai vērtībai salīdzināt jūsu atbildi. Tas nozīmē arī to, ka ikreiz, kad iekārta tiek atiestatīta, atskaņotājam ir jauna vērtība, ko uzminēt.

SubmitAnswer State (SubAns) maina atpakaļskaitīšanas iespējotāju (signāla “change”) uz “1”. Tas ir nepieciešams vēlāk, lai darbotos pagriezienu izsekošana. Pēc tam valsts salīdzina atskaņotāja ievades no slēdžiem ar pārbaudēm, kas veiktas iepriekš minētajā stāvoklī. Signāls rs1, rs2, rs3, rs4 un signāli rc1, rc2, rc3, rc4 ir veseli skaitļi, kas atkarībā no If paziņojumiem ir iestatīti uz 1 vai 0. Signāls rs ir pareizs punkts un rc pareizai krāsai. Piemēram, ja 1. krāsas spēlētāja minējums ir vienāds ar RandNum čeku1, tad rs1 = 1, jo tas nozīmē, ka pareizā krāsa ir pareizajā vietā. Ja 1. krāsa nav vienāda ar pārbaudi1, bet ir vienāda ar citām pārbaudēm, tad rc = 1. Tas tiek darīts katrai krāsai un katrai pārbaudei.

Displeja stāvoklis (Dis) vispirms meklē atpakaļskaitīšanas iespēju. Ja tas ir “1”, tad mazā atskaite iet uz leju 1 (tātad pirmajā pagriezienā tā iet no 9 līdz 8 utt.). Pretējā gadījumā pagrieziens nemainās. Neatkarīgi no šīs iespējošanas visas rs vērtības no augšas tiek saskaitītas un piešķirtas signāla RSpotCounter. Arī visas rc vērtības tiek pievienotas un piešķirtas RColorCounter. Visbeidzot Countdown tiek piešķirta smallcountdown vērtība. Visi signāli RSpotCounter, RColorCounter un Countdown ārpus procesa tiek pārvērsti par 4 bitu std_logic_vectors un caur portu karti tiek pārvietoti uz Seven Segment displeja apakšmoduli. Tādā veidā displejā tiek rādītas pareizās lietas, līdz iesniedzat jaunu atbildi.

CheckEnd valsts ir paredzēta tam, vai esat uzvarējis vai zaudējis. Ja esat uzvarējis (visas 4 krāsas ir īstajā vietā, citādi pazīstamas kā RSpotCounter = 4), tad septiņos segmentos tiek parādīts “GG” (tehniski parādīts kā 66), lai parādītu, ka esat uzvarējis. Ja esat zaudējis (atpakaļskaitīšana ir sasniegusi 0), displejā tiek parādīts “GO” (tehniski parādīts kā 60). Jebkurā gadījumā, nospiežot atiestatīšanas slēdzi, iekārta atgriezīsies sākotnējā stāvoklī, lai to atkal atskaņotu.

Avota kodu var atrast šeit.

3. solis: secinājums

Šī projekta pabeigšana mums daudz iemācīja veidot sarežģītākas shēmas. Mūsu sākotnējais dizains nebija ierobežota stāvokļa mašīna. Mums bija grūti atkļūdot un vairākas reizes pārrakstījām kodu, izmantojot dažādas metodes (ieskaitot MFV). Pēc instruktora ieteikuma mēs palikām pie MFV pieejas un varējām pabeigt spēli. Mēs uzzinājām, ka daudz efektīvāk ir izstrādāt kodu, pamatojoties uz aparatūru, nevis ar tradicionālu programmēšanas pieeju. Mēs arī saskārāmies ar vairākām problēmām, kas saistītas ar septiņu segmentu displeju. Bija grūti panākt, lai tiktu parādīti vairāki numuri bez “dubultošanās”, un, lai to paveiktu, mums bija jāizmanto pulksteņa dalītājs. Ja mēs turpinātu attīstīt šo projektu, mēs savienotu krāsainas gaismas diodes ar Basys3, lai lietotājs varētu redzēt krāsas (piemēram, tradicionālajā spēlē), nevis krāsu skaitliskus attēlojumus. Galu galā mēs ieguvām labāku izpratni par sarežģītu shēmu dizainu, reālās dzīves lietojumiem un aparatūras izmantošanas problēmām, nevis simulāciju izpildi ar perfektiem apstākļiem.

Ieteicams: