فهرست مطالب:

بازی Mastermind در VHDL: 3 مرحله
بازی Mastermind در VHDL: 3 مرحله

تصویری: بازی Mastermind در VHDL: 3 مرحله

تصویری: بازی Mastermind در VHDL: 3 مرحله
تصویری: بررسی بازی Peaky Blinders: Mastermind - زومجی 2024, جولای
Anonim
بازی مغز متفکر در VHDL
بازی مغز متفکر در VHDL
بازی مغز متفکر در VHDL
بازی مغز متفکر در VHDL

برای پروژه خود ، ما بازی "Mastermind" را در VHDL ایجاد کردیم تا روی تخته Basys3 بازی شود. Mastermind یک بازی کد شکن است که به طور سنتی با گیره و تخته بازی انجام می شود. بازیکن یک ، میخ هایی از رنگ های مختلف را در ردیف 4 قرار می دهد که از بازیکن دو پنهان است. بازیکن دو سپس تعداد x را حدس می زند که میله ها را در یک ردیف که برای بازیکن یک قابل مشاهده است روی تخته قرار می دهد. بعد از هر حدس ، بازیکن 2 از 2 شماره مطلع می شود: تعداد میله ها چه رنگی صحیح دارند و چه تعداد میخ در ردیف در موقعیت صحیح قرار دارند. با استفاده از این سرنخ ها ، بازیکن دو باید دنباله صحیح پین هایی را که بازیکن شماره یک در حدس اختصاص داده شده حدس زده است ، حدس بزند.

در اجرای ما ، بازی تک نفره است. ترکیبی تصادفی از گیره ها توسط برنامه ایجاد می شود و بازیکن باید از تخته Basys3 برای حدس زدن ترتیب صحیح استفاده کند. چهار "رنگ" وجود دارد که با مقادیر باینری نشان داده می شوند. صفحه نمایش 7 قسمتی سه مقدار را نشان می دهد: نوبت های باقی مانده ، تعداد پین ها در موقعیت صحیح و تعداد پین هایی که رنگ درست در موقعیت اشتباه است (این مقادیر از 9 ، 0 و 0 شروع می شوند). بازیکن از سوئیچ های روی صفحه برای انتخاب مقادیر دوتایی برای حدس خود استفاده می کند و سوئیچ دیگری را برای ارائه حدس می چرخاند. اگر آنها درست باشند ، بازی تمام می شود و نمایشگر 7 قسمتی "GG" را نشان می دهد. در غیر این صورت ، شمارنده چرخش 1 کاهش می یابد و بازیکن بر اساس تعداد پین هایی که در حدس آنها با رنگ یا موقعیت پین های موجود در ترکیب مطابقت دارد ، بازخورد دریافت می کند. اگر نوبت دهی بازیکن بدون حدس زدن درست تمام شود ، صفحه نمایش "GO" (نشان دهنده بازی به پایان رسیده) را نشان می دهد. پخش کننده همچنین می تواند کلید تنظیم مجدد را برگرداند تا در هر زمان شروع به کار کند.

مرحله 1: مواد

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

از آنجا که کل بازی را می توان روی خود برد انجام داد ، تنها مواد مورد نیاز عبارت Basys3 Board ، یک کابل میکرو USB برای اتصال به برد و یک رایانه/لپ تاپ است که می توانید از آن برای کدگذاری استفاده کنید!

مرحله 2: کد

کد
کد
کد
کد

برای اینکه این بازی روی FPGA کار کند ، ساده ترین راه برای نوشتن آن ایجاد یک ماشین حالت است. داشتن یک ماشین حالت اجازه می دهد تا تجربه متوالی و تعاملی لازم برای بازی در واقع کار کند. برای اینکه همه چیز بدون مشکل اجرا شود ، دستگاه دولتی از سیگنال ساعت داخلی FPGA استفاده می کند و اطمینان حاصل می کند که همه چیز همگام است. ماژول اصلی یک ماشین حالت با چهار حالت است. حالت اولیه (اولیه) ، حالت SubmitAnswer (SubAns) ، وضعیت نمایش (Dis) و وضعیت CheckEndGame (CheckEnd). همراه با دستگاه حالت ، ماژول اصلی دارای دو زیر ماژول است ، صفحه نمایش 4 رقمی Segment Segment (که دارای زیرمجموعه ClkDivider مخصوص به خود است) و ژنراتور شماره تصادفی (در واقع مولد شماره تصادفی psuedo). همچنین یک بلوک فرایند اساسی وجود دارد که چراغ های LED بالای هر سوئیچ هنگام روشن شدن روشن می شوند تا مردم بتوانند راحت تر ببینند چه چیزی را وارد می کنند. یک نمای کلی از کد را می توان در نقشه ذهنی موجود در تصویر مشاهده کرد.

اولین مولفه ای که باید مورد توجه قرار گیرد مولد شماره تصادفی (randomgen) است. از آنجا که بدست آوردن اعداد تصادفی واقعی تولید شده از سخت افزار از نظر فنی امکان پذیر نیست ، ساده ترین راه حل این بود که تصادفی در واقع یک ثبت تغییر خطی (LFSR) باشد. LFSR دارای ورودی clk و خروجی "a" (یک عدد 12 بیتی) است. در هر چرخه ساعت ، یک عدد 12 بیتی جدید با شروع از "000000000001" تولید می شود و در نهایت قبل از تکرار ، تمام ترکیبات 12 بیتی 1 و 0 را طی می کند. خروجی "a" در هر چرخه ساعت داده می شود ، بنابراین به طور مداوم در سراسر اجرا می شود. clk از ماژول اصلی به Clk نگاشته می شود و "a" روی سیگنال RandNum در ماژول اصلی ترسیم می شود.

دومین زیرمجموعه نمایش 4 رقمی Segment Segment است. این یک روش بسیار ساده برای نمایش یک صفحه نمایش 4 رقمی هفت قسمتی است. صفحه نمایش بر روی Clk از ماژول اصلی تنظیم شده است ، اما این زیرمجموعه دارای زیرمجموعه خود ClkDivider است. ClkDivider (روی 1298 هرتز تنظیم شده است) برای افزایش ساعت در Segment Segment استفاده می شود تا همه ارقام به طور همزمان روشن باشند (زیرا در واقع فقط یک رقم می تواند در یک زمان روشن باشد). متغیر "رقم" برای چرخاندن نقاط روی صفحه استفاده می شود و با هر رقم شرایط یک صفحه نمایش اصلی 4 بیتی وارد می شود ، با گزینه هایی برای نشان دادن ارقام 0 تا 9 و همچنین هیچ چیز. دورترین رقم سمت چپ روی صفحه نمایش روی هیچ چیز تنظیم شده است زیرا در این بازی استفاده نمی شود.

ماژول اصلی شامل ماشین حالت است. چهار حالت در این فرآیند عبارتند از Initial ، 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 تنظیم شده است و شمارش معکوس (سیگنالی که در نهایت به شمارش معکوس نگاشته می شود که در واقع هر دور را در حالتهای بعدی تغییر می دهد) روی 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 با check1 RandNum برابر است ، پس rs1 = 1 زیرا این بدان معناست که رنگ مناسب در نقطه مناسب قرار دارد. اگر رنگ 1 با check1 برابر نباشد ، اما با چک های دیگر برابر باشد ، rc = 1. این کار برای هر رنگ و هر چک انجام می شود.

حالت نمایش (Dis) ابتدا به دنبال فعال کننده شمارش معکوس است. اگر "1" باشد ، شمارش معکوس 1 کاهش می یابد (بنابراین در دور اول از 9 به 8 و غیره می رود). در غیر این صورت نوبت تغییر نمی کند صرف نظر از فعال بودن آن ، همه مقادیر rs از بالا جمع می شوند و به سیگنال RSpotCounter اختصاص داده می شوند. همچنین همه مقادیر rc اضافه شده و به RColorCounter اختصاص داده می شود. در نهایت به Countdown مقدار smallcountdown اختصاص داده می شود. سیگنال های RSpotCounter ، RColorCounter و Countdown همگی خارج از فرآیند به std_logic_vector 4 بیتی تبدیل می شوند و از طریق یک نقشه پورت به زیرمدل نمایش Segment Segment منتقل می شوند. به این ترتیب ، صفحه نمایش موارد درستی را نشان می دهد تا زمانی که پاسخ جدیدی ارسال نکنید.

وضعیت CheckEnd مربوط به پیروزی یا شکست شما است. اگر برنده شده اید (هر 4 رنگ در نقطه مناسب قرار دارند ، که در غیر این صورت به عنوان RSpotCounter = 4 شناخته می شوند) ، سپس "GG" (از نظر فنی 66 نشان داده می شود) در هفت بخش نمایش داده می شود تا نشان دهد شما برنده شده اید. اگر شکست خورده اید (شمارش معکوس به 0 رسیده است) ، "GO" (از نظر فنی 60 نشان داده می شود) روی Game Over نشان داده می شود. با هر دو نتیجه ، با روشن کردن کلید تنظیم مجدد ، دستگاه دوباره به حالت اولیه باز می گردد تا دوباره بازی کند.

کد منبع را می توانید در اینجا پیدا کنید.

مرحله 3: نتیجه گیری

تکمیل این پروژه چیزهای زیادی در مورد ساخت مدارهای پیچیده تر به ما آموخت. طراحی اولیه ما یک ماشین حالت محدود نبود. اشکال زدایی و بازنویسی کد چند بار با استفاده از روش های مختلف (از جمله FSM) برای ما مشکل بود. با پیشنهاد مربی ، ما به روش FSM پایبند بودیم و توانستیم بازی را به پایان برسانیم. ما دریافتیم که طراحی کد بر اساس سخت افزار بسیار موثرتر از روش برنامه نویسی سنتی است. ما همچنین با چالش های متعددی در ارتباط با صفحه نمایش هفت قسمتی روبرو بودیم. نمایش چندین شماره بدون "شبح" دشوار بود ، و ما مجبور شدیم از یک تقسیم کننده ساعت برای انجام این کار استفاده کنیم. اگر بخواهیم این پروژه را توسعه دهیم ، LED های رنگی را به Basys3 متصل می کنیم تا کاربر بتواند رنگها را (مانند بازی سنتی) به جای نمایش عددی رنگها ببیند. در نهایت ، ما درک بهتری از طراحی مدار پیچیده ، برنامه های کاربردی در زندگی واقعی و چالش های استفاده از سخت افزار به جای اجرای شبیه سازی با شرایط عالی کسب کردیم.

توصیه شده: