جدول المحتويات:

لعبة العقل المدبر في VHDL: 3 خطوات
لعبة العقل المدبر في VHDL: 3 خطوات

فيديو: لعبة العقل المدبر في VHDL: 3 خطوات

فيديو: لعبة العقل المدبر في VHDL: 3 خطوات
فيديو: ملخص حياة المبرمج 😂 #Shorts 2024, يوليو
Anonim
لعبة العقل المدبر في VHDL
لعبة العقل المدبر في VHDL
لعبة العقل المدبر في VHDL
لعبة العقل المدبر في VHDL

بالنسبة لمشروعنا ، أنشأنا لعبة "Mastermind" في VHDL ليتم لعبها على لوحة Basys3. Mastermind هي لعبة لكسر الشفرات يتم لعبها تقليديًا باستخدام الأوتاد ولوحة اللعب. يضع اللاعب الأول أوتادًا من ألوان متنوعة في صف من 4 ، مخفية عن اللاعب الثاني. عندئذ يكون لدى اللاعب الثاني عدد "x" من التخمينات التي تضع الأوتاد على اللوحة في صف مرئي للاعب الأول. بعد كل تخمين ، يتم إخبار اللاعب الثاني برقمين: كم عدد الأوتاد هي اللون الصحيح ، وعدد الأوتاد الموجودة في الموضع الصحيح في الصف. باستخدام هذه القرائن ، يجب على اللاعب الثاني تخمين التسلسل الصحيح للدبابيس التي وضعها اللاعب في الرقم المخصص للتخمين.

في تطبيقنا ، اللعبة عبارة عن لاعب واحد. يتم إنشاء مجموعة عشوائية من الأوتاد بواسطة البرنامج ، ويجب على اللاعب استخدام لوحة Basys3 لتخمين التسلسل الصحيح. هناك أربعة "ألوان" ممثلة بقيم ثنائية. تعرض الشاشة المكونة من 7 مقاطع ثلاث قيم: المنعطفات المتبقية ، وعدد الدبابيس في الموضع الصحيح ، وعدد الدبابيس التي هي اللون الصحيح في الموضع الخطأ (تبدأ هذه القيم عند 9 و 0 و 0). يستخدم اللاعب المفاتيح الموجودة على اللوحة لتحديد القيم الثنائية لتخمينه ، ويقلب مفتاحًا آخر لتقديم التخمين. إذا كانت صحيحة ، تنتهي اللعبة وتعرض الشاشة المكونة من 7 أجزاء "GG". إذا لم يكن الأمر كذلك ، فسيقل عداد الدوران بمقدار 1 ويتلقى اللاعب ملاحظات بناءً على عدد الدبابيس الموجودة في تخمينه التي تتطابق مع لون أو موضع الدبابيس في المجموعة. إذا نفد اللاعب من الأدوار دون التخمين بشكل صحيح ، تعرض الشاشة "GO" (تمثل انتهاء اللعبة). يمكن للاعب أيضًا قلب مفتاح إعادة الضبط للبدء من جديد في أي وقت.

الخطوة 1: المواد

المواد
المواد
المواد
المواد
المواد
المواد

نظرًا لأنه يمكن لعب اللعبة بأكملها على اللوحة نفسها ، فإن المواد الوحيدة المطلوبة هي Basys3 Board وكابل USB صغير للاتصال باللوحة وجهاز كمبيوتر / كمبيوتر محمول يمكنك استخدامه للتشفير!

الخطوة الثانية: الكود

الرمز
الرمز
الرمز
الرمز

لكي تعمل هذه اللعبة على FPGA ، فإن أبسط طريقة للكتابة هي إنشاء آلة حالة. إن امتلاك جهاز حالة يسمح بالتجربة المتسلسلة والتفاعلية اللازمة لكي تعمل اللعبة بالفعل. لكي يعمل كل شيء بسلاسة ، ستعتمد آلة الحالة على إشارة الساعة الداخلية لـ FPGA ، مما يضمن مزامنة كل شيء. الوحدة الرئيسية هي آلة دولة ذات أربع حالات ؛ الحالة الأولية (الضبط الاولي) ، حالة SubmitAnswer (SubAns) ، حالة العرض (Dis) ، وحالة CheckEndGame (CheckEnd). إلى جانب جهاز الحالة ، تحتوي الوحدة الرئيسية على وحدتين فرعيتين ، وشاشة عرض سبعة أجزاء مكونة من 4 أرقام (والتي تحتوي على وحدة ClkDivider الفرعية الخاصة بها) ، ومولد الأرقام العشوائية (في الواقع مولد رقم عشوائي عشوائي). هناك أيضًا كتلة عملية أساسية لتشغيل مصابيح LED الموجودة أعلى كل مفتاح عند تشغيلها كطريقة يمكن للأشخاص من خلالها رؤية ما يقومون بإدخاله بشكل أسهل. يمكن رؤية نظرة عامة أساسية على الكود في الخريطة الذهنية المصورة.

المكون الأول الذي يجب النظر إليه هو مولد الأرقام العشوائية (randomgen). نظرًا لأنه ليس من الممكن تقنيًا الحصول على أرقام عشوائية حقيقية يتم إنشاؤها من الأجهزة ، كان الحل الأبسط هو أن يكون العشوائي في الواقع عبارة عن سجل تحول للتغذية الراجعة الخطية (LFSR). يحتوي LFSR على إدخال clk ومخرج "a" (رقم 12 بت). في كل دورة ساعة ، يتم إنشاء رقم جديد مكون من 12 بت بدءًا من "000000000001" ، ثم يمر في النهاية بجميع مجموعات 12 بت من 1 و 0 قبل أن يعيد نفسه. يتم إعطاء الإخراج "a" في كل دورة على مدار الساعة ، لذا فهو يعمل باستمرار طوال الوقت. يتم تعيين clk إلى Clk من الوحدة الرئيسية ، ويتم تعيين "a" للإشارة RandNum في الوحدة النمطية الرئيسية.

الوحدة الفرعية الثانية هي عرض الأجزاء السبعة المكون من 4 أرقام. هذه طريقة مباشرة جدًا لعرض شاشة مكونة من 4 أرقام من سبعة أجزاء. تم ضبط العرض على Clk من الوحدة الرئيسية ، ومع ذلك فإن هذه الوحدة الفرعية لديها وحدة فرعية خاصة بها من ClkDivider. يتم استخدام ClkDivider (تم ضبطه على 1298 هرتز) لتسريع الساعة للجزء السبعة بحيث تظهر جميع الأرقام في نفس الوقت (حيث يمكن تشغيل رقم واحد فقط في كل مرة). يُستخدم المتغير "رقم" للتنقل بين النقاط الموجودة على الشاشة ، ومع كل رقم تأتي شروط عرض إدخال أساسي 4 بت ، مع خيارات لإظهار الأرقام من 0 إلى 9 وأيضًا لا شيء. يتم تعيين الرقم الأبعد على الشاشة على "لا شيء" نظرًا لعدم استخدامه في هذه اللعبة.

