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

VHDL Basys3: لعبة توصيل 4: 5 خطوات
VHDL Basys3: لعبة توصيل 4: 5 خطوات

فيديو: VHDL Basys3: لعبة توصيل 4: 5 خطوات

فيديو: VHDL Basys3: لعبة توصيل 4: 5 خطوات
فيديو: BASYS 3-GER 2024, شهر نوفمبر
Anonim
VHDL Basys3: لعبة توصيل 4
VHDL Basys3: لعبة توصيل 4

مقدمة:

هذه لعبة Connect 4 Digital Logic Game مصممة في VHDL باستخدام برنامج Vivado ومبرمجة على لوحة Basys3. بناء وتصميم هذا المشروع وسيط ، ولكن يمكن للقادمين الجدد نسخ الخطوات وبناء اللعبة الرقمية.

تعمل اللعبة مثل لعبة Connect 4. يمكن للاعبين تحريك مؤشرهم عبر الشاشة باستخدام الزرين الأيمن والأيسر الموجودين على اللوحة. سيؤدي الضغط على الزر الأوسط على اللوحة إلى قيام اللاعب بوضع علامة التحديد الخاصة به على هذا العمود ثم يصبح دور اللاعب التالي. بمجرد فوز اللاعب ، يمكن إعادة ضبط اللعبة بالضغط على الزر لأعلى على اللوحة.

الخطوة 1: تفاصيل ومواد سريعة

تفاصيل فنية سريعة:

  • يستخدم ثلاث مجموعات من اتصالات PMOD على اللوحة (JA ، JB ، JC)

    • تستخدم 8 دبابيس (باستثناء دبابيس Vcc و GND) لكل موصل PMOD
    • JA - التحكم في الصفوف
    • JB - التحكم في الأعمدة الخضراء
    • JC - التحكم في الأعمدة الحمراء
  • تعمل ساعة الشاشة عند 960 هرتز

    يتم تشغيل 8 مصابيح LED فقط في وقت معين. يتم تحديث الشاشة بسرعة كافية على مدار الساعة بحيث يتم إعطاء الوهم بوجود أكثر من 8 مصابيح LED تعمل في وقت معين

  • تعمل ساعة الزر عند 5 هرتز ؛ اختياريا يمكن تغريم ضبطها عن طريق تحرير كود VHDL.
  • المقاومة الداخلية لصفائف دارلينجتون كافية لمنع احتراق LED

تم تصميم اللعبة باستخدام المكونات والأدوات التالية:

  • (1) مجلس Basys3
  • (2) مصفوفة LED ثنائية اللون 8x5:
  • (2) ULN2803 - مصفوفات دارلينجتون الترانزستور - ورقة البيانات
  • مكبات الأسلاك
  • أسلاك العبور
  • متجرد الأسلاك
  • ألواح التوصيل (يجب أن تكون المربعات الكبيرة كافية)
  • جهاز القياس المتعدد ومزود الطاقة (استكشاف الأخطاء وإصلاحها)

الخطوة 2: توصيل الجهاز

توصيل الجهاز
توصيل الجهاز
توصيل الجهاز
توصيل الجهاز

القواعد الارشادية:

يمكن أن تكون الأسلاك الخاصة بالمشروع معقدة للغاية ، يرجى أخذ وقتك والتحقق من أن جميع التوصيلات صحيحة مجموعة واحدة في كل مرة.

يتضمن المشروع استخدام شاشتين LED ولكن يتم دمجهما لتشكيل شاشة واحدة كبيرة. يمكن تحقيق ذلك عن طريق توصيل جميع الصفوف بنفس النقطة. نظرًا لأن كل شاشة ثنائية اللون ، يجب أيضًا ربط الصفين الأحمر والأخضر لشاشة واحدة بالصفين الأحمر والأخضر للشاشة الأخرى. من خلال القيام بذلك ، يمكننا التحكم في جميع الصفوف باستخدام 8 دبابيس فقط. تُستخدم الدبابيس الـ 16 الأخرى للتحكم في أعمدة العرض. يمكن توصيل الدبابيس الثمانية للموصلات مباشرة عبر كبلات التوصيل. تنتقل اتصالات Pmod أولاً إلى إدخال ULN2083A ويتم توصيل خرج ULN2083A مباشرةً بالعمود الموجود على الشاشة. نظرًا لأن التصميم يبلغ 8 × 8 ، فلن يتم توصيل بعض الأعمدة فعليًا.

  • JA: وصلات الصف: الصف 1 إلى JA: 1 إلى الصف 8 لـ JA: 10.
  • JA: اتصالات العمود الأحمر:
  • JC: اتصالات العمود الأخضر

يرجى الرجوع إلى الصور المنشورة لمعرفة الدبابيس التي تتوافق مع الصفوف / الأعمدة.

ملاحظة: تحتوي الترانزستورات على مقاومات ، لذا لا تتطلب مصابيح LED مقاومة إضافية لتوصيلها على التوالي.

الخطوة 3: الشرح الفني: الشاشة

الشاشة تعمل على ثبات الرؤية. يتم تحديث الشاشة بسرعة كبيرة ، بحيث لا يمكن للعين البشرية أن تكتشف بشكل واضح أن بعض مصابيح LED يتم إيقاف تشغيلها وتشغيلها بسرعة. في الواقع ، من خلال إبطاء ساعة العرض ، يمكن للمرء أن يلاحظ الوميض.

تعمل الشاشة على تشغيل جميع الصفوف الثمانية وفقًا للبيانات المخزنة لتلك الصفوف ، ويتم تشغيل الشاشة في عمود واحد. ثم ينتقل بسرعة إلى إدخال البيانات التالي للصفوف الثمانية وتشغيل العمود التالي - مع إيقاف تشغيل جميع الأعمدة الأخرى. تستمر هذه العملية بسرعة ساعة كافية بحيث يصبح وميض مؤشر LED غير ملحوظ.

تتم تهيئة تخزين البيانات للعرض فورًا بعد الهندسة المعمارية في ملف VHDL بالطريقة التالية:

إشارة RedA و RedB و RedC و RedD و RedE و RedF و RedG و RedH: std_logic_vector (7 downto 0): = "00000000" ؛

إشارة GreenA، GreenB، GreenC، GreenD، GreenE، GreenF، GreenG، GreenH: std_logic_vector (7 downto 0): = "00000000" ؛ - بيانات الصف حسب العمود: أخضر

فيما يلي مقتطف صغير من العملية التي تتحكم في مصفوفة شاشة LED.

- العملية التي تتحكم في عرض مصفوفة شاشة LED: العملية (ColCLK) - 0-16 لتحديث كل من 8X8 RED و 8x8 GREEn متغير مصفوفة RowCount: نطاق عدد صحيح من 0 إلى 16: = 0 ؛ ابدأ إذا (Rising_edge (ColCLK)) ثم إذا (RowCount = 0) ثم DORow <= RedA؛ - بيانات الصف للعمود المقابل DOCol <= "1000000000000000" ؛ - مشغل العمود - كرر هذا الرمز على طول الطريق إلى "0000000000000001" - التغيير إلى RedB ، RedC … GreenA ، GreenB … GreenH

في نهاية GreenH ، مباشرة قبل إنهاء العملية ، يتم تضمين هذا المقتطف لإعادة تعيين RowCount إلى الصفر.

إذا (RowCount = 15) ثم - إعادة التحديث من العمود A RowCount: = 0 ؛ آخر RowCount: = RowCount + 1 ؛ - التحول من خلال نهاية الأعمدة إذا ؛

الآن ، لشرح الساعة الموجودة في قائمة الحساسية لعملية العرض. تحتوي لوحة Basys3 على ساعة داخلية تعمل بتردد 100 ميجاهرتز. لأغراضنا ، هذه الساعة سريعة جدًا لذا سنحتاج إلى تقسيم هذه الساعة إلى ساعة 960 هرتز باستخدام العملية التالية.

- عملية الساعة تعمل عند 960 هرتز CLKDivider: عملية (CLK) متغير clkcount: نطاق عدد صحيح من 0 إلى 52083: = 0 ؛ ابدأ إذا (Rising_edge (CLK)) ثم clkcount: = clkcount + 1 ؛ إذا (clkcount = 52083) ثم ColCLK <= not (ColCLK) ؛ clkcount: = 0 ؛ إنهاء إذا؛ إنهاء إذا؛ إنهاء العملية؛

الخطوة 4: الشرح الفني: تغيير المعلومات المعروضة

الشرح الفني: تغيير المعلومات المعروضة
الشرح الفني: تغيير المعلومات المعروضة

في كود VHDL ، يتم التحكم في المعلومات أو البيانات التي سيتم عرضها على الشاشة من خلال عملية المؤشر ، والتي تحتوي على ساعة مختلفة في قائمة الحساسية الخاصة بها. كان يسمى هذا الرمز BtnCLK ، وهي ساعة مصممة لتقليل تنقيط الأزرار عند الضغط عليها. يتم تضمين هذا بحيث إذا تم الضغط على زر ، فإن المؤشر الموجود في الصف العلوي لا يتحرك بسرعة كبيرة عبر الأعمدة.

- عملية الساعة تعمل عند 5 هرتز. الزر CLK: عملية (CLK) متغير btnclkcount: نطاق عدد صحيح من 0 إلى 10000001: = 0 ؛ ابدأ إذا (Rising_edge (CLK)) ثم إذا (btnclkcount = 10000000) ثم btnclkcount: = 0 ؛ BtnCLK <= not (BtnCLK) ؛ آخر btnclkcount: = btnclkcount + 1 ؛ إنهاء إذا؛ إنهاء إذا؛ إنهاء العملية؛

من خلال إخراج إشارة BtnCLK لهذه العملية ، يمكننا الآن شرح عملية المؤشر. تحتوي عملية المؤشر على BtnCLK فقط في قائمة الحساسية الخاصة بها ولكن في كتلة التعليمات البرمجية ، يتم فحص حالة الأزرار وسيؤدي ذلك إلى تغيير بيانات RedA و RedB … GreenH. فيما يلي مقتطف من رمز المؤشر ، والذي يتضمن كتلة إعادة التعيين وكتلة العمود الأول.

المؤشر: عملية (BtnCLK) متغير OCursorCol: STD_LOGIC_VECTOR (2 downto 0): = "000"؛ - OCursorCol يتتبع متغير العمود السابق NCursorCol: STD_LOGIC_VECTOR (2 أسفل حتى 0): = "000" ؛ - يعين NCursorCol عمود مؤشر جديد يبدأ - شرط RESET (زر UP) - يتم مسح اللوحة لإعادة تشغيل اللعبة إذا كان (RST = '1') ثم RedA <= "00000000" ؛ RedB <= "00000000" ؛ RedC <= "00000000" ؛ أحمر <= "00000000" ؛ RedE <= "00000000" ؛ أحمر F <= "00000000" ؛ RedG <= "00000000" ؛ أحمر H <= "00000000" ؛ GreenA <= "00000000" ؛ جرين ب <= "00000000" ؛ GreenC <= "00000000" ؛ الأخضر <= "00000000" ؛ أخضر E <= "00000000" ؛ GreenF <= "00000000" ؛ GreenG <= "00000000" ؛ GreenH if (Lbtn = '1') ثم NCursorCol: = "111" ؛ - العمود H elsif (Rbtn = '1') ثم NCursorCol: = "001" ؛ - العمود B elsif (Cbtn = '1') ثم NCursorCol: = OCursorCol ؛ - يظل العمود على حاله NTurnState <= not (TurnState) ؛ - تفعّل دور اللاعب التالي - لفحص العمود الحالي من الأسفل إلى الأعلى وتشغيل أول مؤشر LED غير مضاء. يعتمد اللون على لون مؤشر اللاعب الحالي. لـ ck في 7 إلى حلقة واحدة إذا (RedA (0) = '1') و (RedA (ck) = '0') و (GreenA (ck) = '0') ثم RedA (Ck) <= '1' ؛ RedA (0) <= '0' ؛ خروج؛ إنهاء إذا؛

إذا (GreenA (0) = '1') و (RedA (ck) = '0') و (GreenA (ck) = '0') إذن

GreenA (Ck) <= '1' ؛ GreenA (0) - Red Player GreenA (0) <= '0' ؛ إذا (NCursorCol = OCursorCol) إذن - إذا لم يتم الضغط على أي شيء RedA (0) <= '1' ؛ elsif (NCursorCol = "111") إذن - إذا تم الضغط على Lbtn أحمر (0) <= '1'؛ RedA (0) <= '0' ؛ elsif (NCursorCol = "001") ثم - تم الضغط على Iff Rbtn RedB (0) <= '1'؛ RedA (0) - Green Player RedA (0) <= '0' ؛ إذا (NCursorCol = OCursorCol) ثم GreenA (0) <= '1' ؛ elsif (NCursorCol = "111") ثم GreenH (0) <= '1'؛ GreenA (0) <= '0' ؛ elsif (NCursorCol = "001") ثم GreenB (0) <= '1'؛ GreenA (0) <= '0' ؛ إنهاء إذا؛ حالة النهاية

ملاحظة ، عبارة الحالة الأولى تسمى: OCursorCol (والتي تعني عمود المؤشر القديم) هي بداية آلة الحالة المحدودة. يتم التعامل مع كل عمود في العرض على أنه حالته الخاصة في ولايات ميكرونيزيا الموحدة. هناك 8 أعمدة لذلك تم استخدام مجموعة أرقام ثنائية مكونة من 3 بتات لتحديد كل عمود كحالة. تعتمد طريقة تحرك FSM بين الحالة على الزر الذي يتم الضغط عليه. في المقتطف أعلاه ، إذا تم الضغط على الزر الأيسر ، سينتقل FSM إلى "111" والذي سيكون العمود الأخير من الشاشة. إذا تم الضغط على الزر الأيمن ، فسوف تنتقل FSM إلى "001" والذي سيكون العمود الثاني من الشاشة.

إذا تم الضغط على الزر الأوسط ، فلن تنتقل FSM إلى حالة جديدة ولكنها ستؤدي بدلاً من ذلك إلى إحداث تغيير في إشارة TurnState ، وهي إشارة من بت واحد لملاحظة دوران اللاعب. بالإضافة إلى ذلك ، سيقوم الزر الأوسط بتشغيل كتلة تعليمات برمجية تتحقق مما إذا كان هناك صف فارغ في الأسفل وصولاً إلى الأعلى. سيحاول وضع علامة في الصف السفلي غير المملوء. تذكر ، هذه لعبة ربط أربعة.

في عبارة الحالة المتداخلة التي تسمى: TurnState ، نقوم بتغيير لون المؤشر وأي عمود في الصف الأول نريد تغيير البيانات من أجله بحيث يمكن لعملية العرض أن تعكس التغيير.

نكرر هذا الرمز الأساسي للحالات السبع المتبقية. يمكن أن يكون مخطط ولايات ميكرونيزيا الموحدة مفيدًا في فهم كيفية تغير الحالات.

الخطوة 5: الكود

الشفرة
الشفرة

هذا هو الكود الوظيفي لـ Connect 4 الذي يمكن تجميعه في VHDL باستخدام برنامج Vivado.

يتم توفير قيد أيضًا للسماح لك بتشغيل اللعبة وتشغيلها.

قدمنا مخططًا للكتل يوضح كيفية ترابط مدخلات ومخرجات كل عملية.

موصى به: