Агуулгын хүснэгт:

VHDL Basys3: 4 тоглоомыг холбоно уу: 5 алхам
VHDL Basys3: 4 тоглоомыг холбоно уу: 5 алхам

Видео: VHDL Basys3: 4 тоглоомыг холбоно уу: 5 алхам

Видео: VHDL Basys3: 4 тоглоомыг холбоно уу: 5 алхам
Видео: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Арваннэгдүгээр
Anonim
VHDL Basys3: Connect 4 тоглоом
VHDL Basys3: Connect 4 тоглоом

Танилцуулга:

Энэ бол Vivado програм хангамжийг ашиглан VHDL дээр бүтээгдсэн, 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 зөвлөл
  • (2) LED матриц Хоёр өнгийн 8x5:
  • (2) ULN2803 - Дарлингтоны транзисторын массивууд - мэдээллийн хуудас
  • Утасны дамар
  • Холбогч утас
  • Утас хуулагч
  • Талхны самбар (Том талбай хангалттай байх ёстой)
  • Мультиметр ба цахилгаан хангамж (Алдааг олж засварлах)

Алхам 2: Тоног төхөөрөмжийг холбох

Тоног төхөөрөмжийг холбох
Тоног төхөөрөмжийг холбох
Тоног төхөөрөмжийг холбох
Тоног төхөөрөмжийг холбох

Удирдамж:

Төслийн утас нь маш төвөгтэй байж болох тул та цаг заваа гаргаж, бүх холболт зөв эсэхийг нэг удаа шалгаарай.

Төсөлд хоёр LED дэлгэц ашиглах шаардлагатай боловч нэг том дэлгэцийг бүтээжээ. Үүнийг бүх мөрүүдийг нэг цэг дээр холбосноор хийж болно. Дэлгэц бүр хоёр өнгөтэй байдаг тул нэг дэлгэцийн улаан, ногоон мөрийг нөгөө дэлгэцийн улаан, ногоон эгнээтэй холбох ёстой. Үүнийг хийснээр бид бүх мөрүүдийг ердөө 8 тээглүүрээр хянах боломжтой. Бусад 16 тээглүүрийг дэлгэцийн багануудыг хянахад ашигладаг. Лаазны 8 зүүг үсрэгч кабелиар pmod холбогчдод шууд холбож болно. Pmod холболтууд нь эхлээд ULN2083A -ийн оролт руу ордог бөгөөд ULN2083A -ийн гаралт нь дэлгэц дээрх баганад шууд холбогддог. Загвар нь 8х8 хэмжээтэй тул зарим багана нь физик байдлаар холбогдохгүй.

  • 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 (0 -ээс 7 хүртэл): = "00000000"; - Баганаас хамаарч мөрийн өгөгдөл: НОГООН

LED дэлгэцийн матрицыг хянадаг үйл явцын жижиг хэсэг.

- LED дэлгэцийн матрицын дэлгэцийг хянадаг процесс: процесс (ColCLK) - 0 - 16 нь 8X8 RED болон 8x8 GREEn матрицын хувьсагчийг хоёуланг нь шинэчлэх RowCount: 0 -ээс 16 хүртэлх бүхэл тоо: = 0; эхлэх (эхлэх_хэмжээ (ColCLK)), дараа нь (RowCount = 0) бол DORow <= RedA; - харгалзах баганын мөрийн өгөгдөл DOCol <= "1000000000000000"; - Багана өдөөгч- Энэ кодыг "0000000000000001" хүртэл дахин давтах- RedB, RedC … GreenA, GreenB … GreenH болгон өөрчлөх.

GreenH -ийн төгсгөлд, процесс дуусахаас яг өмнө RowCount -ийг тэг болгож буцааж тохируулахын тулд энэ хэсгийг оруулсан болно.

if (RowCount = 15) дараа нь - А баганаас шинэчлэлтийг дахин эхлүүлнэ үү RowCount: = 0; өөр RowCount: = RowCount + 1; - Дараах тохиолдолд баганыг шилжүүлэх;

Одоо дэлгэцийн үйл явцын мэдрэмжийн жагсаалтад орсон цагийг тайлбарлах болно. Basys3 самбар нь 100MHz дээр ажилладаг дотоод цагтай. Бидний хувьд энэ бол хэт хурдан цаг тул бид дараах процессыг ашиглан энэ цагийг 960 Гц цаг болгон хуваах шаардлагатай болно.

- 960 Гц дээр ажилладаг цагийн процесс эхлэх бол ((дээшлэх_хэмжээ (CLK)) дараа нь clkcount: = clkcount + 1; хэрэв (clkcount = 52083) бол ColCLK <= үгүй (ColCLK); clkcount: = 0; хэрэв дуусгавар бол; хэрэв дуусгавар бол; үйл явцыг дуусгах;

Алхам 4: Техникийн тайлбар: Үзүүлсэн мэдээллийг өөрчлөх

Техникийн тайлбар: Үзүүлсэн мэдээллийг өөрчлөх
Техникийн тайлбар: Үзүүлсэн мэдээллийг өөрчлөх

VHDL кодын хувьд дэлгэцэн дээр гарах мэдээлэл эсвэл өгөгдлийг курсорын процесс хянадаг бөгөөд энэ нь эмзэг байдлын жагсаалтад өөр цагтай байдаг. Энэ кодыг BtnCLK гэж нэрлэдэг бөгөөд товчлуурыг дарахад хамгийн их ачаалал өгөхгүй байхаар зохион бүтээжээ. Хэрэв үүнд товчлуур дарагдсан бол дээд эгнээний курсор баганууд дээр тийм ч хурдан хөдөлдөггүй.

- 5 Гц дээр ажилладаг цагийн процесс. ButtonCLK: процесс (CLK) хувьсагч btnclkcount: 0-ээс 10000001 хүртэлх бүхэл тооны муж: = 0; if if (Yükselen_хэмжээ (CLK)), дараа нь (btnclkcount = 10000000) бол btnclkcount: = 0; BtnCLK <= үгүй (BtnCLK); өөр 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 нөхцөл (UP товчлуур)-Тоглоомыг дахин эхлүүлэхийн тулд самбарыг цэвэрлэнэ. RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; НогоонА <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') бол NCursorCol: = "111"; - H багана 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'; ГАРАХ; хэрэв дуусгавар бол;

хэрэв (GreenA (0) = '1') ба (RedA (ck) = '0') ба (GreenA (ck) = '0') бол

GreenA (Ck) <= '1'; GreenA (0) - Улаан тоглогч GreenA (0) <= '0'; if (NCursorCol = OCursorCol) then - Хэрэв юу ч дараагүй бол 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 -ийн функциональ код юм.

Тоглоомыг ажиллуулах боломжийг танд олгохын тулд хязгаарлалт тавьдаг.

Процесс бүрийн оролт, гаралт хоорондоо хэрхэн уялдаатай болохыг тайлбарласан блок диаграмыг өгсөн.

Зөвлөмж болгож буй: