माइक्रोप्रोसेसर "गैरेज से बाहर"

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

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

माइक्रोप्रोसेसर किससे शुरू होता है? सिस्टम प्रोग्रामर से पूछें, और वह आपको जवाब देगा कि यह एक कमांड सिस्टम है। आरआईएससी वास्तुकला के लिए कुल फैशन के बावजूद, हमने मशीन शब्द के आकार के निर्देशों की लंबाई को टाई नहीं करने का फैसला किया। इसलिए, हमने कई प्रयोग किए। अजीब तरह से पर्याप्त है, लेकिन यह एक कमांड सिस्टम ... माइक्रोसॉफ्ट एक्सेल को डिजाइन करने के लिए एक बहुत ही सुविधाजनक उपकरण निकला। सबसे पहले, हमने कई स्तंभों पर प्रकाश डाला, उनका उपयोग तीन गणना प्रणाली - दशमलव, हेक्साडेसिमल और बाइनरी में निर्देश संख्या के लिए किया। परिणाम 256 लाइनों का था, एक बाइट में वर्णित राज्यों की संख्या के अनुसार। फिर हमने तार्किक रूप से निर्देशों को इस तरह से समूह बनाने की कोशिश की कि उनकी डिकोडिंग योजना यथासंभव सरल थी। निर्देशों का पहला ब्लॉक एकल-बाइट निर्देशों द्वारा कब्जा कर लिया गया था - उपसर्ग, संशोधक और सरल निर्देश। निर्देशों का निम्नलिखित ब्लॉक इस तरह दिखता है:

छवि

अगले चरण में, मुझे रजिस्टरों की संख्या और प्रकार के बारे में फैसला करना था। आपको लगता है कि कितने रजिस्टर अधिकांश कार्यों के लिए इष्टतम होंगे? इस प्रश्न के उत्तर उस व्यक्ति के व्यक्तित्व के आधार पर बहुत भिन्न हो सकते हैं जो जवाब देता है - 32 किसी के लिए पर्याप्त नहीं है, क्योंकि गैर-रजिस्टर वास्तुकला के अनुयायी हैं। हमने 16 सामान्य उद्देश्य रजिस्टरों पर रहने का फैसला किया। यह राशि असेंबली लैंग्वेज प्रोग्रामिंग के लिए काफी सुविधाजनक है, यह हमारे आर्किटेक्चर पर काफी सफल है और इसे एचडीएल में आसानी से लागू किया जाता है।

रजिस्टरों पर निर्णय लेने के बाद, हमने पूरी तरह से स्वतंत्र रूप से स्वतंत्र कमांड सिस्टम बनाने का फैसला किया - वास्तुकला में एक पूर्ण पते के लिए एक एकल संक्रमण कमांड नहीं है - सभी बदलाव वर्तमान कमांड के सापेक्ष किए जाते हैं। हम केवल कॉम्पैक्टनेस से ग्रस्त हैं, इसलिए सभी संक्रमण कमांड के तीन रूप हैं - 1, 2 और 3 बाइट्स के हस्ताक्षरित ऑफ़सेट। उदाहरण के लिए, 16-बिट ऑफ़सेट वाले संक्रमण नीचे दिखाए गए हैं:

छवि

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

कोड की स्थितिगत स्वतंत्रता एक और विशेषता का परिचय देती है - निरंतर डेटा तक पहुंच। चूंकि कोड एक मनमाने पते पर स्थित हो सकता है, इसलिए कोड के साथ निरंतर डेटा भी मनमाने ढंग से स्थित हो सकता है। समाधान काफी सरल निकला - एक ही NOTCH उपसर्ग का उपयोग करते हुए जब रजिस्टर में स्थिरांक लोड करना निष्पादन योग्य निर्देश के सापेक्ष एक ऑफसेट के रूप में निरंतर का उपयोग करता है - यह स्थिति को स्वतंत्र कोड में डेटा को संबोधित करने की समस्या को हल करता है।