تتكون الوحدة الرئيسية من آلة الحالة. الحالات الأربع في العملية هي الأولي و SubAns و Dis و CheckEnd. عندما تكون في الحالة الأولية ، إذا تم تعيين SubmitBtn (رمز التبديل المستخدم لإرسال إجابتك للفحص) على "1" ، فحينئذٍ ينتقل الجهاز إلى حالة SubAns. يتم تعيين أي وقت Rbtn (المفتاح المستخدم لإعادة ضبط الجهاز) على "1" ، ثم يعود الجهاز إلى الحالة الأولية. عندما تكون في حالة SubAns ، عندما يكون SubmitBtn = "0" مرة أخرى ، ينتقل إلى حالة Dis. عندما تكون في حالة Dis ، إذا كان العد التنازلي = 0 (المنعطفات لليسار للتخمين انخفض إلى 0) أو إذا كان RSpotCount = 4 (بمعنى أن اللاعب هو كل الألوان الصحيحة في الأماكن الصحيحة) ، ينتقل الجهاز إلى حالة CheckEnd. إذا لم يحدث أي من هذين الأمرين ، فعند SubmitBtn = "1" مرة أخرى ، فإنه يعود إلى حالة SubAns للسماح بتخمين آخر. عندما تكون في حالة CheckEnd ، فهذه هي نهاية اللعبة ، والطريقة الوحيدة للخروج هي الضغط على إعادة الضبط ، وإعادتها إلى الحالة الأولية. يمكن عرض هذا بسهولة في مخطط آلة الحالة. من الناحية السلوكية ، تقوم الحالة الأولية بتهيئة كل شيء مرة أخرى إلى موضع البداية. تم ضبط العد التنازلي (الإشارة التي تحفظ عدد مرات دوران المشغل على اليسار) على 9 ، تم تعيين RSpotCount (الإشارة التي تحفظ عدد الألوان التي توقعتها في المكان الصحيح) على 0 ، RColorCount (إشارة توفر كم من تم تعيين الألوان التي خمنتها على أنها صحيحة ولكن في المكان الخطأ) على 0 ، ويتم تعيين العد التنازلي الصغير (الإشارة التي تم تعيينها في النهاية إلى العد التنازلي والتي تغير كل منعطف في حالات لاحقة) على 9. أيضًا ، في الحالة الأولية ، يتم تعيين RandNum (عدد psuedo-random المولدة) ينقسم إلى أربعة فحوصات مختلفة (واحد لكل لون 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 لا يساوي الاختيار 1 ، ولكنه يساوي أحد الشيكات الأخرى ، فإن rc = 1. يتم ذلك لكل لون وكل فحص.

تبحث حالة العرض (Dis) أولاً عن أداة تمكين العد التنازلي. إذا كان "1" ، فإن smallcountdown ينخفض بمقدار 1 (لذا في المنعطف الأول ، ينتقل من 9 إلى 8 إلخ.). وإلا فإن الدور لا يتغير. بغض النظر عن هذا التمكين ، تتم إضافة جميع قيم rs الواردة أعلاه وتعيينها للإشارة RSpotCounter. يتم أيضًا إضافة جميع قيم RC وتعيينها إلى RColorCounter. أخيرًا ، يتم تعيين قيمة العد التنازلي الصغير. يتم تحويل كل إشارات RSpotCounter و RColorCounter و Countdown إلى متجهات std_logic_vector 4 بت خارج العملية ، ويتم دفعها إلى الوحدة النمطية للعرض Seven Segment من خلال خريطة منفذ. بهذه الطريقة ، تُظهر الشاشة الأشياء الصحيحة حتى ترسل إجابة جديدة.

حالة CheckEnd هي ما إذا كنت قد فزت أو خسرت. إذا كنت قد فزت (جميع الألوان الأربعة في المكان الصحيح ، والمعروفة باسم RSpotCounter = 4) ، فسيتم عرض "GG" (يظهر تقنيًا كـ 66) في الجزء السابع لإظهار أنك فزت. إذا خسرت (وصل العد التنازلي إلى 0) ، فسيتم عرض "GO" (يظهر تقنيًا على شكل 60) على شاشة Game Over. مع أي من النتيجتين ، سيؤدي الضغط على مفتاح إعادة الضبط إلى تشغيل إلى إعادة الجهاز إلى الحالة الأولية للتشغيل مرة أخرى.

يمكن العثور على شفرة المصدر هنا.

الخطوة الثالثة: الخاتمة

علمنا إكمال هذا المشروع الكثير عن بناء دوائر أكثر تعقيدًا. لم يكن تصميمنا الأولي آلة دولة محدودة. وجدنا صعوبة في تصحيح الأخطاء وإعادة كتابة الكود عدة مرات باستخدام طرق مختلفة (بما في ذلك FSM). بناءً على اقتراح المدرب ، تمسكنا بنهج ولايات ميكرونيزيا الموحدة وتمكنا من إنهاء اللعبة. لقد تعلمنا أن تصميم الكود بناءً على الأجهزة أكثر فاعلية من تصميمه باستخدام نهج البرمجة التقليدي. لقد واجهنا أيضًا العديد من التحديات المتعلقة بعرض الأجزاء السبعة. كان من الصعب الحصول عليها لعرض أرقام متعددة دون "الظلال" ، وكان علينا استخدام مقسم الساعة لإنجاز ذلك. إذا أردنا تطوير هذا المشروع بشكل أكبر ، فسنقوم بتوصيل مصابيح LED الملونة بـ Basys3 حتى يتمكن المستخدم من رؤية الألوان (كما هو الحال في اللعبة التقليدية) بدلاً من التمثيلات الرقمية للألوان. في النهاية ، اكتسبنا فهمًا أكبر لتصميم الدوائر المعقدة ، وتطبيقات الحياة الواقعية ، وتحديات استخدام الأجهزة بدلاً من تشغيل عمليات المحاكاة في ظروف مثالية.

موصى به: