Мазмұны:

VHDL -де Mastermind ойыны: 3 қадам
VHDL -де Mastermind ойыны: 3 қадам

Бейне: VHDL -де Mastermind ойыны: 3 қадам

Бейне: VHDL -де Mastermind ойыны: 3 қадам
Бейне: Mastermind on FPGA 2024, Қараша
Anonim
VHDL -дегі Mastermind ойыны
VHDL -дегі Mastermind ойыны
VHDL -дегі Mastermind ойыны
VHDL -дегі Mastermind ойыны

Біздің жоба үшін біз Basys3 тақтасында ойнатылатын VHDL -де «Mastermind» ойынын құрдық. Mastermind-бұл дәстүрлі түрде қазықтармен және ойын тақтасымен ойнайтын кодты бұзатын ойын. Бір ойыншы екінші ойыншыдан жасырылған әр түрлі түстерді 4 қатарға орналастырады. Екінші ойыншыда «x» болжамдары бар, олар ойыншыға көрінетін қатарға тақтаға ілінеді. Әр болжамнан кейін, екінші ойыншыға 2 сан туралы хабарланады: қанша қазық дұрыс түсті, ал қанша қазық қатарда дұрыс орналасқан. Осы кеңестерді қолдана отырып, екінші ойыншы берілген ойыншыға берілген санға енгізілген түйреуіштердің дұрыс реттілігін табуы керек.

Біздің ойымызша, ойын жалғыз ойыншы. Бағдарлама қазықтардың кездейсоқ комбинациясын жасайды, ал ойыншы дұрыс ретті табу үшін Basys3 тақтасын қолдануы керек. Екілік мәндермен ұсынылған төрт «түстер» бар. 7 сегментті дисплейде үш мән көрсетіледі: қалған бұрылыстар, дұрыс позициядағы түйреуіштердің саны және дұрыс емес түстегі түйреуіштердің саны (бұл мәндер 9, 0 және 0-ден басталады). Ойыншы тақтадағы қосқыштарды пайдаланып, өз болжамының екілік мәнін таңдайды, ал болжауды беру үшін басқа қосқышты аударады. Егер олар дұрыс болса, ойын аяқталады және 7 сегменттегі дисплейде «GG» көрсетіледі. Олай болмаған жағдайда, бұрылу есептегіші 1 -ге азаяды және ойыншы түйіндердің түсі мен позициясына сәйкес келетін түйреуіштердің қанша түйреуішке сәйкес келетініне байланысты кері байланыс алады. Егер ойыншы дұрыс болжамай, кезекпен жүгірсе, дисплейде «GO» (ойынды аяқтаған) көрсетіледі. Сондай -ақ, ойнатқыш кез келген уақытта қайта бастау үшін қалпына келтіру қосқышын айналдыра алады.

1 -қадам: материалдар

Материалдар
Материалдар
Материалдар
Материалдар
Материалдар
Материалдар

Бүкіл ойынды тақтада ойнауға болатындықтан, тек Basys3 тақтасы, тақтаға қосылатын микро USB кабелі және кодтауға болатын компьютер/ноутбук қажет!

2 -қадам: Кодекс

Кодекс
Кодекс
Кодекс
Кодекс

Бұл ойын FPGA -да жұмыс істеуі үшін оны жазудың ең қарапайым жолы - мемлекеттік машинаны құру. Мемлекеттік машинаның болуы ойынның нақты жұмыс істеуі үшін қажетті дәйекті және интерактивті тәжірибеге мүмкіндік береді. Барлығы біркелкі жұмыс істеуі үшін мемлекеттік машина FPGA ішкі сағаттық сигналына негізделіп, бәрі синхрондалғанын қамтамасыз етеді. Негізгі модуль - төрт күйі бар мемлекеттік машина; Бастапқы күй (бастапқы), SubmitAnswer күйі (SubAns), көрсету күйі (Dis) және CheckEndGame күйі (CheckEnd). Мемлекеттік машинамен қатар негізгі модульде екі қосалқы модуль бар, 4-разрядты жеті сегментті дисплей (оның жеке ClkDivider қосалқы модулі бар) және кездейсоқ сандар генераторы (іс жүзінде пседо-кездейсоқ сандар генераторы) бар. Сондай -ақ, кез келген қосқыштың үстінде жарықдиодты жарықтандыруды қосатын негізгі процесс блогы бар, олар адамдарға не енгізуді жеңілдететінін көруге мүмкіндік береді. Кодтың негізгі шолуын суреттегі ақыл картасынан көруге болады.

Қарастырылатын бірінші компонент - кездейсоқ сандар генераторы (randomgen). Нақты кездейсоқ сандарды аппараттық құралдардан алу техникалық тұрғыдан мүмкін болмағандықтан, ең қарапайым шешім-кездейсоқ байланыстың ауыспалы сызықтық кері байланыс регистрі (LFSR) болуы болды. LFSR-де clk кірісі және «a» шығысы бар (12 биттік сан). Әр сағаттық циклде «000000000001» -ден басталатын жаңа 12-биттік нөмір пайда болады, ол ақырында қайталанбай тұрып, 1-ден 12-ге дейінгі 12-биттік комбинациялардан өтеді. «А» шығысы әр сағаттық циклде беріледі, сондықтан ол үздіксіз жұмыс істейді. Clk негізгі модульден Clk -ке, ал «a» негізгі модульдегі RandNum сигналына салыстырылады.

Екінші қосалқы модуль-4 таңбалы жеті сегментті дисплей. Бұл 4 таңбалы жеті сегментті дисплейді көрсетудің қарапайым әдісі. Дисплей негізгі модульден Clk -те орнатылған, бірақ бұл қосалқы модульде өзінің ClkDivider қосалқы модулі бар. ClkDivider (1298 Гц -ге орнатылған) барлық сандар бір уақытта қосулы болып көрінуі үшін Жеті сегменттің сағатын жылдамдату үшін қолданылады (өйткені бір уақытта тек бір цифр қосылуы мүмкін). «Цифр» айнымалысы дисплейдегі нүктелерді айналдыру үшін пайдаланылады, және әр цифрда 0-ден 9-ға дейінгі сандарды көрсетуге мүмкіндік беретін 4-биттік кіріс дисплейінің шарттары келеді. Дисплейдегі ең алыс сол цифр ештеңеге орнатылмаған, себебі ол бұл ойында қолданылмайды.

Негізгі модуль мемлекеттік машинадан тұрады. Процестегі төрт күй - бұл Initial, SubAns, Dis және CheckEnd. Бастапқы күйде, егер SubmitBtn (тексеру үшін жауап беру үшін қолданылатын қосқыш) '1' күйіне орнатылса, онда машина SubAns күйіне ауысады. Кез келген уақытта Rbtn (машинаны қалпына келтіру үшін қолданылатын қосқыш) «1» күйіне орнатылады, содан кейін машина бастапқы күйге оралады. SubAns күйінде болғанда, SubmitBtn = ‘0 'қайтадан болғанда, ол Dis күйіне өтеді. Дис күйінде болғанда, кері санақ = 0 болса (болжау үшін солға бұрылыстар 0 -ге түседі) немесе RSpotCount = 4 болса (ойыншы дұрыс нүктелердегі барлық дұрыс түстерді білдіреді), машина CheckEnd күйіне өтеді. Егер олардың ешқайсысы орын алмаса, онда SubmitBtn = ‘1’ қайтадан болғанда, ол басқа болжам жасауға мүмкіндік беру үшін SubAns күйіне оралады. CheckEnd күйінде болғанда, бұл ойынның соңы, және одан шығудың жалғыз жолы - бастапқы күйге қайтару, қалпына келтіруді басу. Бұл машинаның мемлекеттік диаграммасында оңай көрінеді. Мінез -құлық бойынша бастапқы күй бәрін бастапқы күйіне қайтарады. Кері санау (ойыншыда қанша бұрылысты қалдыратынын сақтайтын сигнал) 9 -ға, RSpotCount (сіз ойлаған түстердің қаншасы дұрыс жерде екенін сақтайтын сигнал) 0 -ге, RColorCount -қа (қанша санын сақтайтын сигнал) орнатылады. Сіз түсінген түстер дұрыс, бірақ дұрыс емес жерде) 0 -ге орнатылған, ал кіші санақ (ақырында әрбір күйді кейінгі күйлерді өзгертетін Countdown -қа сәйкес келетін сигнал) 9 -ға орнатылған. Сонымен қатар, бастапқы күйде RandNum (кездейсоқ генерацияланған сан) төрт түрлі тексеруге бөлінеді (әрбір 3-разряд үшін бір) және check1, check2, check3, check4 сигналдарына сақталады. Бұл тексерулер сіздің болжамыңызбен салыстырылады, сондықтан LFSR әрқашан RandNum -ды әр циклді өзгертуге себепші болса да, бастапқы күйден шыққан кезде тексерулер өзгеріссіз қалады, бұл сақталған мәнге сіздің жауабыңызды салыстыруға мүмкіндік береді. Бұл сондай -ақ, құрылғы қалпына келтірілген кезде, ойнатқыштың жаңа мәні бар екенін білдіреді.

SubmitAnswer күйі (SubAns) кері санақ қосқышын («өзгерту» сигналы) «1» -ге өзгертеді. Бұл кейінірек бұрылыстың жұмыс істеуі үшін қажет. Осыдан кейін, мемлекет ойнатқыштың қосқыштардағы кірістерін жоғарыдағы күйдегі тексерулермен салыстырады. Rs1, rs2, rs3, rs4 сигналы мен rc1, rc2, rc3, rc4 сигналдары If операторларына байланысты 1 немесе 0 -ге орнатылған бүтін типтер болып табылады. Rs сигналы дұрыс нүкте үшін, rc - дұрыс түс үшін. Мысалы, егер 1 түсті ойыншының болжамы RandNum -дің check1 -ге тең болса, онда rs1 = 1 болады, себебі бұл дұрыс түс дұрыс жерде екенін білдіреді. Егер 1 түсі check1 -ге тең болмаса, бірақ басқа тексерулердің біреуіне тең болса, онда rc = 1. Бұл әр түс пен әрбір тексеру үшін орындалады.

Дисплей күйі (Дис) алдымен кері санақ қосқышын іздейді. Егер бұл «1» болса, онда кіші санау 1 -ге төмендейді (бірінші айналымда ол 9 -дан 8 -ге дейін өзгереді). Әйтпесе, кезек өзгермейді. Қосуға қарамастан, жоғарыдан барлық rs мәндері қосылады және RSpotCounter сигналына тағайындалады. Сондай -ақ, барлық rc мәндері RColorCounter -ге қосылады және тағайындалады. Ақырында кері санаққа кіші санаудың мәні тағайындалады. RSpotCounter, RColorCounter және Countdown сигналдары процестен тыс 4 биттік std_logic_veectors түрлендіріледі және порт картасы арқылы Seven Segment дисплейінің қосалқы модуліне жіберіледі. Осылайша, сіз жаңа жауап бермейінше, дисплей дұрыс нәрсені көрсетеді.

CheckEnd күйі сіз жеңдіңіз немесе ұтылдыңыз. Егер сіз жеңген болсаңыз (барлық 4 түс дұрыс жерде, басқаша RSpotCounter = 4 деп аталады), онда сіз жеңгеніңізді көрсету үшін Жеті сегментте «GG» (техникалық түрде 66 ретінде көрсетілген) көрсетіледі. Егер сіз ұтылсаңыз (кері санақ 0 -ге жетті), онда Game GO үшін дисплейде «GO» (техникалық түрде 60 түрінде көрсетіледі) көрсетіледі. Кез келген нәтиже бойынша, қалпына келтіру қосқышын қосқанда, құрылғы қайтадан ойнату үшін бастапқы күйге оралады.

Бастапқы кодты мына жерден табуға болады.

3 -қадам: Қорытынды

Бұл жобаны аяқтау бізге күрделі схемаларды құру туралы көп нәрсені үйретті. Біздің бастапқы конструкциямыз ақырғы мемлекеттік машина емес еді. Біз кодты әр түрлі әдістермен (соның ішінде FSM) бірнеше рет жөндеуді және қайта жазуды қиындаттық. Нұсқаушының ұсынысы бойынша біз FSM тәсілін ұстандық және ойынды аяқтай алдық. Біз кодты дәстүрлі бағдарламалау әдісіне қарағанда аппараттық құралдарға негізделген жобалау әлдеқайда тиімді екенін білдік. Біз сондай -ақ жеті сегментті дисплейге байланысты бірнеше қиындықтарға тап болдық. Бірнеше нөмірді «елестетпестен» көрсету қиынға соқты, және біз мұны істеу үшін сағат бөлгішті қолдануға мәжбүр болдық. Егер біз бұл жобаны әрі қарай дамытатын болсақ, біз Basys3 -ке түрлі түсті жарықдиодты қосатын едік, сондықтан пайдаланушы түстердің сандық көрінісін емес, түстерді көре алады (дәстүрлі ойын сияқты). Сайып келгенде, біз күрделі схемалар дизайны, нақты өмірдегі қосымшалар және тамаша шарттармен модельдеуді емес, аппараттық құралдарды қолданудың қиындықтары туралы көбірек білдік.

Ұсынылған: