विषयसूची:
- चरण 1: त्वरित विवरण और सामग्री
- चरण 2: हार्डवेयर को जोड़ना
- चरण 3: तकनीकी स्पष्टीकरण: स्क्रीन
- चरण 4: तकनीकी स्पष्टीकरण: प्रदर्शित जानकारी को बदलना
- चरण 5: कोड
वीडियो: VHDL Bassys3: 4 गेम कनेक्ट करें: 5 कदम
2024 लेखक: John Day | [email protected]. अंतिम बार संशोधित: 2024-01-30 09:21
परिचय:
यह एक कनेक्ट 4 डिजिटल लॉजिक गेम है जिसे वीएचडीएल में विवाडो सॉफ्टवेयर का उपयोग करके डिज़ाइन किया गया है और बेसिस 3 बोर्ड को प्रोग्राम किया गया है। इस परियोजना का निर्माण और डिजाइन मध्यवर्ती है, लेकिन नवागंतुक चरणों की प्रतिलिपि बना सकते हैं और डिजिटल गेम बना सकते हैं।
गेम कनेक्ट 4 गेम की तरह काम करता है। खिलाड़ी बोर्ड पर पाए जाने वाले बाएँ और दाएँ बटनों का उपयोग करके अपने कर्सर को स्क्रीन पर घुमा सकते हैं। बोर्ड पर बीच का बटन दबाने से खिलाड़ी उस कॉलम पर अपना मार्कर रख देगा और फिर अगले खिलाड़ी की बारी होगी। एक बार जब कोई खिलाड़ी जीत जाता है, तो बोर्ड पर अप बटन दबाकर गेम को रीसेट किया जा सकता है।
चरण 1: त्वरित विवरण और सामग्री
त्वरित तकनीकी विवरण:
-
बोर्ड पर पीएमओडी कनेक्शन के तीन सेट (जेए, जेबी, जेसी) का उपयोग करता है
- प्रत्येक पीएमओडी कनेक्टर के लिए उपयोग किए जाने वाले 8 पिन (वीसीसी और जीएनडी पिन को छोड़कर)
- जावेद - पंक्तियों का नियंत्रण
- जेबी - हरे स्तंभों का नियंत्रण
- जे.सी. - लाल स्तंभों का नियंत्रण
-
स्क्रीन घड़ी 960Hz. पर काम करती है
एक निश्चित समय में केवल 8 एलईडी ही चालू होती हैं। स्क्रीन इतनी तेज क्लॉक स्पीड से रिफ्रेश होती है कि यह भ्रम दिया जाता है कि एक निश्चित समय में 8 से अधिक एलईडी चालू हैं।
- बटन घड़ी 5Hz पर संचालित होती है; वैकल्पिक रूप से VHDL कोड को संपादित करके ट्यून किया जा सकता है।
- एलईडी बर्न-आउट को रोकने के लिए डार्लिंगटन एरेज़ का आंतरिक प्रतिरोध पर्याप्त है
खेल का निर्माण निम्नलिखित घटकों और उपकरणों का उपयोग करके किया गया है:
- (१) बेसिस३ बोर्ड
- (2) एलईडी मैट्रिक्स द्वि-रंग 8x5:
- (2) ULN2803 - डार्लिंगटन ट्रांजिस्टर एरेज़ - डेटाशीट
- तार के स्पूल
- जम्पर तार
- वायर स्ट्रिपर
- ब्रेडबोर्ड (बड़ा वर्ग पर्याप्त होना चाहिए)
- मल्टीमीटर और बिजली की आपूर्ति (समस्या निवारण)
चरण 2: हार्डवेयर को जोड़ना
दिशानिर्देश:
परियोजना की वायरिंग बेहद जटिल हो सकती है, कृपया अपना समय लें और सत्यापित करें कि सभी कनेक्शन एक समय में एक सेट सही हैं।
इस परियोजना में दो एलईडी स्क्रीन का उपयोग शामिल है, लेकिन एक बड़ी स्क्रीन बनाने के लिए संयुक्त हैं। यह सभी पंक्तियों को एक ही बिंदु से जोड़कर पूरा किया जा सकता है। चूंकि प्रत्येक स्क्रीन द्वि-रंग है, इसलिए एक स्क्रीन की लाल और हरी पंक्तियों को भी दूसरी स्क्रीन की लाल और हरी पंक्तियों से बांधा जाना चाहिए। ऐसा करके हम सभी पंक्तियों को केवल 8 पिन से नियंत्रित कर सकते हैं। अन्य 16 पिनों का उपयोग डिस्प्ले के कॉलम को नियंत्रित करने के लिए किया जाता है। कैन के लिए 8 पिन सीधे जम्पर केबल के माध्यम से pmod कनेक्टर्स से कनेक्ट किए जा सकते हैं। Pmod कनेक्शन पहले ULN2083A के इनपुट पर जाते हैं और ULN2083A का आउटपुट सीधे स्क्रीन पर कॉलम से जुड़ा होता है। चूंकि डिज़ाइन 8x8 है, इसलिए कुछ कॉलम भौतिक रूप से कनेक्ट नहीं होंगे।
- जावेद: पंक्ति कनेक्शन: पंक्ति 1 से JA: 1 से पंक्ति 8 JA:10 के लिए।
- जावेद: लाल स्तंभ कनेक्शन:
- जे.सी.: ग्रीन कॉलम कनेक्शन
कृपया यह जानने के लिए पोस्ट की गई छवियों को देखें कि कौन से पिन किन पंक्तियों/स्तंभों से मेल खाते हैं।
नोट: ट्रांजिस्टर में प्रतिरोधों का निर्माण होता है, इसलिए एल ई डी को श्रृंखला में उनसे जुड़ने के लिए अतिरिक्त प्रतिरोध की आवश्यकता नहीं होती है।
चरण 3: तकनीकी स्पष्टीकरण: स्क्रीन
स्क्रीन दृष्टि की दृढ़ता पर काम कर रही है। स्क्रीन इतनी तेजी से ताज़ा हो रही है, कि मानव आँख यह नहीं देख सकती है कि कुछ एल ई डी तेजी से बंद और चालू हो रहे हैं। वास्तव में, डिस्प्ले क्लॉक को धीमा करके, कोई फ्लैशिंग को नोटिस कर सकता है।
प्रदर्शन उन पंक्तियों के लिए संग्रहीत डेटा के अनुसार सभी आठ पंक्तियों को चालू करता है, और प्रदर्शन एक कॉलम को चालू करता है। फिर यह जल्दी से आठ पंक्तियों के लिए अगली डेटा प्रविष्टि में बदल जाता है और अगले कॉलम को चालू कर देता है - जबकि अन्य सभी कॉलम बंद हो जाते हैं। यह प्रक्रिया इतनी तेज गति से जारी रहती है कि एलईडी की झिलमिलाहट ध्यान देने योग्य नहीं हो जाती है।
प्रदर्शन के लिए डेटा संग्रहण VHDL फ़ाइल में आर्किटेक्चर के तुरंत बाद निम्नलिखित तरीके से आरंभ किया जाता है:
सिग्नल RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 डाउनटू 0): = "00000000";
सिग्नल ग्रीनए, ग्रीनबी, ग्रीनसी, ग्रीनडी, ग्रीनई, ग्रीनएफ, ग्रीनजी, ग्रीनएच: std_logic_vector (7 डाउनटू 0):= "00000000"; -- कॉलम के आधार पर पंक्ति डेटा: GREEN
एलईडी डिस्प्ले मैट्रिक्स को नियंत्रित करने वाली प्रक्रिया का एक छोटा सा टुकड़ा निम्नलिखित है।
-- प्रक्रिया जो एलईडी डिस्प्ले मैट्रिक्स डिस्प्ले को नियंत्रित करती है: प्रक्रिया (ColCLK) -- 0 - 16 दोनों 8X8 RED और 8x8 GREEN मैट्रिक्स चर RowCount को ताज़ा करने के लिए: पूर्णांक श्रेणी 0 से 16: = 0; शुरू करें अगर (राइजिंग_एज (ColCLK)) तो अगर (RowCount = 0) तो DORow <= RedA; -- संगत कॉलम DOCol के लिए पंक्ति डेटा <= "1000000000000000"; -- कॉलम ट्रिगर -- इस कोड को "0000000000000001" तक सभी तरह से दोहराएं -- RedB, RedC… GreenA, GreenB… GreenH में बदलें
ग्रीनएच के अंत में, प्रक्रिया समाप्त होने से ठीक पहले इस स्निपेट को RowCount को वापस शून्य पर रीसेट करने के लिए शामिल किया गया है।
अगर (RowCount = 15) तो -- कॉलम A RowCount से रीफ़्रेश करें रीफ़्रेश करें:= 0; अन्य रोकाउंट: = रोकाउंट + 1; - कॉलम के माध्यम से शिफ्ट करें यदि;
अब, उस घड़ी की व्याख्या करने के लिए जो प्रदर्शन प्रक्रिया की संवेदनशीलता सूची में है। बेसिस3 बोर्ड में एक आंतरिक घड़ी है जो 100 मेगाहर्ट्ज पर काम कर रही है। हमारे उद्देश्यों के लिए, यह एक घड़ी की तुलना में बहुत तेज़ है इसलिए हमें निम्नलिखित प्रक्रिया का उपयोग करके इस घड़ी को 960Hz घड़ी में विभाजित करने की आवश्यकता होगी।
- 960HzCLKDivider पर चलने वाली घड़ी प्रक्रिया: प्रक्रिया (CLK) चर clkcount: पूर्णांक श्रेणी 0 से 52083: = 0; शुरू करें अगर (राइजिंग_एज (सीएलके)) तो clkcount:= clkcount + 1; अगर (क्लककाउंट = 52083) तो ColCLK <= नहीं (ColCLK); क्लककाउंट:= 0; अगर अंत; अगर अंत; प्रक्रिया समाप्त;
चरण 4: तकनीकी स्पष्टीकरण: प्रदर्शित जानकारी को बदलना
वीएचडीएल कोड में, स्क्रीन पर प्रदर्शित होने वाली सूचना या डेटा को कर्सर प्रक्रिया द्वारा नियंत्रित किया जाता है, जिसकी संवेदनशीलता सूची में एक अलग घड़ी होती है। इस कोड को BtnCLK कहा जाता था, एक घड़ी जिसे बटनों को दबाने पर डिबाचिंग को कम करने के लिए डिज़ाइन किया गया था। इसे इसलिए शामिल किया गया है ताकि यदि कोई बटन दबाया जाता है, तो शीर्ष पंक्ति का कर्सर स्तंभों पर बहुत तेज़ी से नहीं चलता है।
- 5 हर्ट्ज पर चलने वाली घड़ी की प्रक्रिया। बटनसीएलके: प्रक्रिया (सीएलके) चर btnclkcount: पूर्णांक रेंज 0 से 10000001: = 0; शुरू करें अगर (राइजिंग_एज (सीएलके)) तो अगर (btnclkcount = 10000000) तो btnclkcount:= 0; बीटीएनसीएलके <= नहीं (बीटीएनसीएलके); अन्य btnclkcount:= btnclkcount + 1; अगर अंत; अगर अंत; प्रक्रिया समाप्त;
इस प्रक्रिया के बीटीएनसीएलके सिग्नल आउटपुट के साथ, अब हम कर्सर प्रक्रिया की व्याख्या कर सकते हैं। कर्सर प्रक्रिया की संवेदनशीलता सूची में केवल BtnCLK है, लेकिन कोड ब्लॉक में, बटन की स्थिति की जाँच की जाती है और इससे RedA, RedB… GreenH के लिए डेटा बदल जाएगा। यहां कर्सर कोड का एक स्निपेट दिया गया है, जिसमें पहले कॉलम के लिए रीसेट ब्लॉक और ब्लॉक शामिल है।
कर्सर: प्रक्रिया (बीटीएनसीएलके) चर OCursorCol: STD_LOGIC_VECTOR (2 डाउनटू 0):= "000"; -- OCursorCol पिछले कॉलम वैरिएबल NCursorCol का ट्रैक रखता है: STD_LOGIC_VECTOR (2 डाउनटू 0):= "000"; -- NCursorCol नया कर्सर कॉलम शुरू करता है --RESET कंडीशन (यूपी बटन) --बोर्ड को गेम रीस्टार्ट करने के लिए क्लियर किया जाता है अगर (राइजिंग_एज (बीटीएनसीएलके)) तो अगर (RST = '1') तो RedA <= "00000000"; रेडबी <= "00000000"; रेडसी <= "00000000"; रेडडी <= "00000000"; रेडई <= "00000000"; रेडफ <= "00000000"; रेडजी <= "00000000"; रेडएच <= "00000000"; ग्रीनए <= "00000000"; ग्रीनबी <= "00000000"; ग्रीनसी <= "00000000"; ग्रीनडी <= "00000000"; ग्रीनई <= "00000000"; ग्रीनएफ <= "00000000"; ग्रीनजी <= "00000000"; ग्रीनएच अगर (एलबीटीएन = '1') तो एनसीर्सरकॉल: = "111"; -- कॉलम एच एल्सिफ़ (आरबीटीएन = '1') फिर एनसीर्सरकॉल: = "001"; -- कॉलम बी एल्सिफ (सीबीटीएन = '1') फिर एनसीर्सरकॉल: = ओकुर्सरकॉल; - कॉलम वही रहता है NTurnState <= नहीं (टर्नस्टेट); - अगले खिलाड़ी की बारी को ट्रिगर करता है - नीचे से ऊपर तक वर्तमान कॉलम की जांच करता है और पहली एलईडी चालू करता है जो चालू नहीं है। रंग वर्तमान खिलाड़ी के कर्सर रंग पर निर्भर करता है। 7 डाउनटू 1 लूप में सीके के लिए यदि (रेडए(0) = '1') और (रेडए(सीके) = '0') और (ग्रीनए(सीके) = '0') तो रेडए(सीके) <= '1'; रेडए (0) <= '0'; बाहर जाएं; अगर अंत;
अगर (ग्रीनए (0) = '1') और (रेडए (सीके) = '0') और (ग्रीनए (सीके) = '0') तो
ग्रीनए (सीके) <= '1'; ग्रीनए(0) -- रेड प्लेयर ग्रीनए(0) <= '0'; अगर (NCursorCol = OCursorCol) तो -- अगर कुछ भी नहीं दबाया गया तो RedA(0) <= '1'; elsif (NCursorCol = "111") तब -- यदि Lbtn को RedH(0) <= '1' दबाया गया था; रेडए (0) <= '0'; elsif (NCursorCol = "001") तब -- Iff Rbtn को RedB(0) <= '1' दबाया गया; रेडा(0) -- ग्रीन प्लेयर रेडा(0) <= '0'; अगर (NCursorCol = OCursorCol) तो ग्रीनए(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 एक नई स्थिति में नहीं जाएगा, बल्कि टर्नस्टेट सिग्नल में बदलाव को ट्रिगर करेगा, जो कि यह नोट करने के लिए एक बिट सिग्नल है कि यह किस खिलाड़ी की बारी है। इसके अतिरिक्त, मध्य बटन एक कोड ब्लॉक चलाएगा जो जांचता है कि क्या शीर्ष पर सभी तरह से बहुत नीचे एक खाली पंक्ति है। यह एक मार्कर को सबसे निचली, अधूरी पंक्ति में रखने की कोशिश करेगा। याद रखें, यह एक कनेक्ट फोर गेम है।
नेस्टेड केस स्टेटमेंट में: टर्नस्टेट, हम बदलते हैं कि कर्सर का रंग क्या है और पहली पंक्ति के कौन से कॉलम के लिए हम डेटा बदलना चाहते हैं ताकि प्रदर्शन प्रक्रिया परिवर्तन को प्रतिबिंबित कर सके।
हम शेष सात मामलों के लिए इस मूल कोड को दोहराते हैं। FSM आरेख यह समझने में मददगार हो सकता है कि राज्य कैसे बदल रहे हैं।
चरण 5: कोड
यह Connect 4 के लिए कार्यात्मक कोड है जिसे Vivado सॉफ़्टवेयर का उपयोग करके VHDL में संकलित किया जा सकता है।
आपको खेल को चलाने और चलाने की अनुमति देने के लिए एक बाधा भी प्रदान की जाती है।
हमने एक ब्लॉक आरेख प्रदान किया है जो बताता है कि प्रत्येक प्रक्रिया के इनपुट और आउटपुट कैसे जुड़े हुए हैं।
सिफारिश की:
एक नियंत्रक को एक एमुलेटर से कैसे स्थापित करें, चलाएं और कनेक्ट करें: 7 कदम
एक एमुलेटर को एक नियंत्रक को कैसे स्थापित करें, चलाएं और कनेक्ट करें: क्या आप कभी आसपास बैठे हैं और अपने बचपन को एक युवा गेमर के रूप में याद करते हैं और कभी-कभी चाहते हैं कि आप अतीत के उन पुराने रत्नों को फिर से देख सकें? ठीक है, उसके लिए एक ऐप है …. अधिक विशेष रूप से गेमर्स का एक समुदाय है जो प्रोग्राम बनाते हैं
DIY एलईडी पट्टी: कैसे काटें, कनेक्ट करें, मिलाप करें और पावर एलईडी पट्टी: 3 कदम (चित्रों के साथ)
DIY एलईडी पट्टी: कैसे कट, कनेक्ट, सोल्डर और पावर एलईडी पट्टी: एलईडी पट्टी का उपयोग करके अपनी खुद की लाइट प्रोजेक्ट बनाने के लिए शुरुआती गाइड। लचीला विश्वसनीय और उपयोग में आसान, एलईडी स्ट्रिप्स विभिन्न प्रकार के अनुप्रयोगों के लिए सबसे अच्छा विकल्प हैं। मैं कवर करूंगा एक साधारण इनडोर 60 एलईडी/एम एलईडी पट्टी स्थापित करने की मूल बातें, लेकिन अंदर
साइमन गेम - फन गेम!: 5 कदम
साइमन गेम - फन गेम !: संदर्भ: यहां एक लंबे सप्ताहांत के बाद, आपको उन सभी कार्यों और कार्यों को पूरा करने के लिए वास्तव में कड़ी मेहनत करनी चाहिए जिनके लिए आप जिम्मेदार हैं। यह हमारे लिए अपने मस्तिष्क को प्रशिक्षित करने का समय है, है ना? उन उबाऊ और अर्थहीन खेलों के अलावा, साइमन गेम नामक एक गेम भी है
एंड्रॉइड फोन का उपयोग करके हेडलेस मोड में रास्पबेरी पाई से कनेक्ट करें वाईफाई भी कॉन्फ़िगर करें: 5 कदम
एंड्रॉइड फोन का उपयोग करके हेडलेस मोड में रास्पबेरी पाई से कनेक्ट करें वाईफाई को भी कॉन्फ़िगर करें: (इस्तेमाल की गई छवि रास्पबेरी पाई 3 मॉडल बी https://www.raspberrypi.org से है) यह निर्देश आपको दिखाएगा कि रास्पबेरी पाई को एंड्रॉइड फोन से कैसे जोड़ा जाए वाईफाई को भी कॉन्फ़िगर करें रास्पबेरी पाई पर हेडलेस मोड में यानी बिना कीबोर्ड, माउस और डिस्प्ले के। मैं
Arduino और Neopixel का उपयोग करके 4 गेम कनेक्ट करें: 7 चरण (चित्रों के साथ)
Arduino और Neopixel का उपयोग करके 4 गेम कनेक्ट करें: केवल एक ऑफ-द-शेल्फ खिलौना उपहार देने के बजाय, मैं अपने भतीजों को एक अनूठा उपहार देना चाहता था जिसे वे एक साथ रख सकें और (उम्मीद है) आनंद लें। जबकि इस परियोजना के लिए Arduino कोड उनके लिए समझना बहुत मुश्किल हो सकता है, बुनियादी अवधारणाएं