فهرست مطالب:

VHDL Basys3: Connect 4 بازی: 5 مرحله
VHDL Basys3: Connect 4 بازی: 5 مرحله

تصویری: VHDL Basys3: Connect 4 بازی: 5 مرحله

تصویری: VHDL Basys3: Connect 4 بازی: 5 مرحله
تصویری: 9 Install vivado create first project and implementation on zedboard zynq7020 xilinx 2024, نوامبر
Anonim
بازی VHDL Basys3: Connect 4
بازی VHDL Basys3: Connect 4

معرفی:

این یک بازی منطقی منطقی Connect 4 است که با استفاده از نرم افزار Vivado در VHDL طراحی شده و برای برد Basys3 برنامه ریزی شده است. ساخت و طراحی این پروژه متوسط است ، اما افراد تازه وارد می توانند مراحل را کپی کرده و بازی دیجیتال را بسازند.

این بازی مانند بازی Connect 4 عمل می کند. بازیکنان می توانند با استفاده از دکمه های چپ و راست موجود در صفحه ، مکان نما خود را روی صفحه حرکت دهند. فشار دادن دکمه وسط روی تخته باعث می شود که بازیکن نشانگر خود را روی آن ستون قرار دهد و سپس نوبت بازیکن بعدی خواهد شد. هنگامی که یک بازیکن برنده شد ، بازی را می توان با فشار دادن دکمه بالا در صفحه بازنشانی کرد.

مرحله 1: جزئیات سریع و مواد

جزئیات فنی سریع:

  • از سه مجموعه اتصالات PMOD روی برد (JA ، JB ، JC) استفاده می کند

    • 8 پین (بدون احتساب Vcc و پین GND) برای هر اتصال PMOD استفاده می شود
    • JA - کنترل ردیف ها
    • JB - کنترل ستون های سبز
    • JC - کنترل ستون های قرمز
  • ساعت صفحه نمایش با فرکانس 960 هرتز کار می کند

    فقط 8 LED در یک زمان معین روشن است. صفحه نمایش با سرعتی به اندازه کافی سریع به روز می شود که این توهم وجود دارد که بیش از 8 LED در یک زمان مشخص روشن است

  • ساعت دکمه ای در 5Hz کار می کند. به صورت اختیاری می توان با ویرایش کد VHDL ، جریمه کرد.
  • مقاومت داخلی آرایه های دارلینگتون برای جلوگیری از فرسودگی LED کافی است

بازی با استفاده از اجزا و ابزارهای زیر ساخته شده است:

  • (1) هیئت مدیره Basys3
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - آرایه های ترانزیستور دارلینگتون - برگه اطلاعات
  • قرقره های سیم
  • سیم های جامپر
  • استریپر سیم
  • تخته نان (میدان بزرگ باید کافی باشد)
  • مولتی متر و منبع تغذیه (عیب یابی)

مرحله 2: اتصال سخت افزار

اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار

دستورالعمل ها:

سیم کشی پروژه می تواند بسیار پیچیده باشد ، لطفاً وقت بگذارید و بررسی کنید که همه اتصالات در یک زمان درست است.

این پروژه شامل استفاده از دو صفحه LED است اما با هم ترکیب شده و یک صفحه بزرگ را تشکیل می دهند. این را می توان با اتصال همه سطرها به یک نقطه انجام داد. از آنجا که هر صفحه دو رنگ است ، ردیف های قرمز و سبز یک صفحه نیز باید به ردیف های قرمز و سبز صفحه دیگر گره خورده باشد. با این کار می توانیم تمام ردیف ها را تنها با 8 پین کنترل کنیم. 16 پین دیگر برای کنترل ستون های صفحه نمایش استفاده می شود. 8 پایه برای قوطی را می توان مستقیماً از طریق کابل های بلوز به اتصالات pmod متصل کرد. اتصالات Pmod ابتدا به ورودی ULN2083A می روند و خروجی ULN2083A مستقیماً به ستون روی صفحه متصل می شود. از آنجا که طراحی 8x8 است ، برخی از ستون ها از نظر فیزیکی به هم متصل نمی شوند.

  • 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 پایین 0): = "00000000"؛

سیگنال GreenA ، GreenB ، GreenC ، GreenD ، GreenE ، GreenF ، GreenG ، GreenH: std_logic_vector (7 پایین 0): = "00000000" ؛ - ردیف داده ها بسته به ستون: GREEN

در زیر یک قطعه کوچک از فرآیند کنترل ماتریس صفحه نمایش LED را مشاهده می کنید.

- فرایندی که ماتریس نمایشگر LED را کنترل می کند نمایش: روند (ColCLK) - 0 - 16 برای تازه سازی هر دو متغیر RXCount 8X8 RED و 8x8 GREEn: دامنه صحیح 0 تا 16: = 0 ؛ if را شروع کنید (افزایش_دانه (ColCLK)) سپس if (RowCount = 0) سپس DORow <= RedA؛ - داده های ردیف برای ستون مربوطه DOCol <= "1000000000000000" ؛ - ستون محرک- این کد را تا انتها تا "0000000000000001" تکرار کنید- تغییر به RedB ، RedC … GreenA ، GreenB … GreenH

در پایان GreenH ، درست قبل از اتمام فرآیند ، این قطعه برای بازنشانی RowCount به صفر قرار داده می شود.

if (RowCount = 15) سپس - راه اندازی مجدد از ستون A RowCount: = 0 ؛ else RowCount: = RowCount + 1؛ - تغییر در ستون ها اگر؛

اکنون ، برای توضیح ساعت که در لیست حساسیت فرآیند نمایش قرار دارد. برد Basys3 دارای یک ساعت داخلی با سرعت 100 مگاهرتز است. برای اهداف ما ، این یک ساعت بسیار سریع است ، بنابراین ما باید با استفاده از فرایند زیر این ساعت را به یک ساعت 960Hz تقسیم کنیم.

- فرایند ساعت در 960 هرتز کار می کند CLKDivider: متغیر فرآیند (CLK) شروع کنید اگر (افزایش_پهنج (CLK)) سپس clkcount: = clkcount + 1؛ اگر (clkcount = 52083) سپس ColCLK <= نه (ColCLK) ؛ clkcount: = 0؛ پایان اگر؛ پایان اگر؛ پایان فرایند ؛

مرحله 4: توضیح فنی: تغییر اطلاعات نمایش داده شده

توضیح فنی: تغییر اطلاعات نمایش داده شده
توضیح فنی: تغییر اطلاعات نمایش داده شده

در کد VHDL ، اطلاعات یا داده هایی که روی صفحه نمایش داده می شود توسط فرایند مکان نما کنترل می شود ، که ساعت متفاوتی در لیست حساسیت خود دارد. این کد BtnCLK نام داشت ، ساعتی که به منظور به حداقل رساندن تغییر شکل دکمه ها در زمان فشردن آنها طراحی شده بود. این شامل می شود به طوری که اگر دکمه ای را فشار دهید ، مکان نما در ردیف بالا به سرعت در ستون ها حرکت نمی کند.

- فرایند ساعت در 5 هرتز کار می کند. دکمه CLK: متغیر process (CLK) btnclkcount: محدوده صحیح 0 تا 10000001: = 0 ؛ if را شروع کنید (افزایش_لبه (CLK)) سپس if (btnclkcount = 10000000) سپس btnclkcount: = 0؛ BtnCLK <= نه (BtnCLK) ؛ else btnclkcount: = btnclkcount + 1؛ پایان اگر؛ پایان اگر؛ پایان فرایند ؛

با خروجی سیگنال BtnCLK این فرایند ، اکنون می توانیم روند مکان نما را توضیح دهیم. فرآیند مکان نما فقط BtnCLK را در لیست حساسیت خود دارد ، اما در بلوک کد ، وضعیت دکمه ها بررسی می شود و این باعث می شود که داده های RedA ، RedB … GreenH تغییر کند. در اینجا قطعه ای از کد مکان نما است که شامل بلوک بازنشانی و بلوک ستون اول است.

مکان نما: process (BtnCLK) متغیر OCursorCol: STD_LOGIC_VECTOR (2 پایین 0): = "000"؛ - OCursorCol متغیر ستون قبلی NCursorCol را پیگیری می کند: STD_LOGIC_VECTOR (2 پایین 0): = "000" ؛ -NCursorCol ستون مکان نما را آغاز می کند-شرط بازنشانی (دکمه بالا)-تخته برای شروع مجدد بازی پاک می شود اگر (افزایش RedB <= "00000000"؛ RedC <= "00000000"؛ RedD <= "00000000"؛ RedE <= "00000000"؛ RedF <= "00000000"؛ RedG <= "00000000"؛ RedH <= "00000000"؛ GreenA <= "00000000"؛ GreenB <= "00000000"؛ GreenC <= "00000000"؛ GreenD <= "00000000"؛ GreenE <= "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 پایین 1 حلقه اگر (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) - بازیکن قرمز GreenA (0) <= '0'؛ اگر (NCursorCol = OCursorCol) سپس - اگر چیزی RedA (0) <= '1' را فشار نداده بود ؛ elsif (NCursorCol = "111") سپس - اگر Lbtn RedH فشار داده شود (0) <= '1' ؛ RedA (0) <= '0'؛ elsif (NCursorCol = "001") سپس - اگر Rbtn RedB (0) <= '1' فشار داده شد ؛ RedA (0) - بازیکن سبز RedA (0) <= '0'؛ if (NCursorCol = OCursorCol) سپس GreenA (0) <= '1'؛ elsif (NCursorCol = "111") سپس GreenH (0) <= '1'؛ GreenA (0) <= '0'؛ elsif (NCursorCol = "001") سپس GreenB (0) <= '1'؛ GreenA (0) <= '0'؛ پایان اگر؛ مورد نهایی ؛

توجه داشته باشید ، اولین عبارت موردی به نام: OCursorCol (که مخفف ستون مکان نما قدیمی است) شروع ماشین حالت محدود است. هر ستون از صفحه نمایش به عنوان حالت خود در FSM رفتار می شود. 8 ستون وجود دارد ، بنابراین از یک عدد باینری 3 بیتی برای شناسایی هر ستون به عنوان حالت استفاده شد. نحوه حرکت FSM بین حالت بستگی به دکمه فشرده شده دارد. در قطعه بالا ، اگر دکمه سمت چپ را فشار دهید ، FSM به "111" که آخرین ستون صفحه نمایش است ، منتقل می شود. اگر دکمه سمت راست را فشار دهید ، FSM به "001" که ستون دوم صفحه نمایش است ، منتقل می شود.

در صورت فشردن دکمه وسط ، FSM به حالت جدیدی منتقل نمی شود بلکه در عوض تغییر در سیگنال TurnState را ایجاد می کند ، که یک سیگنال یک بیتی است تا توجه داشته باشید نوبت بازیکن کدام است. علاوه بر این ، دکمه وسط یک بلوک کد را اجرا می کند که بررسی می کند آیا یک ردیف خالی در پایین تا انتهای بالا وجود دارد یا خیر. سعی می شود یک نشانگر را در پایین ترین ردیف پر نشده قرار دهد. به یاد داشته باشید ، این یک بازی اتصال چهار است.

در عبارت تو در تو به نام: TurnState ، رنگ مکان نما را تغییر می دهیم و در کدام ستون در ردیف اول می خواهیم داده ها را تغییر دهیم تا روند نمایش تغییرات را منعکس کند.

این کد اصلی را برای هفت مورد باقی مانده تکرار می کنیم. نمودار FSM می تواند برای درک چگونگی تغییر حالتها مفید باشد.

مرحله 5: کد

کد
کد

این کد عملکردی برای Connect 4 است که می تواند در VHDL با استفاده از نرم افزار Vivado کامپایل شود.

همچنین یک محدودیت برای شما فراهم می شود که بتوانید بازی را راه اندازی کنید.

ما یک بلوک دیاگرام ارائه کردیم که نحوه ارتباط ورودی ها و خروجی های هر فرآیند را توضیح می دهد.

توصیه شده: