विषयसूची:

वीएचडीएल में मास्टरमाइंड गेम: 3 चरण
वीएचडीएल में मास्टरमाइंड गेम: 3 चरण

वीडियो: वीएचडीएल में मास्टरमाइंड गेम: 3 चरण

वीडियो: वीएचडीएल में मास्टरमाइंड गेम: 3 चरण
वीडियो: Introduction to DRAM Memory Architecture | Career in Front End Design 2024, नवंबर
Anonim
VHDL. में मास्टरमाइंड गेम
VHDL. में मास्टरमाइंड गेम
VHDL. में मास्टरमाइंड गेम
VHDL. में मास्टरमाइंड गेम

हमारे प्रोजेक्ट के लिए, हमने बेसिस3 बोर्ड पर खेले जाने वाले वीएचडीएल में "मास्टरमाइंड" गेम बनाया। मास्टरमाइंड पारंपरिक रूप से खूंटे और एक गेम बोर्ड के साथ खेला जाने वाला एक कोड-ब्रेकिंग गेम है। खिलाड़ी एक खिलाड़ी दो से छिपे हुए 4 की एक पंक्ति में मिश्रित रंगों के खूंटे रखता है। खिलाड़ी दो के पास बोर्ड पर खूंटे रखने के अनुमानों की संख्या 'x' होती है, जो खिलाड़ी एक को दिखाई देती है। प्रत्येक अनुमान के बाद, खिलाड़ी दो को 2 संख्याओं के बारे में सूचित किया जाता है: कितने खूंटे सही रंग हैं, और कितने खूंटे पंक्ति में सही स्थिति में हैं। उन सुरागों का उपयोग करते हुए, खिलाड़ी दो को पिन के सही क्रम का अनुमान लगाना चाहिए, जिसे खिलाड़ी ने आवंटित संख्या अनुमान में रखा है।

हमारे कार्यान्वयन में, खेल एकल खिलाड़ी है। प्रोग्राम द्वारा खूंटे का एक यादृच्छिक संयोजन उत्पन्न किया जाता है, और खिलाड़ी को सही क्रम का अनुमान लगाने के लिए बेसिस 3 बोर्ड का उपयोग करना चाहिए। बाइनरी मानों द्वारा दर्शाए गए चार "रंग" हैं। 7-सेगमेंट डिस्प्ले तीन मान दिखाता है: शेष घुमाव, सही स्थिति में पिन की संख्या, और पिन की संख्या जो गलत स्थिति में सही रंग हैं (ये मान 9, 0 और 0 से शुरू होते हैं)। खिलाड़ी अपने अनुमान के लिए बाइनरी मानों का चयन करने के लिए बोर्ड पर स्विच का उपयोग करता है, और अनुमान जमा करने के लिए एक और स्विच फ़्लिप करता है। यदि वे सही हैं, तो गेम समाप्त हो जाता है और 7-सेगमेंट डिस्प्ले "GG" दिखाता है। यदि नहीं, तो टर्न काउंटर 1 से कम हो जाता है और खिलाड़ी इस आधार पर फीडबैक प्राप्त करता है कि उनके अनुमान में कितने पिन संयोजन में पिन के रंग या स्थिति से मेल खाते हैं। यदि खिलाड़ी सही ढंग से अनुमान लगाए बिना मोड़ से बाहर निकलता है, तो डिस्प्ले "GO" (गेम ओवर का प्रतिनिधित्व) दिखाता है। खिलाड़ी किसी भी समय शुरू करने के लिए रीसेट स्विच को फ्लिप भी कर सकता है।

चरण 1: सामग्री

सामग्री
सामग्री
सामग्री
सामग्री
सामग्री
सामग्री

चूंकि पूरा गेम बोर्ड पर ही खेला जा सकता है, केवल आवश्यक सामग्री बेसिस 3 बोर्ड, बोर्ड से कनेक्ट करने के लिए एक माइक्रो यूएसबी केबल, और एक कंप्यूटर/लैपटॉप है जिसे आप कोड करने के लिए उपयोग कर सकते हैं!

चरण 2: कोड

कोड
कोड
कोड
कोड

इस गेम को FPGA पर काम करने के लिए, इसे लिखने का सबसे आसान तरीका एक स्टेट मशीन बनाना होगा। एक राज्य मशीन होने से खेल को वास्तव में काम करने के लिए आवश्यक अनुक्रमिक और इंटरैक्टिव अनुभव की अनुमति मिलती है। सब कुछ सुचारू रूप से चलाने के लिए, स्टेट मशीन FPGA के आंतरिक क्लॉक सिग्नल पर आधारित होगी, यह सुनिश्चित करते हुए कि सब कुछ सिंक में है। मुख्य मॉड्यूल चार राज्यों के साथ एक राज्य मशीन है; प्रारंभिक स्थिति (आरंभिक), सबमिट उत्तर राज्य (सबअन्स), डिस्प्ले स्टेट (डिस), और चेकएंडगेम स्टेट (चेकएंड)। स्टेट मशीन के साथ, मुख्य मॉड्यूल में दो सबमॉड्यूल होते हैं, एक 4-अंकों वाला सेवन सेगमेंट डिस्प्ले (जिसका अपना ClkDivider सबमॉड्यूल होता है), और रैंडम नंबर जेनरेटर (वास्तव में एक छद्म-यादृच्छिक संख्या जनरेटर)। लोगों के लिए यह देखने के लिए कि वे क्या आसान इनपुट कर रहे हैं, स्विच ऑन करने पर प्रत्येक स्विच के ऊपर एलईडी को चालू करने के लिए एक बुनियादी प्रक्रिया ब्लॉक भी है। कोड का एक मूल अवलोकन चित्र में दिए गए माइंड मैप में देखा जा सकता है।

देखने वाला पहला घटक रैंडम नंबर जेनरेटर (रैंडमजेन) है। चूंकि हार्डवेयर से उत्पन्न वास्तविक यादृच्छिक संख्या प्राप्त करना तकनीकी रूप से संभव नहीं है, इसलिए सबसे सरल उपाय यह था कि रैंडमजेन वास्तव में एक लीनियर-फीडबैक शिफ्ट रजिस्टर (एलएफएसआर) हो। LFSR में clk का इनपुट और आउटपुट "a" (एक 12-बिट संख्या) होता है। प्रत्येक घड़ी चक्र, "000000000001" से शुरू होकर एक नया 12-बिट नंबर उत्पन्न होता है, अंततः खुद को दोहराने से पहले 1 और 0 के 12-बिट्स के सभी संयोजनों के माध्यम से जा रहा है। आउटपुट "ए" हर घड़ी चक्र दिया जाता है, इसलिए यह लगातार चल रहा है। Clk को मुख्य मॉड्यूल से Clk में मैप किया जाता है, और "a" को मुख्य मॉड्यूल में RandNum सिग्नल में मैप किया जाता है।

दूसरा सबमॉड्यूल 4-अंकों वाला सेवन सेगमेंट डिस्प्ले है। यह 4-अंकीय सात खंड प्रदर्शन प्रदर्शित करने का एक बहुत ही सरल तरीका है। डिस्प्ले मुख्य मॉड्यूल से Clk पर सेट है, फिर भी इस सबमॉड्यूल में ClkDivider का अपना सबमॉड्यूल है। ClkDivider (1298 Hz पर सेट) का उपयोग सेवन सेगमेंट के लिए घड़ी को गति देने के लिए किया जाता है ताकि सभी अंक एक ही समय पर दिखाई दें (क्योंकि वास्तव में एक समय में केवल एक अंक ही चालू हो सकता है)। वेरिएबल "डिजिट" का उपयोग डिस्प्ले पर स्पॉट के माध्यम से साइकिल चलाने के लिए किया जाता है, और प्रत्येक अंक के साथ मूल 4-बिट इनपुट डिस्प्ले की शर्तें आती हैं, जिसमें 0 से 9 अंक दिखाने के विकल्प होते हैं और कुछ भी नहीं। डिस्प्ले पर सबसे दूर का बायां अंक शून्य पर सेट है क्योंकि इस गेम में इसका उपयोग नहीं किया जाता है।