कमांड सिस्टम को डिजाइन करने के बाद, जिसे आम तौर पर लगभग एक साल लगता था, हमने खुद को काऊर्टस और इकारस वेरिलोग वातावरण से लैस किया और ... महसूस किया कि हम जल्दी में थे। वेरिलोग के कमांड सिस्टम को लागू करने से यह काफी जटिल हो गया। जानकार लोगों ने एक सॉफ्टवेयर मॉडल पर साधारण सी में डिकोडर और अन्य कार्यात्मक डिवाइस लिखकर समाधान चलाने की सलाह दी। एक गैर-मौजूद प्रोसेसर के एमुलेटर को लागू करने और उस पर परीक्षण कार्यक्रम चलाने के बाद, चीजें बेहतर हो गईं। वेरिलॉग पर प्रोसेसर को लागू करने के लिए एक और छह महीने की आवश्यकता थी। यह कहा जाना चाहिए कि एक शुरुआत के लिए FPGA प्रोग्रामिंग अविश्वसनीय रूप से जटिल हो सकती है, और उच्च-स्तरीय भाषाओं में प्रोग्रामिंग के कई वर्षों के अनुभव भी कार्य को जटिल कर सकते हैं। इस मामले में, मॉडलिंग टूल बचाव में आते हैं। पहले चरण में, इकारस वेरिलॉग, एक मुफ्त सर्किट सिमुलेशन उपकरण जो कि सिग्नलों को प्रदर्शित करने के लिए GTKWave के साथ आता है, बेहद उपयोगी साबित हुआ। इन उपकरणों का उपयोग करके, आप देख सकते हैं कि किसी भी समय डिवाइस के साथ क्या हो रहा है। कुछ स्तर पर, इकारस वेरिलॉग की क्षमता कम हो गई और हमने मेंटरग्राफिस मॉडलसिम सिम्युलेटर का उपयोग किया, एक बहुत ही शक्तिशाली वाणिज्यिक उपकरण, एक स्ट्राइप्ड-डाउन संस्करण, जिसे एल्टर क्वार्टस के साथ मुफ्त में स्थापित किया जा सकता है।

आप डिबगिंग प्रक्रिया के बारे में लंबे समय तक बात कर सकते हैं। और कुछ बिंदु पर, जब FPGA संसाधनों पर एक पूर्ण तीसरे द्वारा कब्जा कर लिया गया था, अचानक एक समझ थी कि परिणामस्वरूप प्रोसेसर पहले से ही कुछ परियोजनाओं के लिए उपयोग किया जा सकता है।



प्रोसेसर की क्षमताओं को प्रदर्शित करने के लिए, हमने सबसे सरल फर्मवेयर लिखा, जो स्टार्टअप पर दूरस्थ टर्मिनल की स्क्रीन पर निम्न मेनू प्रदर्शित करता है:

 Welcomeest> एवरेस्ट कोर में आपका स्वागत है <Ever ────────┐
 │ 1 - एक्स-मॉडेम प्रोटोकॉल के माध्यम से बाइनरी फ़ाइल लोड करें binary
 │ 2 - पहले से लोड बाइनरी फ़ाइल चलाएं previously
 │ 3 - रैम दिखाएं (0x100000-0x100140) RAM
 │ 4 - संदेश रजिस्टर का परीक्षण of
 │ 5 - पहले से लोड की गई ANSI तस्वीर दिखाएं previously
 │ 6 - अंतर्निहित एएनएसआई तस्वीर # 1 built दिखाएं
 │ built - शो में निर्मित एएनएसआई तस्वीर # २ built
 ─ ─ ─ ─ ─ ─ ─ ─ ── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ झेलों के लिए लहंगे को ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─────────────────────────────┘


यदि आप 1 दबाते हैं, और यदि आपका टर्मिनल एक्स-मॉडेम प्रोटोकॉल का उपयोग करके फ़ाइल स्थानांतरण का समर्थन करता है, तो आप आकार में 4 Kb तक की फ़ाइल डाउनलोड कर सकते हैं। यह पाठ या ANSI- चित्र हो सकता है - इस स्थिति में, कुंजी 5 दबाने पर पाठ या चित्र स्क्रीन पर दिखाई देगा। लेकिन क्या इसके लिए कोई लेख लिखने लायक होगा? बेशक, इसलिए, जब आप टर्मिनल में 2 कुंजी दबाते हैं, तो नियंत्रण को पहले मेनू आइटम का उपयोग करके लोड किए गए कोड में स्थानांतरित किया जाता है। यदि आप डाउनलोड किए गए पाठ या एएनएसआई-चित्र पर नियंत्रण स्थानांतरित करते हैं, तो कुछ चरणों के बाद प्रोसेसर एक नॉनटेक्स्टेंट (अभी भी अनिश्चित कमांड) पर ठोकर खाएगा या किसी भी अस्पष्ट मेमोरी में बदल जाएगा। इस स्थिति में, प्रोसेसर चरण-दर-चरण मोड में जाएगा - टर्मिनल से प्राप्त प्रत्येक कोड बस प्रोसेसर की स्थिति को रिमोट टर्मिनल के आउटपुट के साथ एक प्रोसेसर निर्देश के निष्पादन का कारण होगा।

छवि

यह रीसेट कुंजी दबाने का समय है। हमने मंगल रोवर 2 बोर्ड पर "रीसेट" को बाएं बटन कहा।

डिवाइस को कुछ सार्थक बनाने के लिए, आपको मैक्रो असेंबलर की आवश्यकता होगी। इस संग्रह में, कोडांतरक के अलावा और कुछ उदाहरण हैं, हमने प्रोसेसर माइक्रोकोड के स्रोत कोड को रखा। निम्नलिखित एक सरल उपयोगकर्ता प्रोग्राम का एक उदाहरण है जिसे असेंबलर का उपयोग करके एक बाइनरी फ़ाइल में परिवर्तित किया जा सकता है और प्रोसेसर में लोड किया जा सकता है।

function user_main load r14, 0x2000 push r15 loop: call _get_sysclock load r2, 0x05F5E100 call _div64 call _print_dec lea r1, $shw_str call _puts call _uart_status rcr r0, 2 ;  RCV_RDY   jc done ;        load r0, 0x01000000 call _delay jmp loop done: pop r15 return end include tty.asm include delay.asm include mul.asm include div.asm include print_dec.asm include sysclock.asm $shw_str db ' seconds since boot',13,10,0 


टर्मिनल में किसी भी कुंजी को दबाने से पहले एक चक्र में यह कार्यक्रम डिवाइस की शुरुआत या रिमोट टर्मिनल पर रीसेट होने के बाद से सेकंड की संख्या के बारे में जानकारी प्रदर्शित करता है। व्यवहार में इसे जांचने के लिए, आपको जनरेट किए गए usr_demo2.bin फ़ाइल की आवश्यकता होगी।

कार्यक्रम के लिए एक छोटी व्याख्या। जिस समय डिवाइस चालू या रीसेट किया गया था, उस समय क्रिस्टल ऑसिलेटर की दालों की संख्या _get_sysclock सबरूटिन लौटाता है। सबरूटीन डंप उदाहरण:
 ; ------------------- _get_sysclock ------------------ 0198: 37 e3 ; DEC R14, 4 019a: 60 e3 ; MOV (R14), R3 019c: e3 ff fe ff f8 ; LOAD R3, 0xfffefff8 01a1: 68 03 ; MOV R0, (R3) 01a3: 36 33 ; INC R3, 4 01a5: 68 13 ; MOV R1, (R3) 01a7: 68 3e ; MOV R3, (R14) 01a9: 36 e3 ; INC R14, 4 01ab: 05 ; RETURN 


_Get_sysclock सबरूटीन से बाहर निकलते समय , रजिस्टर R0 में कम 32 बिट्स होते हैं, और रजिस्टर R1 में परिणाम के उच्च 32 बिट्स होते हैं।
निरंतर 0x05F5E100 एक सेकंड में एक घड़ी के दालों की संख्या है।

आप यहां मंगल रोवर 2 बोर्ड के लिए नवीनतम फर्मवेयर डाउनलोड कर सकते हैं

यदि आप हमारे प्रोजेक्ट की खबरें नहीं सुनते हैं, तो आपको पता होना चाहिए कि हम F4A को L4 माइक्रोकर्नल ट्रांसफर करने पर काम कर रहे हैं।
आपका ध्यान देने के लिए धन्यवाद।

Source: https://habr.com/ru/post/In222335/


All Articles