ዝርዝር ሁኔታ:

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: 4 ጨዋታን ያገናኙ
VHDL Basys3: 4 ጨዋታን ያገናኙ

መግቢያ ፦

ይህ የቪቫዶ ሶፍትዌርን በመጠቀም ለ Basys3 ቦርድ በፕሮግራም የተቀረፀ በ VHDL ውስጥ የተነደፈ የ Connect 4 ዲጂታል ሎጂክ ጨዋታ ነው። የዚህ ፕሮጀክት ግንባታ እና ዲዛይን መካከለኛ ነው ፣ ግን አዲስ መጤዎች ደረጃዎቹን መቅዳት እና ዲጂታል ጨዋታውን መገንባት ይችላሉ።

ጨዋታው እንደ Connect 4 ጨዋታ ይሠራል። ተጫዋቾች በቦርዱ ላይ የተገኙትን የግራ እና የቀኝ አዝራሮችን በመጠቀም ጠቋሚውን በማያ ገጹ ላይ ማንቀሳቀስ ይችላሉ። በቦርዱ ላይ የመካከለኛውን ቁልፍ መጫን ተጫዋቹ ጠቋሚው በዚያ አምድ ላይ እንዲያስቀምጥ ያደርገዋል እና ከዚያ ቀጣዩ ተጫዋች ተራ ይሆናል። አንድ ተጫዋች ካሸነፈ በኋላ ጨዋታው በቦርዱ ላይ ያለውን የላይ ቁልፍ በመጫን ዳግም ሊጀመር ይችላል።

ደረጃ 1 ፈጣን ዝርዝሮች እና ቁሳቁሶች

ፈጣን ቴክኒካዊ ዝርዝሮች;

  • በቦርዱ ላይ ሶስት የ PMOD ግንኙነቶችን ይጠቀማል (JA ፣ JB ፣ JC)

    • ለእያንዳንዱ የ PMOD አያያዥ ጥቅም ላይ የዋሉ 8 ፒን (ቪሲሲ እና ጂኤንዲ ፒን ሳይጨምር)
    • JA - የረድፎች ቁጥጥር
    • JB - የአረንጓዴ አምዶች ቁጥጥር
    • JC - ቀይ ዓምዶችን መቆጣጠር
  • የማያ ገጽ ሰዓት በ 960Hz ይሠራል

    በአንድ ጊዜ 8 ኤልኢዲዎች ብቻ ናቸው። ማያ ገጹ በበቂ ፍጥነት በሰዓት ፍጥነት ያድሳል።

  • የአዝራር ሰዓት በ 5Hz ይሠራል። እንደአማራጭ የ VHDL ኮድ በማረም ሊቀጣ ይችላል።
  • የ LED ማቃጠልን ለመከላከል የዳርሊንግተን ድርድር ውስጣዊ ተቃውሞ በቂ ነው

ጨዋታው የተገነባው የሚከተሉትን ክፍሎች እና መሳሪያዎች በመጠቀም ነው

  • (1) Basys3 ቦርድ
  • (2) የ LED ማትሪክስ ባለ-ቀለም 8x5:
  • (2) ULN2803 - ዳርሊንግተን ትራንዚስተር ድርድር - የውሂብ ሉህ
  • የሽቦ ስፖሎች
  • ዝላይ ሽቦዎች
  • የሽቦ መቀነሻ
  • የዳቦ ሰሌዳዎች (ትልቅ ካሬ በቂ መሆን አለበት)
  • መልቲሜትር እና የኃይል አቅርቦት (መላ ፍለጋ)

ደረጃ 2 ሃርድዌርን ማገናኘት

ሃርድዌርን በማገናኘት ላይ
ሃርድዌርን በማገናኘት ላይ
ሃርድዌርን በማገናኘት ላይ
ሃርድዌርን በማገናኘት ላይ

መመሪያዎች ፦

የፕሮጀክቱ ሽቦ እጅግ በጣም የተወሳሰበ ሊሆን ይችላል ፣ እባክዎን ጊዜዎን ይውሰዱ እና ሁሉም ግንኙነቶች በአንድ ጊዜ ትክክል መሆናቸውን ያረጋግጡ።

ፕሮጀክቱ ሁለት የ LED ማያ ገጾችን መጠቀምን ያጠቃልላል ግን አንድ ትልቅ ማያ ገጽ ለመፍጠር ተጣምረዋል። ይህ ሁሉንም ረድፎች ወደ ተመሳሳይ ነጥብ በማገናኘት ሊሳካ ይችላል። እያንዳንዱ ማያ ገጽ ባለ ሁለት ቀለም ስለሆነ ፣ የአንድ ማያ ገጽ ቀይ እና አረንጓዴ ረድፎች ከሌላው ማያ ገጽ ቀይ እና አረንጓዴ ረድፎች ጋር መታሰር አለባቸው። ይህንን በማድረግ ሁሉንም ረድፎች በ 8 ፒኖች ብቻ መቆጣጠር እንችላለን። ሌሎቹ 16 ፒኖች የማሳያ ዓምዶችን ለመቆጣጠር ያገለግላሉ። ለ 8 ቱ ፒኖች በቀጥታ ወደ ዝላይ ኬብሎች ወደ ፒሞድ አያያorsች በቀጥታ ሊገናኙ ይችላሉ። የ Pmod ግንኙነቶች መጀመሪያ ወደ ULN2083A ግብዓት ይሂዱ እና የ ULN2083A ውፅዓት በቀጥታ በማያ ገጹ ላይ ካለው አምድ ጋር ተገናኝቷል። ንድፉ 8x8 ስለሆነ አንዳንድ ዓምዶች በአካል አይገናኙም።

  • JA: የረድፍ ግንኙነቶች - ረድፍ 1 ወደ ጃአ - 1 እስከ ረድፍ 8 ለጃ 10።
  • JA: ቀይ ዓምድ ግንኙነቶች
  • JC: አረንጓዴ አምድ ግንኙነቶች

የትኞቹ ፒኖች ከየትኛው ረድፎች/አምዶች ጋር እንደሚዛመዱ ለማወቅ እባክዎን የተለጠፉትን ምስሎች ይመልከቱ።

ማሳሰቢያ -ትራንዚስተሮች በተቃዋሚዎች ውስጥ ሠርተዋል ፣ ስለሆነም ኤልዲዎቹ በተከታታይ ከእነሱ ጋር ለመገናኘት ተጨማሪ ተቃውሞ አያስፈልጋቸውም።

ደረጃ 3 ቴክኒካዊ ማብራሪያ ማያ ገጽ

ማያ ገጹ በእይታ ጽናት ላይ እየሰራ ነው። አንዳንድ አይዲዎች በፍጥነት እንደጠፉ እና እንደበራ የሰው ዓይን አይን በፍጥነት ማየት ስለማይችል ማያ ገጹ በጣም በፍጥነት ያድሳል። በእውነቱ ፣ የማሳያ ሰዓቱን በማዘግየት ፣ አንድ ሰው ብልጭ ድርግም የሚለውን ያስተውላል።

ለእነዚያ ረድፎች በተቀመጠው መረጃ መሠረት ማሳያው ስምንቱን ረድፎች ያበራል ፣ እና ማሳያው አንድ አምድ ያበራል። ከዚያ ለስምንቱ ረድፎች በፍጥነት ወደ ቀጣዩ የውሂብ ግቤት ይሸጋገራል እና ቀጣዩን አምድ ያበራል - ሁሉም ሌሎች ዓምዶች ጠፍተው ሳለ። ይህ ሂደት ይህ በበቂ ፍጥነት በሰዓት ፍጥነት ይቀጥላል እና የ LED ብልጭታ የማይታወቅ ይሆናል።

በቪኤችዲኤል ፋይል ውስጥ ከህንፃው በኋላ የማሳያው የመረጃ ማከማቻ በሚከተለው መንገድ ወዲያውኑ ተጀምሯል-

ምልክት 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 downto 0): = "00000000"; - በአምድ ላይ በመመስረት የረድፍ ውሂብ ግሪን

የ LED ማሳያ ማትሪክስን የሚቆጣጠር የሂደቱ ትንሽ ቅንጭብ የሚከተለው።

- የ LED ማሳያ ማትሪክስ የሚቆጣጠር ሂደት - ሂደት (ColCLK) - 0 - 16 ሁለቱንም 8X8 RED እና 8x8 GREEn ማትሪክስ ተለዋዋጭ RowCount: ኢንቲጀር ክልል ከ 0 እስከ 16: = 0; ከሆነ (የሚነሳው_ጅጅ (ColCLK)) ከዚያ ከዚያ (RowCount = 0) ከዚያም DORow <= RedA; - ለተጓዳኝ የአምድ DOCol የረድፍ ውሂብ <= "1000000000000000"; - የአምድ ቀስቃሽ- ይህንን ኮድ እስከ “0000000000000001” ድረስ እስከመጨረሻው ይድገሙት- ወደ ሬድቢ ፣ ሬድ ሲ… ግሪን ኤ ፣ ግሪን ቢ… ግሪን ኤ

በግሪን ኤች መጨረሻ ፣ ሂደቱ ይህ ቅንጥብ ከማብቃቱ በፊት RowCount ን ወደ ዜሮ እንደገና ለማቀናጀት ተካትቷል።

ከሆነ (RowCount = 15) ከዚያ - ከአምድ A RowCount: = 0; ሌላ RowCount: = RowCount + 1; - በአምዶች በኩል መቀያየር ካለ

አሁን በማሳያ ሂደቱ የስሜት ዝርዝር ውስጥ ያለውን ሰዓት ለማብራራት። የ Basys3 ቦርድ በ 100 ሜኸር የሚሰራ የውስጥ ሰዓት አለው። ለዓላማችን ፣ ይህ የሰዓት በጣም ፈጣን ስለሆነ የሚከተለውን ሂደት በመጠቀም ይህንን ሰዓት ወደ 960Hz ሰዓት መከፋፈል ያስፈልገናል።

- የሰዓት ሂደት በ 960HzCLKDivider: ሂደት (CLK) ተለዋዋጭ clkcount: ኢንቲጀር ክልል ከ 0 እስከ 52083: = 0; (የሚነሳ_ጅጅ (CLK)) ከሆነ ከዚያ clkcount: = clkcount + 1; ከሆነ (clkcount = 52083) ከዚያ ColCLK <= not (ColCLK); clkcount = = 0; ከሆነ ያበቃል; ከሆነ ያበቃል; የማጠናቀቂያ ሂደት;

ደረጃ 4 ቴክኒካዊ ማብራሪያ - የታየውን መረጃ መለወጥ

ቴክኒካዊ ማብራሪያ - የታየውን መረጃ መለወጥ
ቴክኒካዊ ማብራሪያ - የታየውን መረጃ መለወጥ

በ VHDL ኮድ ውስጥ ፣ ወደ ማያ ገጹ የሚታየው መረጃ ወይም መረጃ በጠቋሚው ሂደት ቁጥጥር ይደረግበታል ፣ ይህም በስሜት ዝርዝሩ ውስጥ የተለየ ሰዓት አለው። ይህ ኮድ BtnCLK ተብሎ ይጠራ ነበር ፣ እነሱ ሲጫኑ የአዝራሮቹን ማበላሸት ለመቀነስ የተነደፈ ሰዓት። አንድ አዝራር ከተጫነ ከላይኛው ረድፍ ላይ ያለው ጠቋሚ በአምዶች ላይ በፍጥነት እንዳይንቀሳቀስ ይህ ተካትቷል።

- የሰዓት ሂደት በ 5 Hz. ከሆነ (የሚነሳ_ጅጅ (CLK)) ከዚያም (btnclkcount = 10000000) ከሆነ ከዚያ btnclkcount: = 0; BtnCLK <= አይደለም (BtnCLK); ሌላ btnclkcount: = btnclkcount + 1; ከሆነ ያበቃል; ከሆነ ያበቃል; የማጠናቀቂያ ሂደት;

በዚህ ሂደት በ BtnCLK ምልክት ውፅዓት ፣ አሁን የጠቋሚውን ሂደት መግለፅ እንችላለን። የጠቋሚው ሂደት BtnCLK በስሜታዊነት ዝርዝሩ ውስጥ ብቻ ነው ያለው ነገር ግን በኮድ እገዳው ውስጥ የአዝራሮቹ ሁኔታ ተፈትሽዋል እና ይህ ለሬኤ ፣ ሬድቢ… ግሪን ኤች ውሂቡ እንዲለወጥ ያደርጋል። የመልሶ ማግኛ ማገጃውን እና ለመጀመሪያው አምድ ማገጃውን የሚያካትት የጠቋሚ ኮድ ቅንጭብ እዚህ አለ።

ጠቋሚ: ሂደት (BtnCLK) ተለዋዋጭ OCursorCol: STD_LOGIC_VECTOR (2 እስከ 0): = "000"; - OCursorCol ቀዳሚውን የአምድ ተለዋዋጭ NCursorCol ይከታተላል STD_LOGIC_VECTOR (2 downto 0): = "000"; -NCursorCol አዲስ የጠቋሚ አምድ መጀመሩን ያዘጋጃል-ዳግም ሁኔታ (UP Button) --Bard (ጨዋታው_ኤጅ (BtnCLK)) ከዚያ እንደገና ከሆነ (RST = '1') ከዚያም RedA <= "00000000"; RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; ሬድኤች <= "00000000"; ግሪን ኤ <= "00000000"; ግሪን ቢ <= "00000000"; ግሪን ሲ <= "00000000"; ግሪንዲ <= "00000000"; ግሪን ኢ <= "00000000"; አረንጓዴ ኤፍ <= "00000000"; ግሪንጂ <= "00000000"; GreenH if (Lbtn = '1') ከዚያም NCursorCol: = "111"; - አምድ ኤ ኤልሲፍ (Rbtn = '1') ከዚያም NCursorCol: = "001"; - አምድ ለ elsif (Cbtn = '1') ከዚያም NCursorCol: = OCursorCol; - ዓምድ ተመሳሳይ ሆኖ ይቆያል NTurnState <= not (TurnState); - የሚቀጥለውን ተጫዋች ተራ ይቀሰቅሳል- የአሁኑን አምድ ከታች ወደ ላይ ይፈትሽ እና ያልበራውን የመጀመሪያውን ኤልኢዲ ያበራል። ቀለም አሁን ባለው የአጫዋች ጠቋሚ ቀለም ላይ የተመሠረተ ነው። ለ ck በ 7 downto 1 loop (RedA (0) = '1') እና (RedA (ck) = '0') እና (GreenA (ck) = '0')) ከዚያም RedA (Ck) <= '1'; RedA (0) <= '0'; ውጣ; ከሆነ ያበቃል;

ከሆነ (GreenA (0) = '1') እና (RedA (ck) = '0') እና (GreenA (ck) = '0'))

ግሪን ኤ (ሲኬ) <= '1'; ግሪን ኤ (0) - ቀይ አጫዋች ግሪን ኤ (0) <= '0'; ከሆነ (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'; ከሆነ (NCursorCol = OCursorCol) ከዚያም GreenA (0) <= '1'; elsif (NCursorCol = "111") ከዚያም GreenH (0) <= '1'; ግሪን ኤ (0) <= '0'; elsif (NCursorCol = "001") ከዚያም ግሪን ቢ (0) <= '1'; ግሪን ኤ (0) <= '0'; ከሆነ ያበቃል; የመጨረሻ ጉዳይ;

ማሳሰቢያ ፣ የመጀመሪያው የጉዳይ መግለጫ ተብሎ የሚጠራው - OCursorCol (ለድሮው ጠቋሚ አምድ የሚያመለክተው) የመጨረሻው ግዛት ማሽን መጀመሪያ ነው። እያንዳንዱ የማሳያው አምድ በ FSM ውስጥ እንደ የራሱ ሁኔታ ተደርጎ ይወሰዳል። እያንዳንዱ አምድ እንደ ግዛት ለመለየት የ 3 ቢት የሁለትዮሽ ቁጥር ስብስብ ጥቅም ላይ ውሏል ስለዚህ 8 ዓምዶች አሉ። ኤፍኤምኤም በስቴት መካከል እንዴት እንደሚንቀሳቀስ በተጫነው ቁልፍ ላይ የተመሠረተ ነው። ከላይ ባለው ቅንጭብ ውስጥ ፣ የግራ አዝራሩ ከተጫነ ፣ ኤፍኤስኤም ወደ የማሳያው የመጨረሻው ዓምድ ወደ “111” ይሄዳል። የቀኝ አዝራሩ ከተጫነ ኤፍኤስኤምኤ ወደ “001” ይንቀሳቀሳል ፣ ይህም የማሳያው ሁለተኛ አምድ ይሆናል።

የመካከለኛው ቁልፍ ከተጫነ ፣ ኤፍኤስኤም ወደ አዲስ ሁኔታ አይዛወርም ይልቁንስ በ TurnState ምልክት ላይ ለውጥ ያስነሳል ፣ ይህም የትኛውን ተጫዋች ተራ እንደሆነ ለማስተዋል አንድ-ቢት ምልክት ነው። በተጨማሪም ፣ የመካከለኛው ቁልፍ ከላይ እስከ ታችኛው ክፍል ድረስ ባዶ ረድፍ መኖሩን የሚያጣራ የኮድ ማገጃ ይሠራል። በዝቅተኛ ፣ ባልተሞላ ረድፍ ውስጥ ምልክት ማድረጊያ ለማስቀመጥ ይሞክራል። ያስታውሱ ፣ ይህ የግንኙነት አራት ጨዋታ ነው።

በተጠለፈው የጉዳይ መግለጫ ውስጥ - TurnState ፣ ጠቋሚው ቀለም ምን እንደ ሆነ እና በመጀመሪያው ረድፍ ላይ የትኛው አምድ የማሳያ ሂደቱ ለውጡን እንዲያንፀባርቅ እንፈልጋለን።

ለቀሩት ሰባት ጉዳዮች ይህንን መሠረታዊ ኮድ እንደግማለን። ግዛቶች እንዴት እንደሚቀየሩ ለመረዳት የ FSM ሥዕላዊ መግለጫ ሊረዳ ይችላል።

ደረጃ 5 ኮድ

ኮድ
ኮድ

ይህ የቪቫዶ ሶፍትዌርን በመጠቀም በ VHDL ውስጥ ሊሰበሰብ የሚችል ለ Connect 4 ተግባራዊ ኮድ ነው።

ጨዋታውን ከፍ ለማድረግ እና ለማስኬድ የሚያስችል ገደብም ተሰጥቷል።

የእያንዳንዱ ሂደት ግብዓቶች እና ውጤቶች እንዴት እንደተገናኙ የሚያብራራ የማገጃ ዲያግራም አቅርበናል።

የሚመከር: