Innholdsfortegnelse:

VHDL Basys3: Connect 4 Game: 5 Steps
VHDL Basys3: Connect 4 Game: 5 Steps

Video: VHDL Basys3: Connect 4 Game: 5 Steps

Video: VHDL Basys3: Connect 4 Game: 5 Steps
Video: 6.FPGA FOR BEGINNERS- Process in VHDL with an example on the Basys3 board 2024, November
Anonim
VHDL Basys3: Connect 4 Game
VHDL Basys3: Connect 4 Game

Introduksjon:

Dette er et Connect 4 Digital Logic Game designet i VHDL ved bruk av Vivado -programvaren og programmert til Basys3 Board. Konstruksjonen og utformingen av dette prosjektet er mellomliggende, men nykommere kan kopiere trinnene og bygge det digitale spillet.

Spillet fungerer som Connect 4 -spillet. Spillere kan flytte markøren over skjermen ved å bruke venstre og høyre knapp på tavlen. Hvis du trykker på den midtre knappen på brettet, får spilleren til å plassere markøren på den kolonnen, og så blir det neste spiller sin tur. Når en spiller vinner, kan spillet tilbakestilles ved å trykke på opp -knappen på brettet.

Trinn 1: Raske detaljer og materialer

Raske tekniske detaljer:

  • Bruker tre sett med PMOD -tilkoblinger på brettet (JA, JB, JC)

    • 8 pins (unntatt Vcc & GND Pins) som brukes for hver PMOD -kontakt
    • JA - Kontroll av rader
    • JB - Kontroll av grønne kolonner
    • JC - Kontroll av røde kolonner
  • Skjermklokken fungerer på 960Hz

    Bare 8 lysdioder er tent på et gitt tidspunkt. Skjermen oppdateres med en rask nok klokkehastighet til at illusjonen er gitt om at mer enn 8 lysdioder er på på et gitt tidspunkt

  • Knappeklokke opererer på 5Hz; Du kan eventuelt bøtelegge ved å redigere VHDL -kode.
  • Den interne motstanden til Darlington Arrays er tilstrekkelig for å forhindre utbrenthet av LED

Spillet er konstruert ved hjelp av følgende komponenter og verktøy:

  • (1) Basys3 Board
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - Darlington Transistor Arrays - Dataark
  • Spoler av Wire
  • Jumper Wires
  • Wire Stripper
  • Brødbrett (Stor firkant burde være nok)
  • Multimeter og strømforsyning (feilsøking)

Trinn 2: Koble til maskinvaren

Koble til maskinvaren
Koble til maskinvaren
Koble til maskinvaren
Koble til maskinvaren

Retningslinjer:

Kablingene til prosjektet kan være ekstremt kronglete. Ta deg god tid og bekreft at alle tilkoblingene er riktige ett sett om gangen.

Prosjektet innebærer bruk av to LED -skjermer, men kombineres til en stor skjerm. Dette kan oppnås ved å koble alle radene til det samme punktet. Fordi hver skjerm er tofarget, må de røde og grønne radene på den ene skjermen også knyttes til de røde og grønne radene på den andre skjermen. Ved å gjøre dette kan vi kontrollere alle radene med bare 8 pinner. De andre 16 pinnene brukes til å styre skjermkolonnene. De 8 pinnene til kan kobles direkte via jumperkabler til pmod -kontaktene. Pmod -tilkoblinger går først til inngangen til ULN2083A, og utgangen til ULN2083A kobles direkte til kolonnen på skjermen. Fordi designet er en 8x8, vil noen kolonner fysisk ikke være koblet sammen.

  • JA: Radforbindelser: Rad 1 til JA: 1 til rad 8 for JA: 10.
  • JA: Røde kolonneforbindelser:
  • JC: Grønne kolonneforbindelser

Se bildene som er lagt ut for å vite hvilke pinner som tilsvarer hvilke rader/kolonner.

Merk: Transistorene har innebygde motstander, så lysdiodene krever ikke ytterligere motstand for å være seriekoblet til dem.

Trinn 3: Teknisk forklaring: Skjerm

Skjermen opererer på visjonens utholdenhet. Skjermen forfriskes så raskt at det menneskelige øyet ikke synlig kan oppdage at noen lysdioder raskt slås av og på. Faktisk, ved å bremse skjermklokken, kan man merke blinkingen.

Displayet slår på alle åtte radene i henhold til dataene som er lagret for disse radene, og displayet slår på en kolonne. Deretter går den raskt over til neste datapost for de åtte radene og slår på neste kolonne - mens alle andre kolonner er slått av. Denne prosessen fortsetter med en rask nok klokkehastighet til at LED -flimringen blir umerkelig.

Datalagring for skjermen initialiseres umiddelbart etter arkitekturen i VHDL -filen på følgende måte:

signal RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 ned til 0): = "00000000";

signal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - Raddata avhengig av kolonne: GRØNN

Følgende en liten bit av prosessen som styrer LED -skjermmatrisen.

- Prosess som styrer LED -skjermmatrisedisplay: prosess (ColCLK) - 0 - 16 for å oppdatere både 8X8 RØD og 8x8 GRØN matrisevariabel RowCount: heltallsområde 0 til 16: = 0; start if (rising_edge (ColCLK)) så if (RowCount = 0) then DORow <= RedA; - Radedata for tilsvarende kolonne DOCol <= "1000000000000000"; - Kolonneutløser- Gjenta denne koden helt ned til "0000000000000001"- Endre til RedB, RedC … GreenA, GreenB … GreenH

På slutten av GreenH, rett før prosessen avsluttes, er denne kodebiten inkludert for å tilbakestille RowCount til null.

hvis (RowCount = 15) deretter - Start oppdateringen på nytt fra kolonne A RowCount: = 0; ellers RowCount: = RowCount + 1; - Skift gjennom kolonner slutten hvis;

Nå, for å forklare klokken som er i sensitivitetslisten til visningsprosessen. Basys3 -kortet har en intern klokke som opererer på 100MHz. For vårt formål er dette en for rask klokke, så vi må dele denne klokken til en 960Hz klokke ved å bruke følgende prosess.

- Klokke prosess som opererer ved 960HzCLKDivider: prosess (CLK) variabel clkcount: heltallsområde 0 til 52083: = 0; begynne hvis (rising_edge (CLK)) deretter clkcount: = clkcount + 1; hvis (clkcount = 52083) så er ColCLK <= ikke (ColCLK); clkcount: = 0; slutt om; slutt om; avslutte prosessen;

Trinn 4: Teknisk forklaring: Endre informasjonen som vises

Teknisk forklaring: Endre informasjonen som vises
Teknisk forklaring: Endre informasjonen som vises

I VHDL -koden styres informasjonen eller dataene som vises på skjermen av markørprosessen, som har en annen klokke i sensitivitetslisten. Denne koden ble kalt BtnCLK, en klokke som er designet for å minimere debouching av knappene når de trykkes ned. Dette er inkludert slik at hvis du trykker på en knapp, beveger markøren på den øverste raden seg ikke veldig raskt over kolonnene.

- Klokke prosess som opererer ved 5 Hz. ButtonCLK: prosess (CLK) variabel btnclkcount: heltallsområde 0 til 10000001: = 0; begynne hvis (rising_edge (CLK)) deretter hvis (btnclkcount = 10000000) deretter btnclkcount: = 0; BtnCLK <= not (BtnCLK); annet btnclkcount: = btnclkcount + 1; slutt om; slutt om; avslutte prosessen;

Med BtnCLK -signalutgangen fra denne prosessen kan vi nå forklare markørprosessen. Markørprosessen har bare BtnCLK i sensitivitetslisten, men i kodeblokken kontrolleres tilstanden til knappene, og dette vil føre til at dataene for RedA, RedB … GreenH endres. Her er et utdrag av markørkoden, som inkluderer tilbakestillingsblokken og blokken for den første kolonnen.

markør: prosess (BtnCLK) variabel OCursorCol: STD_LOGIC_VECTOR (2 ned til 0): = "000"; - OCursorCol holder styr på forrige kolonnevariabel NCursorCol: STD_LOGIC_VECTOR (2 ned til 0): = "000"; -NCursorCol setter ny markørkolonne begynne-GJENSTILL tilstand (UP-knapp)-Brettet slettes for at spillet skal starte på nytt hvis (rising_edge (BtnCLK)) deretter hvis (RST = '1') deretter 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') så NCursorCol: = "111"; - Kolonne H elsif (Rbtn = '1') deretter NCursorCol: = "001"; - Kolonne B elsif (Cbtn = '1') deretter NCursorCol: = OCursorCol; - Kolonnen forblir den samme NTurnState <= not (TurnState); - Utløser neste spillers tur- Kontrollerer gjeldende kolonne fra bunn til topp og slår på første LED som ikke er på. Fargen avhenger av gjeldende spillers markørfarge. for ck i 7 ned til 1 sløyfe hvis (RedA (0) = '1') og (RedA (ck) = '0') og (GreenA (ck) = '0') deretter RedA (Ck) <= '1'; RedA (0) <= '0'; EXIT; slutt om;

hvis (GreenA (0) = '1') og (RedA (ck) = '0') og (GreenA (ck) = '0') så

GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; hvis (NCursorCol = OCursorCol) deretter - Hvis ingenting ble trykket RedA (0) <= '1'; elsif (NCursorCol = "111") da - Hvis Lbtn ble trykket RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") da - Iff Rbtn ble trykket RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; hvis (NCursorCol = OCursorCol) så GreenA (0) <= '1'; elsif (NCursorCol = "111") deretter GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") deretter GreenB (0) <= '1'; GreenA (0) <= '0'; slutt om; slutt saken;

Vær oppmerksom på at den første saksetningen heter: OCursorCol (som står for Old Cursor Column) er begynnelsen på den endelige tilstandsmaskinen. Hver kolonne i displayet behandles som sin egen tilstand i FSM. Det er 8 kolonner, så et 3-bits binært tallsett ble brukt til å identifisere hver kolonne som en tilstand. Hvordan FSM beveger seg mellom tilstand er avhengig av knappen som trykkes. I utdraget ovenfor, hvis den venstre knappen trykkes, vil FSM flytte til "111" som ville være den siste kolonnen i displayet. Hvis den høyre knappen trykkes, vil FSM gå til "001", som vil være den andre kolonnen i displayet.

Hvis du trykker på den midtre knappen, vil FSM IKKE flytte til en ny tilstand, men vil i stedet utløse en endring i TurnState-signalet, som er et ett-bits signal for å merke hvilken spillers tur det er. I tillegg kjører den midterste knappen en kodeblokk som sjekker om det er en tom rad helt nederst helt til toppen. Den vil prøve å plassere en markør i den laveste, ufylte raden. Husk at dette er et connect four -spill.

I den nestede saksuttalelsen kalt: TurnState, endrer vi hva markørfargen er og hvilken kolonne på den første raden vi vil endre dataene for, slik at visningsprosessen kan gjenspeile endringen.

Vi gjentar denne grunnleggende koden for de resterende syv sakene. FSM -diagrammet kan være nyttig for å forstå hvordan statene endrer seg.

Trinn 5: Kode

Kode
Kode

Dette er funksjonskoden for Connect 4 som kan kompileres i VHDL ved hjelp av Vivado -programvaren.

En begrensning er også gitt for å la deg få spillet i gang.

Vi ga et blokkdiagram som forklarer hvordan innganger og utganger for hver prosess er sammenkoblet.

Anbefalt: