Мазмуну:

VHDLдеги Mastermind Оюну: 3 кадам
VHDLдеги Mastermind Оюну: 3 кадам

Video: VHDLдеги Mastermind Оюну: 3 кадам

Video: VHDLдеги Mastermind Оюну: 3 кадам
Video: FPGA Hello world или как программировать ПЛИС. Vivado, Spartan7 2024, Июль
Anonim
VHDLдеги Mastermind оюну
VHDLдеги Mastermind оюну
VHDLдеги Mastermind оюну
VHDLдеги Mastermind оюну

Биздин проект үчүн биз VHDLде "Mastermind" оюнун Basys3 тактасында ойнотуу үчүн түздүк. Mastermind-бул кадимкидей казыктар жана оюн тактасы менен ойнолуучу код бузуучу оюн. Бир оюнчу экинчи оюнчудан жашырылган 4 катар катары түрдүү түстөгү казыктарды коёт. Экинчи оюнчу анда "x" сандагы божомолдорго ээ болуп, казыктарды тактага бир оюнчуга көрүнөт. Ар бир божомолдон кийин, эки оюнчуга 2 сан маалымдалат: казыктардын канчасы туура түстө жана канча казык катардагы туура абалда. Бул кеңештерди колдонуп, экинчи оюнчу бир оюнчу бөлүнгөн санга киргизилген пиндердин туура ырааттуулугун табышы керек.

Биздин ишке ашырууда, оюн жалгыз оюнчу. Казыктардын туш келди айкалышы программа тарабынан түзүлөт жана оюнчу туура ырааттуулукту табуу үчүн Basys3 тактасын колдонушу керек. Бинардык маанилер менен көрсөтүлгөн төрт "түстөр" бар. 7 сегменттүү дисплей үч маанини көрсөтөт: калган бурулуштар, туура позициядагы казыктардын саны жана туура эмес түстөгү туура түстүү казыктардын саны (бул маанилер 9, 0 жана 0 менен башталат). Оюнчу тактадагы өчүргүчтөрдү колдонуп, экилик баалуулуктарды тандап алат жана божомолду тапшыруу үчүн башка которгучту которот. Эгер алар туура болсо, оюн бүтөт жана 7 сегменттүү дисплейде "GG" көрсөтүлөт. Болбосо, бурулуш эсептегич 1ге азаят жана оюнчу алардын божомолунда канча казык айкалыштагы казыктардын түсүнө же абалына дал келгенине жараша пикир алат. Эгерде оюнчу туура таппай туруп кезеги бүтсө, дисплейде "GO" (оюндун аяктаганын билдирет) көрсөтүлөт. Оюнчу каалаган убакта кайра баштоо үчүн баштапкы абалга келтиргичти которо алат.

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

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

Бардык оюнду тактанын өзүндө ойносо болот, Basys3 Board гана керек, тактага туташуу үчүн микро USB кабели жана коддоо үчүн колдонула турган компьютер/ноутбук!

2 -кадам: Код

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

Бул оюн FPGAда иштеши үчүн, жазуунун эң жөнөкөй жолу - мамлекеттик машинаны түзүү. Мамлекеттик машинанын болушу оюндун иш жүзүндө иштеши үчүн керектүү ырааттуу жана интерактивдүү тажрыйбаны берет. Баары үзгүлтүксүз иштеши үчүн, мамлекеттик машина FPGAнын ички сааттык сигналына негизделип, бардыгын шайкештештирүүнү камсыз кылат. Негизги модуль төрт штаттан турган мамлекеттик машина; Баштапкы абал (Баштапкы), SubmitAnswer абалы (SubAns), Көрсөтүү абалы (Dis) жана CheckEndGame абалы (CheckEnd). Мамлекеттик машина менен бирге, негизги модулда эки субмодуль бар, 4 орундуу жети сегменттин дисплейи (өзүнүн ClkDivider субмодулу бар) жана кокустук сандар генератору (чындыгында псюдо-кокустук сандар генератору). Ошондой эле, ар бир которгучтун үстүндө LEDдин күйүп турушу үчүн, адамдар эмнени жеңилирээк көрүш үчүн, негизги процесстик блок бар. Коддун негизги серепин сүрөттөгү акыл картасынан көрүүгө болот.

Биринчи компонент - бул Random Number Generator (randomgen). Техникалык жактан жабдуулардан өндүрүлгөн чыныгы кокустук сандарды алуу мүмкүн болбогондуктан, эң жөнөкөй чечим randomgen чындыгында Linear-feedback Shift Register (LFSR) болушу керек болчу. LFSRде clk кириши жана "a" (12-бит саны) чыгаруу бар. Ар бир саат циклинде "000000000001" баштап жаңы 12 биттик сан түзүлөт, акыры кайталанганга чейин 1 жана 0дин 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 абалына өтөт. Дис абалында болгондо, эгерде Countdown = 0 (бурулуш солго бурулат 0) же RSpotCount = 4 болсо (оюнчу туура тактардагы бардык туура түстөрдү билдирет), машина CheckEnd абалына барат. Эгерде алардын бири да болбосо, анда SubmitBtn = ‘1’ кайра келгенде, дагы бир божомолго мүмкүнчүлүк берүү үчүн SubAns абалына кайтат. CheckEnd штатында болгондо, бул оюндун аягы, жана чыгуунун бирден -бир жолу - баштапкы абалга кайтарып, баштапкы абалга келтирүү. Бул мамлекеттик машинанын диаграммасында оңой көрүнөт. Жүрүш -турушу боюнча Баштапкы Мамлекет баарын баштапкы абалына кайтарат. Countdown (оюнчу канча бурулушту сактай турган сигнал) 9га, RSpotCount (сиз ойлогон түстөрдүн канчасы керектүү жерде экенин сактай турган сигнал) 0, RColorCount (сигналдын канчасын үнөмдөйт) Сиз ойлогон түстөр туура, бирок туура эмес жерде) 0 коюлган, ал эми кичине эсептөө (акырында кийинки штаттарда ар бир бурулушту өзгөрткөн Countdown менен картага алынган сигнал) 9га коюлган. Ошондой эле, Баштапкы абалда RandNum (psuedo-кокусунан түзүлгөн сан) төрт башка текшерүүгө бөлүнөт (ар бир 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дун текшерүүсүнө барабар болсо, анда rs1 = 1, анткени бул туура түс туура жерде экенин билдирет. Эгерде түс 1 check1ге барабар эмес, бирок башка текшерүүлөрдүн бирине барабар болсо, анда rc = 1. Бул ар бир түс жана ар бир чек үчүн жасалат.

Дисплейдин абалы (Дис) адегенде артка саноо иштетүүчүсүн издейт. Эгерде бул "1" болсо, анда кичине эсептөө 1ге төмөндөйт (биринчи бурулушта 9дан 8ге чейин ж.б.). Болбосо кезек өзгөрбөйт. Киргизүүгө карабастан, жогорудагы бардык rs баалуулуктары кошулат жана RSpotCounter сигналына дайындалат. Ошондой эле бардык rc баалуулуктары кошулат жана RColorCounterге дайындалат. Акырында Countdown Smallcountdown мааниси ыйгарылат. RSpotCounter, RColorCounter жана Countdown сигналдары процесстин сыртында 4-бит std_logic_veectors айландырылат жана порт картасы аркылуу Seven Segment дисплей субмодулуна түртүлөт. Ошентип, дисплей сиз жаңы жооп бергенге чейин туура нерселерди көрсөтөт.

CheckEnd штаты сиз утуп же утулуп калганыңыз үчүн. Эгерде сиз утуп алган болсоңуз (бардык 4 түстөр туура жерде, башкача айтканда RSpotCounter = 4 деп аталат), анда "GG" (техникалык жактан 66 катары көрсөтүлгөн) Жети Сегментте жеңишке жеткениңизди көрсөтүү үчүн көрсөтүлөт. Эгерде сиз утулуп калсаңыз (Countdown 0го жетти), анда "GO" (техникалык жактан 60 катары көрсөтүлгөн) Game Over үчүн дисплейде көрсөтүлөт. Жыйынтыгында, баштапкы абалга келтирүү баскычын басуу, машинаны кайра баштапкы абалына кайтарат.

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

3 -кадам: Жыйынтык

Бул долбоорду аяктоо бизге татаалыраак микросхемаларды куруу жөнүндө көп нерсени үйрөттү. Биздин баштапкы дизайн чектүү мамлекеттик машина болгон эмес. Бизге мүчүлүштүктөрдү оңдоо жана кодду бир нече жолу ар кандай ыкмаларды (анын ичинде FSM) колдонуу менен кайра жазуу кыйынга турду. Инструктордун сунушу боюнча биз FSM ыкмасын карманып, оюнду бүтүрө алдык. Биз салттуу программалоо ыкмасына караганда, аппараттык жабдууларга негизделген кодду иштеп чыгуу алда канча эффективдүү экенин билдик. Биз ошондой эле жети сегменттин дисплейине байланыштуу бир нече кыйынчылыктарга туш болдук. Аны "арбак" кылбастан бир нече сандарды көрсөтүү кыйын болду жана биз муну ишке ашыруу үчүн саат бөлүштүргүчтү колдонууга туура келди. Эгерде биз бул долбоорду андан ары өнүктүрө турган болсок, түстүү светодиоддорду Basys3кө туташтырмакпыз, андыктан колдонуучу түстөрдүн сандык өкүлчүлүктөрүнө эмес, түстөрдү көрө алат (салттуу оюндагыдай). Акыр -аягы, биз татаал схема дизайны, реалдуу жашоо тиркемелери жана кемчиликсиз шарттар менен симуляцияны иштетүүдөн көрө аппараттык жабдыктарды колдонуу кыйынчылыктары жөнүндө көбүрөөк түшүнүккө ээ болдук.

Сунушталууда: