Агуулгын хүснэгт:

VHDL дээрх Mastermind тоглоом: 3 алхам
VHDL дээрх Mastermind тоглоом: 3 алхам

Видео: VHDL дээрх Mastermind тоглоом: 3 алхам

Видео: VHDL дээрх Mastermind тоглоом: 3 алхам
Видео: Implementation of Full Adder Using VHDL Code and Considering data Flow Modeling | VHDL in EXTC 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 самбар, самбар дээр холбогдох микро USB кабель, код бичихэд ашиглаж болох компьютер/зөөврийн компьютер л шаардлагатай болно.

Алхам 2: Код

Код
Код
Код
Код

Энэ тоглоомыг FPGA дээр ажиллуулахын тулд үүнийг бичих хамгийн хялбар арга бол улсын машин бүтээх явдал юм. Улсын машинтай байх нь тоглоомыг ажиллуулахад шаардлагатай дараалсан, интерактив туршлагыг бий болгодог. Бүх зүйл жигд ажиллахын тулд төрийн машиныг FPGA -ийн дотоод цагийн дохиогоор суурилуулж, бүх зүйлийг синхрончлох болно. Үндсэн модуль нь дөрвөн төлөвтэй муж улсын машин юм; Анхны төлөв (Анхны), SubmitAnswer төлөв (SubAns), Дэлгэцийн төлөв (Dis), CheckEndGame төлөв (CheckEnd). Улсын машинтай зэрэгцэн үндсэн модуль нь 4 дэд оронтой долоон сегментийн дэлгэц (өөрийн гэсэн ClkDivider дэд модультай), санамсаргүй тооны генератор (үнэндээ пседо-санамсаргүй тооны генератор) гэсэн хоёр дэд модультай. Хүмүүс юу оруулж байгаагаа илүү хялбар харахын тулд асаах үед асаах бүртээ LED -ийг асаах үндсэн процессын блок байдаг. Кодын үндсэн тоймыг зураг дээрх сэтгэцийн газрын зургаас харж болно.

Анхаарал хандуулах ёстой бүрэлдэхүүн хэсэг бол Random Number Generator (randomgen) юм. Техник хангамжийн тусламжтайгаар санамсаргүй тоонуудыг олж авах нь техникийн хувьд боломжгүй тул хамгийн энгийн шийдэл бол randomgen-ийг Шугаман саналын шилжилтийн бүртгэл (LFSR) болгох явдал байв. LFSR нь clk оролттой бөгөөд "a" гаралттай (12 битийн тоо). Цаг бүрийн мөчлөг бүрт "000000000001" -ээс эхлэн 12 битийн шинэ дугаар үүсч, эцэст нь давтахаасаа өмнө 1 ба 0-ийн 12 битийн бүх хослолыг давж гардаг. "А" гаралтыг цагийн мөчлөг бүрт өгдөг тул бүхэл бүтэн тасралтгүй ажилладаг. Clk -ийг үндсэн модулиас Clk руу, "a" -г үндсэн модулийн RandNum дохиогоор дүрсэлдэг.

Хоёрдахь дэд модуль нь 4 оронтой долоон сегментийн дэлгэц юм. Энэ бол 4 оронтой долоон сегментийн дэлгэцийг харуулах маш энгийн арга юм. Дэлгэцийг үндсэн модулиас Clk дээр байрлуулсан боловч энэ дэд модуль нь өөрийн ClkDivider дэд модултай. ClkDivider (1298 Гц болгож тохируулсан) нь Долоон сегментийн цагийг хурдасгахад ашиглагддаг бөгөөд ингэснээр бүх цифрүүд нэгэн зэрэг ассан мэт харагддаг (нэг удаад зөвхөн нэг оронтой тоо асах боломжтой байдаг). "Цифр" гэсэн хувьсагчийг дэлгэц дээрх цэгүүдээр дамжин өнгөрөхөд ашигладаг бөгөөд цифр бүрт 0-ээс 9 хүртэлх цифрийг харуулах үндсэн 4 битийн оролтын дэлгэцийн нөхцөл ирдэг. Дэлгэц дээрх хамгийн алслагдсан цифрийг энэ тоглоомонд ашиглаагүй тул юу ч болоогүй байна.

Үндсэн модуль нь төрийн машинаас бүрдэнэ. Үйл явцын дөрвөн төлөв нь Анхдагч, SubAns, Dis, CheckEnd юм. Эхний төлөвт SubmitBtn (таны хариултыг шалгахын тулд ашигладаг түлхүүр) -ийг '1' гэж тохируулсан бол машин SubAns төлөв рүү шилжих болно. Хэзээ ч Rbtn (машиныг дахин тохируулахад ашигладаг унтраалга) -ийг '1' гэж тохируулсны дараа машин анхны төлөв рүүгээ буцдаг. SubAns төлөвт байх үед SubmitBtn = ‘0’ дахин ирэхэд Dis төлөв рүү шилждэг. Дис мужид байх үед Countdown = 0 (Зүүн тийш эргэх нь 0 болж буурах болно) эсвэл RSpotCount = 4 (тоглогчийг зөв цэг дээр байгаа бүх өнгийг зөв илэрхийлсэн гэсэн үг) бол машин CheckEnd төлөв рүү орно. Хэрэв эдгээрийн аль нь ч тохиолдохгүй бол SubmitBtn = ‘1’ дахин ирэхэд дахин таамаглахын тулд SubAns төлөв рүү буцна. CheckEnd төлөвт байх үед энэ бол тоглоом дуусах бөгөөд цорын ганц гарц бол анхны төлөв рүү буцааж дахин тохируулах явдал юм. Үүнийг улсын машины диаграмаас хялбархан харах боломжтой. Зан төлөвийн хувьд Анхан шатны төлөв байдал нь бүх зүйлийг анхны байрлалдаа буцааж өгдөг. Тоолох тоолуур (тоглогч хэдэн эргэлт хийх боломжтойг хэмнэдэг дохио) 9, RSpotCount (таны таамаглаж буй өнгөнүүд хичнээн зөв байсныг хэмждэг дохио) 0, RColorCount (хэдэн ширхэг хэмнэх дохио) таны таамаглаж буй өнгийг зөв боловч буруу цэг дээр) 0 болгож, жижиг тооллыг (сүүлд нь эргэлт бүрийг өөрчилдөг Countdown руу харуулдаг дохио) 9 болгож тохируулсан болно. Түүнчлэн, Анхны төлөвт RandNum (psuedo-санамсаргүй үүсгэсэн тоо) нь дөрвөн өөр шалгалтанд хуваагддаг (3 битийн өнгө тутамд нэг), check1, check2, check3, check4 гэсэн дохионд хадгалагддаг. Эдгээр шалгалтууд нь таны таамаглаж буй зүйлтэй харьцуулагддаг тул LFSR нь RandNum -ийг мөчлөг бүрийг өөрчлөхөд хүргэдэг ч гэсэн та анхны төлөвийг орхисны дараа чекүүд хэвээр үлдэж, хадгалсан утгыг таны хариултыг харьцуулах боломжийг олгодог. Энэ нь машиныг дахин тохируулах үед тоглогч таах шинэ утгатай болно гэсэн үг юм.

SubmitAnswer State (SubAns) нь тоолох идэвхжүүлэгчийг ("өөрчлөлт" гэсэн дохио) "1" болгож өөрчилдөг. Энэ нь дараа нь эргэлтийг хянах боломжтой болно. Үүний дараа муж тоглогчийн оролтыг унтраалгаас дээрх төлөвт хийсэн шалгалттай харьцуулж үздэг. Дохио rs1, rs2, rs3, rs4 ба rc1, rc2, rc3, rc4 дохио нь бүхэл тоон төрөл бөгөөд If хэллэгийг 1 эсвэл 0 гэж тохируулсан байхаас хамаарна. Rs дохио нь зөв цэгийн хувьд, rc нь зөв өнгөний хувьд зориулагдсан болно. Жишээлбэл, хэрэв 1 өнгөт тоглогчийн таамаглал нь RandNum -ийн check1 -тэй тэнцүү бол rs1 = 1 нь зөв өнгө зөв газартаа байна гэсэн үг юм. Хэрэв 1 -р өнгө нь check1 -тэй тэнцүү биш боловч бусад шалгалтуудын аль нэгтэй тэнцүү байвал rc = 1. Үүнийг өнгө бүрийн хувьд, чек бүрийн хувьд хийдэг.

Дэлгэцийн төлөв (Dis) эхлээд тоолох идэвхжүүлэгчийг хайж олох болно. Хэрэв энэ нь "1" бол жижиг тоололт 1 -ээр буурна (эхний ээлжинд 9 -өөс 8 хүртэл орно). Үгүй бол эргэлт өөрчлөгдөхгүй. Үүнийг идэвхжүүлсэн эсэхээс үл хамааран дээрх бүх rs утгуудыг нэмж RSpotCounter -д дохио өгөхөөр тохируулсан болно. Мөн бүх rc утгыг нэмж RColorCounter -д хуваарилдаг. Эцэст нь Countdown нь жижиг тоолох утгыг өгдөг. RSpotCounter, RColorCounter, Countdown дохионуудыг бүгд процессийн гадна 4 битийн std_logic_veectors болгон хөрвүүлж, портын газрын зургаар дамжуулан Seven Segment дэлгэцийн дэд модуль руу түлхдэг. Ингэснээр та шинэ хариулт өгөх хүртэл дэлгэц дээр зөв зүйлийг харуулна.

CheckEnd State нь ялсан эсвэл хожигдсон эсэхийг тодорхойлох явдал юм. Хэрэв та ялсан бол (бүх 4 өнгө зөв газартаа байгаа, өөрөөр RSpotCounter = 4 гэж нэрлэдэг), дараа нь "GG" (техникийн хувьд 66 гэж харуулав) -ийг Долоон сегмент дээр харуулснаар хожсоноо харуулна. Хэрэв та хожигдсон бол (Countdown 0 -д хүрсэн) Game Over -ийн дэлгэц дээр "GO" (техникийн хувьд 60 гэж харуулав) гарч ирнэ. Аль ч үр дүн гарсан тохиолдолд дахин тохируулах товчлуурыг дарахад машиныг анхны төлөв рүү буцааж дахин тоглуулах болно.

Эх кодыг эндээс олж болно.

Алхам 3: Дүгнэлт

Энэ төслийг дуусгаснаар бидэнд илүү төвөгтэй хэлхээг бий болгох талаар маш их зүйлийг зааж өгсөн. Бидний анхны загвар нь хязгаарлагдмал улсын машин биш байв. Бид дибаг хийх, кодоо янз бүрийн аргаар (FSM -ийг оруулаад) хэд хэдэн удаа дахин бичихэд хэцүү байсан. Багшийн санал болгосноор бид FSM -ийн аргыг баримталж, тоглоомыг дуусгаж чадсан. Кодыг уламжлалт програмчлалын аргаас илүү техник хангамжид үндэслэн зохиох нь илүү үр дүнтэй болохыг бид мэдсэн. Бид мөн долоон сегментийн дэлгэцтэй холбоотой хэд хэдэн бэрхшээлтэй тулгарсан. Үүнийг "хий үзэгдэлгүйгээр" олон тоог харуулах нь хэцүү байсан бөгөөд үүнийг хийхийн тулд бид цаг хуваагч ашиглах шаардлагатай болсон. Хэрэв бид энэ төслийг цаашид хөгжүүлэх гэж байгаа бол өнгөт LED -ийг Basys3 -т холбож, хэрэглэгч өнгөний тоон дүрслэлээс илүү өнгийг (уламжлалт тоглоом шиг) харах боломжтой болно. Эцэст нь хэлэхэд, бид төгс нөхцөлд симуляци ажиллуулахын оронд нарийн төвөгтэй хэлхээний дизайн, бодит амьдрал дээрх програм хангамж, тоног төхөөрөмжийг ашиглахад тулгарч буй бэрхшээлүүдийн талаар илүү сайн ойлголттой болсон.

Зөвлөмж болгож буй: