एक ही समय में एक ही कुंजी पंक्तियों को दबाते हुए


9

मैं VHDL में कीपैड डिजाइन कर रहा हूं। सब कुछ ठीक काम करता है जब केवल एक कुंजी दबाया जाता है। मैं एक स्टेट मशीन में एक कुंजी प्रेस के लिए प्रत्येक कॉलम को स्कैन कर रहा हूं और जब कोई कुंजी दबाया नहीं जाता है, तो वह स्थिति है जो pin4pin6pin7pin2 = "0000"मैं अगले कॉलम को स्कैन करने के लिए अगले राज्य पर स्विच करता हूं। इस प्रकार मैं स्तंभों को pin3pin1pin5क्रमिक रूप से सेट करता हूं "001", "010"और "100"

स्कैनिंग के pin3pin1pin5रूप में "001"और अगर pin4pin6pin7pin2है "0100"तो बस "9" दबाया जाता है। मैं VHDL pin4pin6pin7pin2में इनपुट और pin3pin1pin5आउटपुट पोर्ट के रूप में घोषित करता हूं । जब मैं एक ही समय में 6 और 9 दबाएँ pin6और pin7कर रहे हैं high। पहली दबाए गए कुंजी को पढ़ा जाता है, दूसरे को अनदेखा किया जाता है। जब मैं एक ही समय में 3 और 7 दबाता हूं, तो पहली जीत के पहले कुछ एमएस के साथ दबाया जाता है और पहली कुंजी पढ़ी जाती है, दूसरी कुंजी को अनदेखा किया जाता है, pin2और pin4हैं high

यहाँ मुश्किल हिस्सा है। जब मैं एक ही समय में 4 और 6 दबाता हूं, तो मैं होने की उम्मीद pin7करता हूं highलेकिन यह बन जाता है lowऔर pin4pin6pin7pin2 = "0000", जो मुझे समझ नहीं आता कि कैसे और क्यों। क्योंकि "0000"बिना किसी दबाए कुंजी के रूप में पाया जाता है, राज्य मशीन राज्य से राज्य तक कूदती है। 4 और 6 को पकड़ते समय अगर कोई 4 बार धकेलता है और छोड़ता है, तो उसे 6 बार दबाया जाता है , जो एक बड़ा बग है । मुझे खुशी होगी अगर आप मुझे इस पर बहस करने में मदद कर सकते हैं!

एक ही बात "1" और "2" के साथ होती है, वही "7" और "8" के साथ एक ही पंक्ति पर कुंजियों के लिए। चूंकि यह एक चालू परियोजना है, मैं अपना VHDL कोड ऑनलाइन नहीं डाल सकता :( मुझे खुशी होगी अगर आप मुझे इससे उबरने के लिए सुझाव दे सकते हैं!

यहां छवि विवरण दर्ज करें

नीचे, Im मेरे कोड को बोर्ड पर अपलोड नहीं कर रहा है, कोई भी कोड नहीं चल रहा है। Pin5ग्राउंड से कनेक्ट होने पर, 1,2,4,5,7,8, *, 0 पर एक भी प्रेस Pin3एलईडी को चालू नहीं करता है, लेकिन अगर Im 6 दबा रहा है और 4 एक ही समय में Pin3एलईडी चालू है और Pin7एलईडी अभी भी चालू है, लेकिन जब मेरा कोड चल रहा है तो ऐसा नहीं होता है। हो सकता है कि मैंने कुछ गलत जोड़ा हो और सौभाग्य Pin7से, मैं नहीं जानता ...

यहां छवि विवरण दर्ज करें

नीचे कीपैड बोर्ड की योजनाएं हैं:

schematics


आप यह कैसे सुनिश्चित कर रहे हैं कि एक ही समय में 4 और 6 दबाने से 3 और 5 एक साथ पिन नहीं होते हैं?
fru1tbat

@ fru1tbat क्या आप संक्षिप्त रूप से थोड़ा अधिक विस्तार कर सकते हैं? अपना कोड अपलोड किए बिना जब बोर्ड पर कुछ नहीं होता है, तो मैं पिन 5 को जमीन से जोड़ता हूं, फिर पिन 5 एलईडी चालू होता है, फिर मैं "6" पिन 7 एलईडी दबाता हूं, बाद में मैं "4" और "6" दबाता हूं, इस समय पिन 3 LED चालू है और pin7 LED अभी भी चालू है।
अनारकली

@ लेकिन आपका मतलब है कि मुझे पंक्तियों के लिए पुल-अप का उपयोग करना चाहिए और स्तंभों के लिए ऊपर खींचना चाहिए? मैं सर्किट को संशोधित नहीं कर सकता। आपकी टिप्पणी से बहुत कुछ समझ में नहीं आया :(
अनारकी

अधिक पूर्ण होने के लिए, मैं एक उत्तर दूंगा। यह उपयोगी होगा यदि आप एक योजनाबद्ध दिखा प्रतिरोधों, एल ई डी, कॉलम ड्राइवरों और किसी भी इनवर्टर या ट्रांजिस्टर प्रदान कर सकते हैं जो सर्किट में हो सकते हैं। 4 पंक्तियाँ और 3 कॉलम सीधे CPLD या FPGA से जुड़े हैं?
टुट

@ लेकिन कीपैड सीधे FPGA से जुड़ा नहीं है, FPGA में विभिन्न बोर्डों को जोड़ने के लिए बीच में एक और बोर्ड है, और मैंने योजनाबद्धता को जोड़ा।
अनारकली

जवाबों:


4

संक्षिप्त उत्तर:

अपना तर्क उलटा करो। स्तंभ का चयन करें लाइनों को ओपन-ड्रेन (या ओपन-कलेक्टर) तर्क के साथ जहां चयनित कॉलम को कम खींचा गया है और संयुक्त राष्ट्र के चयनित कॉलम तैर रहे हैं। जब आप एक पंक्ति को देखते हैं, तो '0' द्वारा एक की-प्रेस का पता लगाया जाएगा। अन-प्रेस कीज़ का पता '1' द्वारा लगाया जाएगा।

अब विवरण:

जैसा कि EEIngenuity बताता है, जब आप एक ही पंक्ति में 2 बटन दबाते हैं, तो इसका परिणाम उनके संबंधित कॉलम के बीच शॉर्ट-सर्किट होता है। यह (और कई प्रमुख प्रेस को शामिल करने वाली समस्याएं) आमतौर पर प्रत्येक स्विच के साथ श्रृंखला में एक डायोड जोड़कर कीबोर्ड मैट्रिक्स में दूर हो जाती है।

चूंकि डायोड जोड़ना आपके लिए कोई विकल्प नहीं है, इसलिए आपको अपने निष्क्रिय कॉलम चयन के आउटपुट को फ्लोट करने की आवश्यकता होगी, क्योंकि वे आपके सक्रिय स्तंभ के चयन के विपरीत विपरीत ध्रुवता पर ड्राइव करने की कोशिश कर रहे हैं। यह ओपन-ड्रेन लॉजिक का उपयोग करके किया जाता है। यदि आपका कॉलम चयन सीधे CPLD या FPGA से जुड़ा हुआ है, तो आपको अपने VHDL कोड में इसे पूरा करने में सक्षम होना चाहिए।

आपके प्रश्न के फोटो से पता चलता है कि आपके पास प्रत्येक स्तंभ और प्रत्येक पंक्ति पर पुल-अप रोकनेवाला है। स्तंभों पर पुल-अप अनावश्यक हैं, लेकिन कुछ भी चोट नहीं पहुंचाएगा। प्रत्येक पंक्ति पर पुल-अप एक उच्च स्थिति को आश्वस्त करेगा जब तक कि स्तंभ चयन पर (बंद स्विच के माध्यम से) खुले-ड्रेन चालक द्वारा कम खींचा न जाए।

मुझे आपके सर्किट के बारे में कुछ धारणाएँ बनानी पड़ीं क्योंकि आपने एक पूर्ण योजनाबद्ध या अपना वीएचडीएल कोड प्रदान नहीं किया है। तुम कहो

जब कोई कुंजी दबाया जाता है, जो स्थिति pin4pin6pin7pin2 = "0000" है

अभी तक आपके द्वारा प्रदान की गई तस्वीर से, पुल-अप प्रतिरोधों को दिखाया गया है। इसका मतलब यह है कि आपके पास पहले से ही एक तर्क उलटा है, संभवतः आपके वीएचडीएल कोड में (या कम संभावना है) आपकी पंक्तियों और आपके तर्क उपकरण (सीपीएलडी या एफपीजीए) के बीच इनवर्टर।

संपादित करें:

आपकी टिप्पणी के अनुसार, आप अपने विवरणों में नकारात्मक तर्क का उपयोग कर रहे हैं: "0000" इंगित करता है कि सभी चार पिन उच्च हैं, आदि। ऐसा होने पर, स्तंभ चयन और पंक्ति संकेतों को सीधे कनेक्टर 2 से सीधे अपने योजनाबद्ध FPGA पर जाने के लिए, अपने FPGA में कॉलम चयन आउटपुट के लिए ओपन-ड्रेन लॉजिक का उपयोग करके ऊपर दिए गए मेरे निर्देशों का पालन करें।

मैं एक VHDL विशेषज्ञ नहीं हूं, लेकिन मुझे यह Xilinx से मिला :

निम्नलिखित कोड का उपयोग करके खुले नाली बफर को इंजेक्ट करें:

VHDL:

dout <= 'Z' जब din = '1' और '0';

अपने योजनाबद्ध में भी ध्यान दें, सभी एल ई डी को पीछे की तरफ वायर्ड दिखाया गया है। एनोड्स वर्तमान-सीमित प्रतिरोधों पर जाते हैं और कैथोड सिग्नल लाइनों पर जाते हैं। एल ई डी प्रकाश जब संकेत लाइनों कम खींच रहे हैं।


मैं स्कैनर ड्राइवर स्थापित करने वाले स्कीमैटिक्स को स्कैन करने वाला
हूं

आप सही हैं कि pin4pin6pin7pin2 = "0000"कोई महत्वपूर्ण प्रेस वास्तव में नहीं है 1111। मेरे प्रश्न में 1s 0 होना चाहिए, 0s 1s होना चाहिए, मैंने प्रश्न को थोड़ा सा क्रिप्ट करने की कोशिश की, इसके लिए खेद है कि अगर यह गलतफहमी हुई ...
Anarkie

मैंने योजनाएँ जोड़ीं।
अनारकली

आपके स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, आपके उत्तर को पढ़ने के बाद मेरे पास कुछ विचार हैं लेकिन पहले "कॉलम चल रहे हैं", "आउटपुट को फ्लोट करने की आवश्यकता है" के साथ आपका क्या मतलब है, फ्लोट द्वारा क्या आपका मतलब है: 110, 101, 011? यह मैं पहले से ही कर रहा हूं, वास्तव में मेरे कोड में जब एक कुंजी को दबाया जाता है तो अन्य सभी कुंजियों को अनदेखा किया जाना चाहिए मुझे समझ नहीं आता कि एलईडी कैसे बंद हो जाती है और पिन 7 उच्च (1) हो जाता है, जबकि कोड चल रहा है। वैसे भी अगर मुझे सही समझ में आ रहा है कि आपका समाधान सुझाव दे रहा है जबकि IM स्कैनिंग पिन 5, आउटपुट पोर्ट "110", मेरे पास होना चाहिए out <= 'pin3' when din='1' else '0';
अनारकली

1
मेरे द्वारा दिए गए लिंक को देखें: ओपन-ड्रेन (या ओपन-कलेक्टर) । उस कॉलम लाइन पर 0V चलाकर सक्रिय कॉलम का चयन किया जाता है। निष्क्रिय स्तंभों को उस लाइन पर 3.3V के साथ नहीं चलाया जाना चाहिए, लेकिन उन्हें (उच्च प्रतिबाधा अवस्था में) फ्लोट करने की आवश्यकता होती है, जो सर्किट से उन पंक्तियों को प्रभावी ढंग से डिस्कनेक्ट करता है। यदि आप उन्हें 3.3V पर ड्राइव करने का प्रयास करते हैं, तो एक ही समय में एक ही पंक्ति में 2 बटन दबाकर बनाया गया शॉर्ट-सर्किट, कम ड्राइव करने की कोशिश करने वाले और उच्च ड्राइव करने की कोशिश कर रहे अन्य लोगों के बीच विवाद का कारण बनेगा।
टुट

2

चूंकि आप VHDL का उपयोग कर रहे हैं और आपके पास एक अतुल्यकालिक इनपुट है, इसलिए मैं यह उत्तर लिख रहा हूं ताकि आप एहतियात बरत सकें। मुझे यकीन नहीं है कि यह आपका मुद्दा है लेकिन यह बहुत अच्छी तरह से हो सकता है।

एक प्रश्न देखें जो मैंने कुछ समय पहले पूछा था: VHDL: बिट्स की गिनती करते समय मॉड्यूल अनियमित रूप से विफल हो जाता है

अब, आप कहते हैं कि:

क्योंकि "0000" को एक महत्वपूर्ण कुंजी के रूप में पाया जाता है, राज्य मशीन राज्य से राज्य तक कूदती है। 4 और 6 को पकड़ते समय अगर कोई 4 बार धकेलता है और छोड़ता है, तो इसे 6 बार दबाया जाता है, जो एक बड़ा बग है।

जो कुछ हद तक मैं सामना कर रहा था के समान है। मेरे पास एक मुद्दा था जहां मेरी राज्य मशीन राज्यों को छोड़ देगी, जो असंभव लग रहा था।

यदि आप ऊपर दिए गए प्रश्न का उत्तर पढ़ते हैं, तो आप देखेंगे कि इनपुट लाइन में सिंक्रोनाइज़र को जोड़ने की सिफारिश की जाती है, इससे पहले कि वह आपके राज्य मशीन में फीड हो। यह आमतौर पर श्रृंखला में दो डी फ्लिप फ्लॉप के साथ पूरा किया जाता है:

यहां छवि विवरण दर्ज करें

आपके बटन इनपुट का आपके एचडब्ल्यू के साथ समन्वयित न होना बहुत ही विचित्र मुद्दों का कारण बनता है, जिसे मैंने अपने एन 64 प्रोजेक्ट के साथ अनुभव किया है। इस छोटे से HW को जोड़ना लगभग जादू जैसा था।

इसलिए पहले जांच लें कि आपके इनपुट सिंक किए जा रहे हैं।


उत्तर पर सिंक्रोनाइज़र को लागू करना मुश्किल नहीं लगता है, लेकिन जब मैं इस प्रक्रिया को पढ़ता हूं, तो मुझे जो समझ में आता है वह async_in3 घड़ी चक्रों के साथ विलंबित होता है, लेकिन इसका मूल्य और सब कुछ समान है?
अनारकली

बड़ा अंतर यह है कि आपका सिग्नल एसिंक्रोनस से सिंक्रोनस में बदल जाएगा। कभी-कभी अतुल्यकालिक संकेतों (जैसे आपके बटन) के साथ एचडब्ल्यू में क्या होता है बिट्स "मेटा-स्थिरता" में हैं, यह एचडब्ल्यू में बहुत ही अजीब त्रुटियों का कारण बनता है। डी फ्लिप फ्लॉप का उपयोग यह सुनिश्चित करता है कि मेटा-स्थिरता आपके डिज़ाइन में नहीं होती है। मुझे इस की प्रभावशीलता पर भी संदेह था, लेकिन इसने मेरे मुद्दे को पूरी तरह से हल कर दिया।
निक विलियम्स

मैंने कोशिश की, एक कोशिश के लायक था, लेकिन मदद नहीं की :(
अनारकी

1

यह एक दिलचस्प सवाल है! जब आप key4 दबाते हैं, तो आप pin7 पर कम देख रहे हैं और key6 pin3 और pin5 की वजह से है।

आगे समझाने के लिए, pin3 और pin5 एक ही समय में कभी भी उच्च नहीं होंगे - उनमें से एक हमेशा जमीन के लिए एक पथ होगा (आपके डिजाइन के अनुसार)। इस प्रकार, जब आप कुंजी 4 और कुंजी 6 दबाते हैं, तो आप पिन 7 के लिए जमीन पर एक रास्ता बना रहे हैं।

चित्र देखें:

पिन 7 ग्राउंड का रास्ता देखता है।  आपके पास शॉर्ट सर्किट है।


मैंने अपने प्रश्न के लिए एक तस्वीर जोड़ी और पिन 7 तब भी उच्च दिखता है जब दोनों चाबियाँ दबाए जाते हैं।
अनारकली

ओपी ने समझाया कि वह किसी भी समय एक ही समय में पिन 3, 1 या 5 हाई नहीं बढ़ाता है। वह स्तंभों के साथ अनुक्रम करता है: "001", "010", और "100. पिंस 3 और 5 कभी भी एक साथ शुरू करने के लिए उच्च नहीं होते हैं।
निक विलियम्स

1
यह बिंदु @EEIngenuity बनाने की कोशिश कर रहा है - पिन 3 और 5 के बीच एक स्पष्ट रास्ता है, जिसका कभी भी समान मूल्य नहीं होगा, इस प्रकार, जब आप कुंजी 4 और कुंजी 6 दबाते हैं, तो आप pin7 के लिए जमीन पर एक रास्ता बना रहे हैं। "
fru1tbat

1
@ अर्नकी तस्वीर में पिन 3 जीएनडी या वीडीडी से जुड़ा नहीं है। यह एक फ्लोटिंग नोड है। यह शॉर्ट-सर्किट परिदृश्य नहीं बनाता है जो आपके मूल परीक्षण में है। पिन 3 को वीडीडी और पिन 5 को जीएनडी से जोड़ने की कोशिश करें और इस परीक्षण को दोहराएं।
मिरोन वी

1
@EEIngenuity आप बिलकुल सही हैं !!! हां, हां जब मैं पिन 3 को वीडीडी से जोड़ता हूं, तो पिन 7 कम हो जाता है !!! तो कृपया मेरी मदद करें कि मैं इस समस्या को कैसे दूर कर सकता हूं और इसे काम कर सकता हूं :( मैं VHDL का उपयोग कर रहा हूं और एक अन्य सहयोगी जो एक अलग टीम में एक ही परियोजना में है, इस समस्या का सामना नहीं करता है, इसलिए किसी तरह से उसने इसे हल किया लेकिन मैं डॉन 'पता नहीं कैसे, वही कीपैड, वही बोर्ड!
अनारकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.