मुख्य मॉड्यूल में राज्य मशीन शामिल है। इस प्रक्रिया में चार अवस्थाएँ प्रारंभिक, SubAns, Dis, और CheckEnd हैं। जब प्रारंभिक अवस्था में, यदि सबमिटबीटीएन (चेकिंग के लिए आपके उत्तर को सबमिट करने के लिए इस्तेमाल किया जाने वाला स्विच) '1' पर सेट है, तो मशीन SubAns State में चली जाती है। कभी भी Rbtn (मशीन को रीसेट करने के लिए प्रयुक्त स्विच) को '1' पर सेट किया जाता है, फिर मशीन प्रारंभिक स्थिति में वापस आ जाती है। जब SubAns State में, जब SubmitBtn = '0' फिर से, यह Dis State में चला जाता है। जब डिस स्टेट में, यदि काउंटडाउन = 0 (अनुमान लगाने के लिए बाएं मुड़ें 0 पर गिरते हैं) या यदि RSpotCount = 4 (जिसका अर्थ है कि खिलाड़ी सही स्थानों पर सभी सही रंगों के रूप में), तो मशीन चेकएंड स्टेट में जाती है। यदि इनमें से कोई भी नहीं होता है, तो जब सबमिटबीटीएन = '1' फिर से होता है, तो यह एक और अनुमान लगाने की अनुमति देने के लिए सबअन्स स्थिति में वापस चला जाता है। जब चेकएंड स्थिति में, यह खेल का अंत होता है, और रीसेट को हिट करने का एकमात्र तरीका है, इसे प्रारंभिक स्थिति में वापस करना। यह स्टेट मशीन डायग्राम में आसानी से देखा जा सकता है। व्यवहारिक रूप से प्रारंभिक राज्य सब कुछ वापस प्रारंभिक स्थिति में शुरू करता है। उलटी गिनती (सिग्नल जो बचाता है कि खिलाड़ी के पास कितने मोड़ बचे हैं) को 9 पर सेट किया गया है, RSpotCount (सिग्नल जो बचाता है कि आपके द्वारा अनुमान लगाए गए कितने रंग सही जगह पर हैं) 0 पर सेट है, RColorCount (सिग्नल जो बचाता है कि कितने आपके द्वारा अनुमान लगाए गए रंग सही हैं लेकिन गलत जगह पर हैं) 0 पर सेट है, और छोटी उलटी गिनती (संकेत जो अंततः उलटी गिनती में मैप की जाती है जो वास्तव में बाद के राज्यों में प्रत्येक मोड़ को बदल देती है) को 9 पर सेट किया जाता है। इसके अलावा, प्रारंभिक स्थिति में रैंडनम (छद्म-यादृच्छिक उत्पन्न संख्या) चार अलग-अलग चेक (प्रत्येक 3-बिट रंग के लिए एक) में विभाजित है और सिग्नल चेक 1, चेक 2, चेक 3, चेक 4 में सहेजा गया है। ये चेक वही हैं जो आपके अनुमान से वास्तव में तुलना की जाती है, इसलिए भले ही LFSR हमेशा RandNum को हर चक्र को बदलने का कारण बना रहा हो, एक बार जब आप प्रारंभिक स्थिति छोड़ देते हैं तो चेक वही रहते हैं, जिससे सहेजे गए मान को आपके उत्तर की तुलना करने की अनुमति मिलती है। इसका मतलब यह भी है कि जब भी मशीन रीसेट हो जाती है, तो खिलाड़ी के पास अनुमान लगाने के लिए एक नया मूल्य होता है।

सबमिटअंसर स्टेट (SubAns) काउंटडाउन एनेबलर (सिग्नल "चेंज") को '1' में बदल देता है। टर्न ट्रैकिंग के काम करने के लिए बाद में इसकी आवश्यकता होती है। उसके बाद, राज्य स्विच से खिलाड़ी इनपुट की तुलना उपरोक्त राज्य में किए गए चेक से करता है। सिग्नल rs1, rs2, rs3, rs4 और सिग्नल rc1, rc2, rc3, rc4 पूर्णांक प्रकार हैं जो कि if स्टेटमेंट के आधार पर या तो 1 या 0 पर सेट होते हैं। सिग्नल rs सही जगह के लिए होते हैं और rc सही रंग के लिए होते हैं। उदाहरण के लिए यदि रंग 1 खिलाड़ी का अनुमान RandNum के चेक1 के बराबर है, तो rs1 = 1 क्योंकि इसका मतलब है कि सही रंग सही जगह पर है। यदि रंग 1 चेक 1 के बराबर नहीं है, लेकिन अन्य चेकों में से एक के बराबर है, तो आरसी = 1। यह प्रत्येक रंग और प्रत्येक चेक के लिए किया जाता है।

डिस्प्ले स्टेट (डिस) सबसे पहले काउंटडाउन एनेबलर की तलाश करता है। यदि यह '1' है, तो छोटी उलटी गिनती 1 नीचे जाती है (इसलिए पहली बारी पर यह 9 से 8 आदि तक जाती है)। नहीं तो मोड़ नहीं बदलता। इसके बावजूद, ऊपर से सभी rs मान जोड़े जाते हैं और RSpotCounter को सिग्नल करने के लिए असाइन किए जाते हैं। साथ ही सभी rc मान जोड़े जाते हैं और RColorCounter को असाइन किए जाते हैं। अंत में उलटी गिनती को छोटे उलटी गिनती का मूल्य सौंपा गया है। सिग्नल RSpotCounter, RColorCounter, और काउंटडाउन सभी प्रक्रिया के बाहर 4-बिट std_logic_vectors में परिवर्तित हो जाते हैं, और पोर्ट मैप के माध्यम से सेवन सेगमेंट डिस्प्ले सबमॉड्यूल में धकेल दिए जाते हैं। इस तरह, जब तक आप कोई नया उत्तर सबमिट नहीं करते, तब तक प्रदर्शन सही चीज़ें दिखाता है।

चेकएंड स्टेट इस बात के लिए है कि आप जीते हैं या हारे हैं। यदि आप जीत गए हैं (सभी 4 रंग सही जगह पर हैं, अन्यथा RSpotCounter = 4 के रूप में जाना जाता है), तो "GG" (तकनीकी रूप से 66 के रूप में दिखाया गया है) यह दिखाने के लिए सात खंड पर प्रदर्शित होता है कि आप जीत गए हैं। यदि आप हार गए हैं (काउंटडाउन 0 तक पहुंच गया है) तो गेम ओवर के डिस्प्ले पर "GO" (तकनीकी रूप से 60 के रूप में दिखाया गया है) प्रदर्शित होता है। किसी भी परिणाम के साथ, रीसेट स्विच को चालू करने से मशीन फिर से खेलने के लिए प्रारंभिक स्थिति में वापस आ जाएगी।

स्रोत कोड यहां पाया जा सकता है।

चरण 3: निष्कर्ष

इस परियोजना को पूरा करने से हमें अधिक जटिल सर्किट बनाने के बारे में बहुत कुछ सिखाया गया। हमारा प्रारंभिक डिजाइन एक परिमित राज्य मशीन नहीं था। हमें अलग-अलग तरीकों (FSM सहित) का उपयोग करके कई बार डिबग करना और कोड को फिर से लिखना मुश्किल लगा। प्रशिक्षक के सुझाव पर, हम FSM दृष्टिकोण से चिपके रहे और हम खेल को समाप्त करने में सक्षम थे। हमने सीखा कि पारंपरिक प्रोग्रामिंग दृष्टिकोण की तुलना में हार्डवेयर के आधार पर कोड को डिजाइन करना अधिक प्रभावी है। हमें सेवन सेगमेंट डिस्प्ले से जुड़ी कई चुनौतियों का भी सामना करना पड़ा। इसे "भूत" के बिना कई नंबर प्रदर्शित करना मुश्किल था, और हमें इसे पूरा करने के लिए एक घड़ी विभाजक का उपयोग करना पड़ा। यदि हम इस परियोजना को और विकसित करना चाहते हैं, तो हम रंगीन एल ई डी को बेसिस 3 से जोड़ देंगे ताकि उपयोगकर्ता रंगों के संख्यात्मक प्रतिनिधित्व के बजाय रंग (पारंपरिक खेल की तरह) देख सकें। अंततः, हमने जटिल सर्किट डिज़ाइन, वास्तविक जीवन अनुप्रयोगों और हार्डवेयर का उपयोग करने की चुनौतियों के बारे में अधिक समझ प्राप्त की, बजाय सही परिस्थितियों के साथ सिमुलेशन चलाने के।

सिफारिश की: