Мазмұны:
- 1 -қадам: Жылдам мәліметтер мен материалдар
- 2 -қадам: Жабдықты қосу
- 3 -қадам: Техникалық түсініктеме: Экран
- 4 -қадам: Техникалық түсініктеме: Көрсетілетін ақпаратты өзгерту
- 5 -қадам: код
Бейне: VHDL Basys3: Connect 4 ойыны: 5 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:25
Кіріспе:
Бұл 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 -тің функционалды коды.
Ойынды іске қосуға мүмкіндік беретін шектеулер де қарастырылған.
Біз блок -диаграмманы ұсындық, онда әр процестің кірістері мен шығыстары өзара байланысты.
Ұсынылған:
DIY 37 Leds Arduino рулетка ойыны: 3 қадам (суреттермен)
DIY 37 Leds Arduino рулетка ойыны: Рулетка - бұл кішкентай дөңгелекті білдіретін француз сөзімен аталған казино ойыны
Arduino Connect бірнеше I2C құрылғылары: 6 қадам
Arduino Connect бірнеше I2C құрылғылары: Бұл оқулықта I2C қосылымы бар бірнеше модульдерді arduino -ға қосуды үйренеміз. Бейнені қараңыз! Біздің жағдайда біз 4 OLED дисплейін мысал ретінде қолданамыз, бірақ сіз басқа I2C модульдерін қолдана аласыз. Егер қаласаңыз сенсорлар. Ескерту: 4 OLED дисплей
IOT Connect: 7 қадам
IOT Connect: IoT Connect - бұл IoT негізіндегі іске қосуға көмектесетін ашық бастапқы жоба. IoT Connect сізге ESP8266, AutoCad Eagle кітапханаларын, тақта файлдарын, схема мен сенсорлық мәліметтерді қабылдауға және қуат релесін басқаруға арналған бұлт платформасын ұсынады
VHDL мен Basys3 тақтасын қолданатын негізгі секундомер: 9 қадам
VHDL және Basys3 тақтасын қолданатын негізгі секундомер: Негізгі VHDL және Basys 3 тақтасын пайдаланып секундомерді құру туралы нұсқаулыққа қош келдіңіз. Біз сіздермен өз жобамызбен бөлісуге қуаныштымыз! Бұл 2016 жылы күзде SL Poly, SLO -да CPE 133 (цифрлық дизайн) курсының соңғы жобасы болды. Біз құрастырған жоба
VHDL -де Mastermind ойыны: 3 қадам
VHDL -дегі Mastermind Game: Біздің жоба үшін біз «Mastermind & rdquo» құрдық. VHDL -дегі ойын Basys3 тақтасында ойналады. Mastermind-бұл дәстүрлі түрде қазықтармен және ойын тақтасымен ойнайтын кодты бұзатын ойын. Бір ойыншы әр түрлі түстердің қазықтарын 4 қатарға орналастырады