Мазмуну:
- 1 -кадам: Ыкчам маалымат жана материалдар
- 2 -кадам: Аппаратты туташтыруу
- 3 -кадам: Техникалык түшүндүрмө: Экран
- 4 -кадам: Техникалык түшүндүрмө: Көрсөтүлгөн маалыматты өзгөртүү
- 5 -кадам: Код
Video: VHDL Basys3: Connect 4 Game: 5 Steps
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:41
Киришүү:
Бул VHDLде Vivado Программасын колдонуу менен иштелип чыккан жана Basys3 Башкармалыгына программаланган Connect 4 Санариптик Логикалык Оюну. Бул долбоордун курулушу жана дизайны орто, бирок жаңы келгендер кадамдарды көчүрүп, санарип оюнун кура алышат.
Оюн Connect 4 оюну сыяктуу иштейт. Оюнчулар доскада жайгашкан сол жана оң баскычтарды колдонуп, курсорду экран боюнча жылдыра алышат. Тактадагы ортоңку баскычты басуу оюнчуга өз маркерин ошол мамычанын үстүнө коюуга алып келет, андан кийин ал кийинки оюнчунун кезеги болуп калат. Оюнчу утуп алгандан кийин, оюнду тактанын өйдө баскычын басуу менен баштапкы абалга келтирсе болот.
1 -кадам: Ыкчам маалымат жана материалдар
Ыкчам техникалык маалымат:
-
Тактада PMOD байланыштарынын үч топтомун колдонот (JA, JB, JC)
- Ар бир PMOD туташтыргычы үчүн колдонулган 8 казык (Vcc & GND казыктарын кошпогондо)
- JA - Катарларды көзөмөлдөө
- JB - Жашыл мамычаларды башкаруу
- JC - Кызыл мамычаларды көзөмөлдөө
-
Экран сааты 960 Гцте иштейт
Белгилүү бир убакта 8 гана LED күйөт. Экран сааттын жетишерлик тез ылдамдыгында жаңырат, ал учурда 8ден ашык LED диоддору күйүп турат деген элес берилет
- Баскыч сааты 5 Гцте иштейт; Кошумча VHDL кодун түзөтүү менен жөнгө салынышы мүмкүн.
- Darlington Arraysтин ички каршылыгы LEDдин күйүп кетүүсүн алдын алуу үчүн жетиштүү
Оюн төмөнкү компоненттерди жана куралдарды колдонуу менен курулган:
- (1) Basys3 Board
- (2) LED Matrix Bi-color 8x5:
- (2) ULN2803 - Дарлингтон транзисторунун массивдери - маалымат жадыбалы
- Wool Spire
- Jumper Wires
- Wire Stripper
- Breadboards (Чоң аянт жетиштүү болушу керек)
- Мультиметр жана энергия менен камсыздоо (Мүчүлүштүктөрдү оңдоо)
2 -кадам: Аппаратты туташтыруу
Көрсөтмөлөр:
Долбоордун өткөргүчтөрү өтө татаал болушу мүмкүн, сураныч, убактыңызды бөлүңүз жана бардык туташуулар бир убакта туура экендигин текшериңиз.
Долбоор эки LED экранды колдонууну камтыйт, бирок бир чоң экранды түзүү үчүн бириктирилген. Муну бардык катарларды бир пунктка туташтыруу менен ишке ашырса болот. Ар бир экран эки түстүү болгондуктан, экрандын кызыл жана жашыл катарлары башка экрандын кызыл жана жашыл катарына байланган болушу керек. Муну менен биз бардык катарларды 8 казык менен гана көзөмөлдөй алабыз. Калган 16 казык дисплейдин мамыларын көзөмөлдөө үчүн колдонулат. 8 казык пмод коннекторлоруна секирүүчү кабелдер аркылуу түз туташтырылышы мүмкүн. Pmod туташуулары алгач ULN2083Aнын киришине өтөт жана ULN2083Aнын чыгышы экрандын мамычасына түз туташат. Дизайн 8х8 болгондуктан, кээ бир мамылар физикалык түрдө туташпайт.
- JA: Row байланыштары: JA 1 үчүн JA: 1 JA үчүн 8 катар: 10.
- JA: Red Column байланыштары:
- JC: Green Column байланыштары
Кайсы казыктар кайсы саптарга/мамыларга туура келерин билүү үчүн жарыяланган сүрөттөргө кайрылыңыз.
Эскертүү: Транзисторлор каршылыктарды курушкан, андыктан диоддор аларга кошумча каршылыкты талап кылбайт.
3 -кадам: Техникалык түшүндүрмө: Экран
Экран көрүүнүн туруктуулугунда иштеп жатат. Экран ушунчалык тез жаңыланып турат, андыктан кээ бир светодиоддор тез өчүп күйүп жатканын адам көзү көрө албайт. Чынында, дисплейдин саатын жайлатуу менен, жарк эткенин байкаса болот.
Дисплей ошол саптар үчүн сакталган маалыматка ылайык бардык сегиз катарды күйгүзөт жана дисплей бир мамычаны күйгүзөт. Андан кийин ал сегиз катар үчүн кийинки маалымат киргизүүгө тез өтөт жана кийинки мамычаны күйгүзөт - башка бардык мамычалар өчүрүлгөн. Бул процесс жетишерлик тез ылдамдыкта уланып, 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"; - Row маалыматтар мамычасына жараша: Жашыл
LED дисплейинин матрицасын башкарган процесстин кичинекей үзүндүсү.
- LED дисплейинин матрицасын көрсөтүүнү көзөмөлдөгөн процесс: процесс (ColCLK) - 0 - 16, 8X8 RED жана 8x8 GREEn матрицасынын RowCount экөөнү жаңыртуу үчүн: 0дөн 16га чейин бүтүн диапазону: = 0; баштоо if (ko'tarүү_чабыты (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 МГцте иштеген ички саат бар. Биздин максаттар үчүн, бул өтө тез саат, ошондуктан биз төмөнкү процессти колдонуу менен бул саатты 960 Гц саатка бөлүшүбүз керек.
- 960 Гцте иштеген саат процесси баштоо if (ko'tarүлүүчү_чеги (CLK)) анда clkcount: = clkcount + 1; эгер (clkcount = 52083) анда ColCLK <= эмес (ColCLK); clkcount: = 0; эгерде бүтсө; эгерде бүтсө; процессти аяктоо;
4 -кадам: Техникалык түшүндүрмө: Көрсөтүлгөн маалыматты өзгөртүү
VHDL кодунда, экранга чыга турган маалымат же маалыматтар курсор процесси тарабынан башкарылат, анын сезгичтик тизмесинде башка саат бар. Бул код BtnCLK деп аталат, алар басылганда баскычтардын дебоушун азайтуу үчүн иштелип чыккан. Бул баскыч басылса, үстүнкү саптагы курсор мамычалар боюнча өтө тез кыймылдабашы үчүн киргизилген.
- 5 Гцте иштөөчү саат процесси. баштоо if (ko'tarүү_чеги (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 курсордун жаңы тилкесин баштайт-РЕЗЕТТИН шарты (UP баскычы)-Такта оюнду кайра баштоо үчүн тазаланат, эгер (ko'tarүлүүчү_чабыты (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"; - В тилкеси elsif (Cbtn = '1') анда NCursorCol: = OCursorCol; - Колонна ошол эле NTurnState кала берет <= эмес (TurnState); - Кийинки оюнчунун кезегин иштетет- Учурдагы мамычаны ылдыйдан жогору карай текшерет жана күйбөгөн биринчи LEDди күйгүзөт. Түс учурдагы оюнчунун курсорунун түсүнө жараша болот. ck үчүн 7 төмөн 1 цикл болсо, эгерде (RedA (0) = '1') жана (RedA (ck) = '0') жана (GreenA (ck) = '0') анда RedA (Ck) <= '1'; RedA (0) <= '0'; EXIT; эгерде бүтсө;
эгер (GreenA (0) = '1') жана (RedA (ck) = '0') жана (GreenA (ck) = '0') анда
GreenA (Ck) <= '1'; GreenA (0) - Red Player 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) - Green Player 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 -кадам: Код
Бул Vivado Программасын колдонуу менен VHDLде түзүлүүчү Connect 4 үчүн функционалдык код.
Оюнду ишке киргизүүгө мүмкүнчүлүк берүү үчүн чектөө да каралган.
Биз ар бир процесстин кириштери жана чыгымдары бири -бири менен кандайча байланышта экенин түшүндүргөн блок -схеманы бердик.
Сунушталууда:
Arduino Connect Бир нече I2C түзмөктөрү: 6 кадам
Arduino Connect Бир нече I2C Түзмөктөрү: Бул үйрөткүчтө биз I2C туташуусу менен бир нече модулдарды arduino менен кантип туташтырууну үйрөнөбүз. Видеону көрүңүз! Биздин учурда биз 4 OLED дисплейди мисал катары колдонобуз, бирок сиз башка I2C модулдарын колдоно аласыз/ Кааласаңыз сенсорлор.Эскертүү: 4 OLED дисплейи
SelfCAD Connect Surface Edge жана Vertex менен: 4 кадам
Edge жана Vertex менен SelfCAD Connect Surface: Бул Selfcad үйрөткүчтө сиз үстү моделдин чокусун кантип туташтырууну үйрөнө аласыз. Андан кийин биз аны бир объектке бириктире алабыз. Муну карап көр
IOT Connect: 7 кадам
IOT Connect: IoT Connect - IoTге негизделген стартка жардам берүү үчүн ачык булак долбоору. IoT Connect сизге ESP8266, AutoCad Eagle китепканаларын, такта файлдарын, схемаларды жана булут платформасын сенсордук маалыматтарды алуу жана электр релесин көзөмөлдөө үчүн берет
VHDL жана Basys3 тактасын колдонуу менен негизги секундомер: 9 кадам
VHDL жана Basys3 тактасын колдонуу менен негизги секундомер: Негизги VHDL жана Basys 3 тактасын колдонуу менен секундомерди кантип куруу керектиги боюнча инструкцияга кош келиңиз. Биз сиздер менен долбоорубузду бөлүшүүгө кубанычтабыз! Бул 2016 -жылдын күзүндө Cal Poly, SLOдогу CPE 133 (Санариптик Дизайн) курсунун акыркы долбоору болчу. Биз курган долбоор
Motion Sensor Lights Basys3: 8 Steps
Motion Sensor Lights Basys3: Санариптик дизайндагы акыркы долбоорубуз үчүн, кыймылдын сенсорлорун симуляциялоону чечтик, алар объект жанында болгондо гана эмес, күндүн белгилүү бир убагында гана активдешет. Биз муну FPGA (Basys3 board) аркылуу моделдей алабыз