Мазмұны:

VHDL Basys3: Connect 4 ойыны: 5 қадам
VHDL Basys3: Connect 4 ойыны: 5 қадам

Бейне: VHDL Basys3: Connect 4 ойыны: 5 қадам

Бейне: VHDL Basys3: Connect 4 ойыны: 5 қадам
Бейне: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Қараша
Anonim
VHDL Basys3: Connect 4 ойыны
VHDL Basys3: Connect 4 ойыны

Кіріспе:

Бұл VHDL -де Vivado бағдарламалық жасақтамасы арқылы жасалған және Basys3 тақтасына бағдарламаланған Connect 4 сандық логикалық ойыны. Бұл жобаның құрылысы мен дизайны аралық, бірақ жаңадан келгендер қадамдарды көшіріп, цифрлық ойын құра алады.

Ойын Connect 4 ойыны сияқты жұмыс істейді. Ойыншылар тақтада орналасқан сол және оң түймелердің көмегімен курсорды экран бойымен жылжыта алады. Тақтадағы ортаңғы түймені басу ойыншының маркерін сол бағанға қояды, содан кейін келесі ойыншының кезегі болады. Ойыншы жеңіске жеткен соң, тақтадағы жоғары түймесін басу арқылы ойынды қалпына келтіруге болады.

1 -қадам: Жылдам мәліметтер мен материалдар

Жылдам техникалық мәліметтер:

  • Тақтадағы PMOD қосылымдарының үш жиынтығын қолданады (JA, JB, JC)

    • Әрбір PMOD коннекторы үшін пайдаланылатын 8 түйреуіш (Vcc & GND түйреуіштерін қоспағанда)
    • JA - Жолдарды басқару
    • JB - Жасыл бағандарды бақылау
    • JC - Қызыл бағандарды бақылау
  • Экран сағаты 960 Гц жиілікте жұмыс істейді

    Белгілі бір уақытта тек 8 жарық диоды қосылады. Экран жеткілікті жылдамдықпен жаңартылады, бұл кезде бір мезгілде 8 -ден астам жарық диоды қосылады деген елес пайда болады

  • Батырмалы сағат 5 Гц жиілікте жұмыс істейді; Қажет болса, VHDL кодын өңдеу арқылы баптауға болады.
  • Darlington Arrays ішкі қарсылығы жарық диодты жануды болдырмау үшін жеткілікті

Ойын келесі компоненттер мен құралдардың көмегімен жасалған:

  • (1) Basys3 тақтасы
  • (2) Екі түсті 8x5 жарықдиодты матрица:
  • (2) ULN2803 - Darlington транзисторлық массивтері - мәліметтер парағы
  • Сым катушкалар
  • Jumper Wires
  • Сым тартқыш
  • Нан тақталары (Үлкен алаң жеткілікті болуы керек)
  • Мультиметр және қуат көзі (ақауларды жою)

2 -қадам: Жабдықты қосу

Жабдықты қосу
Жабдықты қосу
Жабдықты қосу
Жабдықты қосу

Әдістемелік нұсқаулар:

Жобаның сымдары өте күрделі болуы мүмкін, уақытты бөліп, барлық қосылымдардың бір уақытта дұрыс екенін тексеріңіз.

Жоба екі жарықдиодты экранды пайдалануды қамтиды, бірақ олар бір үлкен экранды құрайды. Мұны барлық жолдарды бір нүктеге қосу арқылы жасауға болады. Әр экран екі түсті болғандықтан, бір экранның қызыл және жасыл жолдары басқа экранның қызыл және жасыл жолдарына байлануы керек. Бұл арқылы біз барлық жолдарды тек 8 түйреуішпен басқара аламыз. Қалған 16 түйреуіш дисплей бағандарын басқару үшін қолданылады. 8 түйреуішті өтпелі кабельдер арқылы pmod қосқыштарына тікелей қосуға болады. Pmod қосылымдары алдымен ULN2083A кірісіне өтеді және ULN2083A шығысы тікелей экрандағы бағанға қосылады. Дизайн 8х8 болғандықтан, кейбір бағандар физикалық түрде қосылмайды.

  • JA: Жол қосылымдары: 1 -ден JA -ға дейін: 1 -ден 8 -ге дейін JA: 10.
  • JA: Қызыл баған қосылымдары:
  • JC: Жасыл баған қосылымдары

Қандай түйреуіштер қандай жолдарға/бағандарға сәйкес келетінін білу үшін орналастырылған суреттерді қараңыз.

Ескертпе: транзисторлар кедергілерге ие, сондықтан светодиодтар оларға сериялық қосылу үшін қосымша қарсылықты қажет етпейді.

3 -қадам: Техникалық түсініктеме: Экран

Экран көру тұрақтылығымен жұмыс істейді. Экран соншалықты тез сергітетіндіктен, адам көзі кейбір жарықдиодты шамдардың тез сөніп, қосылып тұрғанын көзбен көре алмайды. Шын мәнінде, дисплей сағатын баяулату арқылы жыпылықтағанын байқауға болады.

Дисплей сол жолдар үшін сақталған деректерге сәйкес барлық сегіз жолды қосады, ал дисплей бір бағанды қосады. Содан кейін ол сегіз жол үшін келесі дерек енгізуге тез ауысады және келесі бағанды қосады - барлық басқа бағандар өшірулі. Бұл процесс жарық диодының жыпылықтауы байқалмайтындай жылдамдықпен жалғасады.

Дисплейге арналған деректерді сақтау VHDL файлындағы архитектурадан кейін бірден келесідей инициализацияланады:

RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH сигналы: std_logic_vector (0 төмен қарай 7): = «00000000»;

сигнал GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 төмен 0): = «00000000»; - Жол деректері бағанға байланысты: ЖАСЫЛ

Жарықдиодты дисплей матрицасын басқаратын процестің келесі шағын үзіндісі.

- Жарықдиодты дисплей матрицасының дисплейін басқаратын процесс: процесс (ColCLK) - 0 - 16, 8X8 RED және 8x8 GREEn матрицалық RowCount айнымалысын жаңарту үшін: 0 -ден 16 -ға дейінгі бүтін сан диапазоны: = 0; if if (көтерілу_шеті (ColCLK)), онда егер (RowCount = 0), онда DORow <= RedA; - сәйкес DOCol бағанының жол деректері <= «1000000000000000»; - Бағана триггері- бұл кодты «0000000000000001» дейін қайталаңыз- RedB, RedC… GreenA, GreenB… GreenH-ге өзгертіңіз.

GreenH соңында, процесс аяқталмай тұрып, бұл үзінді RowCount -ты нөлге қайтару үшін қосылады.

if (RowCount = 15) онда - А бағаннан RowCount жаңартуды қайта бастаңыз: = 0; else RowCount: = RowCount + 1; - Бағандар арасында жылжыту, егер;

Енді дисплей процесінің сезімталдық тізімінде тұрған сағатты түсіндіру. Basys3 тақтасында 100 МГц жиілікте жұмыс істейтін ішкі сағат бар. Біздің мақсатымыз үшін бұл өте жылдам сағат, сондықтан келесі процесті қолдана отырып, біз бұл сағатты 960 Гц сағатқа бөлуіміз керек.

- 960 Гц жиілікте жұмыс істейтін сағат процесі бастаңыз if (көтерілу_шеті (CLK)) онда clkcount: = clkcount + 1; if (clkcount = 52083) онда ColCLK <= жоқ (ColCLK); clkcount: = 0; егер аяқталса; егер аяқталса; процесті аяқтау;

4 -қадам: Техникалық түсініктеме: Көрсетілетін ақпаратты өзгерту

Техникалық түсініктеме: Көрсетілетін ақпаратты өзгерту
Техникалық түсініктеме: Көрсетілетін ақпаратты өзгерту

VHDL кодында экранға шығатын ақпарат немесе деректер курсор процессімен басқарылады, оның сезімталдық тізімінде басқа сағат бар. Бұл код BtnCLK деп аталды, ол батырмаларды басу кезінде олардың шығуын барынша азайтуға арналған. Егер батырма басылса, жоғарғы жолдағы курсор бағандар бойымен өте жылдам қозғалмайтындай етіп енгізілген.

- 5 Гц-те жұмыс істейтін сағаттық процесс. ButtonCLK: процесс (CLK) айнымалы btnclkcount: 0-ден 10000001 бүтін диапазоны: = 0; if if (көтерілу_шеті (CLK)), онда if (btnclkcount = 10000000) btnclkcount: = 0; BtnCLK <= жоқ (BtnCLK); else btnclkcount: = btnclkcount + 1; егер аяқталса; егер аяқталса; процесті аяқтау;

Бұл процестің BtnCLK сигнал шығысымен біз енді курсор процесін түсіндіре аламыз. Меңзер процесінде сезімталдық тізімінде тек BtnCLK бар, бірақ код блогында түймелердің күйі тексеріледі, бұл RedA, RedB… GreenH деректерін өзгертеді. Міне, курсор кодының үзіндісі, оған бастапқы блок пен бастапқы бағанға арналған блок кіреді.

курсор: процесс (BtnCLK) айнымалысы OCursorCol: STD_LOGIC_VECTOR (2 төмен 0): = «000»; - OCursorCol алдыңғы NCursorCol бағанының айнымалысын бақылайды: STD_LOGIC_VECTOR (2 төмен 0): = «000»; -NCursorCol курсордың жаңа бағанының басталуын орнатады-RESET күйі (ЖОҒАРЫ ТҮЙМЕСІ)-тақта ойынның қайта басталуы үшін тазартылады, егер (жоғарылау_беті (BtnCLK)), егер (RST = '1') болса, онда RedA <= «00000000»; 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); - Келесі ойыншының бұрылуын іске қосады- ағымдағы бағанды төменнен жоғары қарай тексереді және қосылмайтын бірінші жарық диодты қосады. Түс ағымдағы ойнатқыштың курсор түсіне байланысты. 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'; if (NCursorCol = OCursorCol) онда - Егер ештеңе басылмаса RedA (0) <= '1'; elsif (NCursorCol = «111») онда - егер Lbtn басылса RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = «001») содан кейін - Iff Rbtn басылды RedB (0) <= '1'; RedA (0) - Жасыл ойыншы RedA (0) <= '0'; if (NCursorCol = OCursorCol) онда GreenA (0) <= '1'; elsif (NCursorCol = «111») содан кейін GreenH (0) <= '1'; ЖасылА (0) <= '0'; elsif (NCursorCol = «001») содан кейін GreenB (0) <= '1'; ЖасылА (0) <= '0'; егер аяқталса; соңғы жағдай;

Назар аударыңыз: OCursorCol (ескі курсор бағанын білдіреді) деп аталатын бірінші жағдай мәлімдемесі - соңғы күй машинасының басы. Дисплейдің әрбір бағанасы FSM -де өзінің күйі ретінде қарастырылады. 8 баған бар, сондықтан әрбір бағанды күй ретінде анықтау үшін 3 биттік екілік сандар жиынтығы пайдаланылды. FSM күй арасында қалай ауысатыны басылған батырмаға байланысты. Жоғарыдағы үзіндіде, егер сол жақ түймешік басылса, FSM дисплейдің соңғы бағанасы болатын «111» -ге ауысады. Егер оң жақ түймешік басылса, FSM дисплейдің екінші бағанасы болатын «001» -ге ауысады.

Егер ортаңғы түйме басылса, FSM жаңа күйге ауыспайды, керісінше TurnState сигналының өзгеруін тудырады, бұл қай ойыншының бұрылысы екенін көрсететін бір разрядты сигнал. Сонымен қатар, ортаңғы түйменің төменгі жағында бос жолдың бар -жоғын тексеретін код блогы іске қосылады. Ол маркерді ең төменгі, толтырылмаған жолға қоюға тырысады. Есіңізде болсын, бұл төрт ойынның байланысы.

«TurnState» деп аталатын кірістірілген жағдай мәлімдемесінде біз курсордың түсін өзгертеміз және бірінші жолдың қай бағанындағы деректерді өзгерту керек, сонда дисплей процесі өзгерісті көрсете алады.

Біз қалған жеті жағдай үшін осы негізгі кодты қайталаймыз. FSM диаграммасы штаттардың қалай өзгеретінін түсінуге көмектеседі.

5 -қадам: код

Код
Код

Бұл Vivado бағдарламалық жасақтамасының көмегімен VHDL -де құрастыруға болатын Connect 4 -тің функционалды коды.

Ойынды іске қосуға мүмкіндік беретін шектеулер де қарастырылған.

Біз блок -диаграмманы ұсындық, онда әр процестің кірістері мен шығыстары өзара байланысты.

Ұсынылған: