Სარჩევი:

Mastermind თამაში VHDL– ში: 3 ნაბიჯი
Mastermind თამაში VHDL– ში: 3 ნაბიჯი

ვიდეო: Mastermind თამაში VHDL– ში: 3 ნაბიჯი

ვიდეო: Mastermind თამაში VHDL– ში: 3 ნაბიჯი
ვიდეო: პირველად ქართულ ონლაინ სივრცეში - Blood on the Clocktower! გიორგი კალატოზთან ერთად 2024, ივლისი
Anonim
მთავარი თამაში VHDL– ში
მთავარი თამაში VHDL– ში
მთავარი თამაში VHDL– ში
მთავარი თამაში VHDL– ში

ჩვენი პროექტისთვის ჩვენ შევქმენით თამაში "Mastermind" VHDL– ში, რომელიც უნდა ითამაშო Basys3 დაფაზე. Mastermind არის კოდის დამრღვევი თამაში, რომელიც ტრადიციულად ტარდება სამაგრებით და სათამაშო დაფით. მოთამაშე ერთი ათავსებს ასორტიმენტის ფერს 4 რიგში, რომელიც იმალება მოთამაშეს ორიდან. მეორე მოთამაშეს აქვს 'x' გამოცნობის რაოდენობა, რომელიც ათავსებს ბორბალს ზედიზედ ერთი მოთამაშისთვის. ყოველი გამოცნობის შემდეგ, მოთამაშეს ორი ეცნობა 2 ნომრის შესახებ: რამდენი მილსადენი არის სწორი ფერი და რამდენი მილსადენი არის სწორ პოზიციაში რიგში. ამ მინიშნებების გამოყენებით, მოთამაშემ მეორე უნდა გამოიცნოს ქინძისთავების სწორი თანმიმდევრობა, რომელიც ერთმა მოთამაშემ განათავსა გამოყოფილ რიცხვში.

ჩვენს განხორციელებაში, თამაში არის ერთი მოთამაშე. პინგის შემთხვევითი კომბინაცია გენერირდება პროგრამის მიერ და მოთამაშემ უნდა გამოიყენოს Basys3 დაფა, რათა გამოიცნოს სწორი თანმიმდევრობა. არსებობს ოთხი "ფერი", რომელიც წარმოდგენილია ორობითი მნიშვნელობებით. 7-სეგმენტიანი ეკრანი აჩვენებს სამ მნიშვნელობას: დარჩენილი ბრუნვები, ქინძისთავების რაოდენობა სწორ მდგომარეობაში და ქინძისთავების რაოდენობა, რომლებიც სწორი ფერია არასწორ პოზიციაში (ეს მნიშვნელობები იწყება 9, 0 და 0). მოთამაშე იყენებს გამგეობას დაფაზე, რომ აირჩიოს ორობითი მნიშვნელობები მისი გამოცნობისთვის და გადაატრიალებს სხვა გადამრთველს გამოცნობის წარსადგენად. თუ ისინი სწორია, თამაში მთავრდება და 7 სეგმენტიანი ეკრანი აჩვენებს "GG". თუ არა, შემობრუნების მრიცხველი მცირდება 1 -ით და მოთამაშე იღებს გამოხმაურებას იმის საფუძველზე, თუ რამდენი ქინძისთავები ემთხვევა მათ კომბინაციაში ქინძისთავების ფერს ან პოზიციას. თუ მოთამაშეს ეცვლება რიგები სწორი გამოცნობის გარეშე, ეკრანზე ნაჩვენებია "GO" (წარმოადგენს თამაშის დასრულებას). მოთამაშეს ასევე შეუძლია გადააყენოს გადატვირთვის გადამრთველი ნებისმიერ დროს თავიდან დასაწყებად.

ნაბიჯი 1: მასალები

მასალები
მასალები
მასალები
მასალები
მასალები
მასალები

მას შემდეგ, რაც მთელი თამაში შეიძლება ითამაშო თავად დაფაზე, საჭიროა მხოლოდ მასალები Basys3 დაფა, მიკრო USB კაბელი დაფაზე დასაკავშირებლად და კომპიუტერი/ლეპტოპი, რომლის საშუალებითაც შეგიძლიათ კოდირება!

ნაბიჯი 2: კოდი

Კოდი
Კოდი
Კოდი
Კოდი

იმისათვის, რომ ეს თამაში იმუშაოს FPGA– ზე, წერის უმარტივესი გზა იქნება სახელმწიფო მანქანის შექმნა. სახელმწიფო აპარატის არსებობა იძლევა თამაშის თანმიმდევრული და ინტერაქტიული გამოცდილების რეალურად მუშაობის საშუალებას. იმისათვის, რომ ყველაფერი შეუფერხებლად იმუშაოს, სახელმწიფო მანქანა დაეფუძნება FPGA– ს შიდა საათის სიგნალს, რაც უზრუნველყოფს ყველაფრის სინქრონიზაციას. მთავარი მოდული არის სახელმწიფო მანქანა ოთხი მდგომარეობით; საწყისი მდგომარეობა (საწყისი), SubmitAnswer State (SubAns), ჩვენების მდგომარეობა (Dis) და CheckEndGame State (CheckEnd). სახელმწიფო მანქანასთან ერთად, ძირითად მოდულს აქვს ორი ქვემოდული, 4-ნიშნა შვიდი სეგმენტის ჩვენება (რომელსაც აქვს საკუთარი ClkDivider ქვემოდულა) და შემთხვევითი რიცხვების გენერატორი (ფაქტიურად ფსევდო-შემთხვევითი რიცხვების გენერატორი). ასევე არსებობს ძირითადი პროცესის ბლოკი, რომ თითოეული ჩამრთველის ზემოთ იყოს ჩართული LED- ები ჩართვისას, რათა ადამიანებმა იხილონ ის, რასაც ისინი უფრო ადვილად შედიან. კოდის ძირითადი მიმოხილვა ჩანს სურათის გონებრივ რუქაზე.

პირველი კომპონენტი, რომელსაც უნდა შევხედოთ, არის შემთხვევითი რიცხვების გენერატორი (შემთხვევითგენი). ვინაიდან ტექნიკურად შეუძლებელია აპარატურიდან წარმოქმნილი ჭეშმარიტი შემთხვევითი რიცხვების მიღება, უმარტივესი გამოსავალი იყო შემთხვევითი გამომწვევი ფაქტიურად იყოს წრფივი უკუკავშირის ცვლის რეგისტრი (LFSR). LFSR– ს აქვს შეყვანის clk და გამომავალი „a“(12 ბიტიანი რიცხვი). ყოველი საათის ციკლი, ახალი 12 ბიტიანი რიცხვი იქმნება "000000000001"-დან, საბოლოოდ გადის 1-ისა და 0-ის 12 ბიტიანი ყველა კომბინაციის გამეორებამდე. გამომავალი "a" მოცემულია ყოველ საათის ციკლში, ასე რომ ის მუდმივად მუშაობს მთელ. Clk არის ასახული Clk– ში ძირითადი მოდულიდან, ხოლო „a“არის ასახული სიგნალზე RandNum მთავარ მოდულში.

მეორე ქვემოდული არის 4 ციფრიანი შვიდი სეგმენტის ჩვენება. ეს არის საკმაოდ პირდაპირი გზა აჩვენოს 4 ციფრიანი შვიდ სეგმენტიანი ჩვენება. ეკრანი დაყენებულია Clk– ზე ძირითადი მოდულიდან, მაგრამ ამ ქვემოდულს აქვს ClkDivider– ის საკუთარი ქვემოდული. ClkDivider (დაყენებულია 1298 Hz) გამოიყენება საათის დასაჩქარებლად შვიდი სეგმენტისთვის ისე, რომ ყველა ციფრი ერთდროულად ჩართული იყოს (ვინაიდან მხოლოდ ერთი ციფრი შეიძლება იყოს ჩართული ერთდროულად). ცვლადი "ციფრი" გამოიყენება ეკრანზე არსებული ლაქების გადასაადგილებლად და თითოეულ ციფრთან ერთად მოდის ძირითადი 4-ბიტიანი შეყვანის ეკრანის პირობები, 0-დან 9-მდე ციფრების ჩვენების ვარიანტებით და ასევე არაფერი. ეკრანზე ყველაზე შორს მდებარე მარცხენა ციფრი არის არაფრის შემცველი, რადგან ის არ გამოიყენება ამ თამაშში.

მთავარი მოდული შედგება სახელმწიფო აპარატისგან. პროცესში ოთხი სახელმწიფოა Initial, SubAns, Dis და CheckEnd. საწყის მდგომარეობაში, თუ SubmitBtn (გადამრთველი გამოიყენება თქვენი პასუხის შესამოწმებლად) არის მითითებული "1", მაშინ მანქანა გადადის SubAns შტატში. ნებისმიერ დროს Rbtn (გადამრთველი, რომელიც გამოიყენება აპარატის გადატვირთვისთვის) დაყენებულია ‘1’, შემდეგ მანქანა უბრუნდება საწყის მდგომარეობას. როდესაც SubAns შტატშია, როდესაც SubmitBtn = ‘0’ ისევ, ის გადადის დის მდგომარეობაზე. დის შტატში ყოფნისას, თუ 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 State (SubAns) ცვლის დათვლის ჩართვის საშუალებას (სიგნალი "შეცვლა") "1" -ზე. ეს საჭიროა შემდგომში შემობრუნების თვალთვალის მუშაობისთვის. ამის შემდეგ, სახელმწიფო ადარებს პლეერის შეყვანას კონცენტრატორებიდან ზემოთ მოცემულ მდგომარეობაში ჩეკებთან. სიგნალი rs1, rs2, rs3, rs4 და სიგნალები rc1, rc2, rc3, rc4 არის მთელი რიცხვი, რომლებიც დამოკიდებულია განცხადებების თუ მითითებულია ან 1 ან 0. სიგნალი rs არის სწორი ადგილისთვის და rc სწორი ფერისთვის. მაგალითად, თუ ფერი 1 მოთამაშის გამოცნობა უდრის RandNum– ის ჩეკ 1 – ს, მაშინ rs1 = 1, ვინაიდან ეს ნიშნავს, რომ სწორი ფერი არის სწორ ადგილას. თუ ფერი 1 არ უტოლდება გამშვებ 1 -ს, მაგრამ უტოლდება ერთ სხვა შემოწმებას, მაშინ rc = 1. ეს კეთდება თითოეული ფერისთვის და თითოეული შემოწმებისთვის.

ჩვენების მდგომარეობა (დის) პირველად ეძებს ათვლის შემთბობს. თუ ის არის "1", მაშინ მცირე რაოდენობა მცირდება 1 -ით (ასე რომ, პირველ შემობრუნებაზე ის 9 -დან 8 -მდე და ა.შ.). წინააღმდეგ შემთხვევაში ბრუნვა არ იცვლება. მიუხედავად იმისა, რომ ჩართულია, ყველა rs მნიშვნელობა ზემოდან ემატება და ენიჭება RSpotCounter სიგნალს. ასევე ყველა rc მნიშვნელობა ემატება და ენიჭება RColorCounter. დაბოლოს, Countdown– ს ენიჭება smallcountdown– ის მნიშვნელობა. სიგნალები RSpotCounter, RColorCounter და Countdown ყველა გარდაქმნილია 4 ბიტიანი std_logic_vectors პროცესის გარეთ და გადატანილია შვიდი სეგმენტის ჩვენების ქვემოდულში პორტის რუქის საშუალებით. ამრიგად, ჩვენება აჩვენებს სწორ ნივთებს, სანამ არ წარმოგიდგენთ ახალ პასუხს.

CheckEnd State არის მოგებული თუ წაგებული. თუ თქვენ გაიმარჯვეთ (ოთხივე ფერი არის სწორ ადგილას, სხვაგვარად ცნობილია როგორც RSpotCounter = 4), მაშინ "GG" (ტექნიკურად ნაჩვენებია 66) ნაჩვენებია შვიდ სეგმენტზე, რათა აჩვენოთ თქვენი გამარჯვება. თუ წაგებული ხართ (Countdown– მა მიაღწია 0 – ს), მაშინ „GO“(ნაჩვენებია ტექნიკურად 60 – ით) ეკრანზე ნაჩვენებია Game Over. ნებისმიერი შედეგის შემთხვევაში, გადატვირთვის ღილაკზე ჩართვა მანქანას დაუბრუნებს საწყის მდგომარეობას, რომ კვლავ ითამაშოს.

წყაროს კოდი შეგიძლიათ იხილოთ აქ.

ნაბიჯი 3: დასკვნა

ამ პროექტის დასრულებამ ბევრი რამ გვასწავლა უფრო რთული სქემების აგების შესახებ. ჩვენი საწყისი დიზაინი არ იყო სასრული მდგომარეობის მანქანა. ჩვენ გაგვიჭირდა გამართვა და კოდის ხელახლა გადაწერა სხვადასხვა მეთოდების გამოყენებით (მათ შორის FSM). ინსტრუქტორის შემოთავაზებით, ჩვენ დავრჩით FSM მიდგომით და ჩვენ შევძელით თამაშის დასრულება. ჩვენ შევიტყვეთ, რომ ბევრად უფრო ეფექტურია კოდის შემუშავება აპარატურაზე დაყრდნობით, ვიდრე ტრადიციული პროგრამირების მიდგომა. ჩვენ ასევე შევხვდით რამდენიმე გამოწვევას, რომელიც დაკავშირებულია შვიდი სეგმენტის ჩვენებასთან. ძნელი იყო მრავალი რიცხვის ჩვენება "მოჩვენების" გარეშე და ჩვენ ამის გამოსაყენებლად გვქონდა საათის გამყოფი. თუ ჩვენ კიდევ უფრო განვავითარებთ ამ პროექტს, ჩვენ დავაკავშირებთ ფერად LED- ებს Basys3– თან, რათა მომხმარებელს შეეძლოს დაინახოს ფერები (როგორც ტრადიციულ თამაშში) და არა ფერების რიცხვითი გამოსახულება. საბოლოო ჯამში, ჩვენ მივიღეთ უფრო დიდი გაგება რთული სქემის დიზაინის, რეალურ ცხოვრებაში პროგრამებისა და აპარატურის გამოყენების გამოწვევების ნაცვლად, ვიდრე სრულყოფილი პირობებით სიმულაციების გაშვება.

გირჩევთ: