ऐसे उच्च पिक्सेल घड़ी आवृत्तियों पर वीजीए डिस्प्ले को चलाना कैसे संभव है?


12

मैं 80x30 टेक्स्ट मोड में 640x480 VGA डिस्प्ले ड्राइव करने के लिए असतत घटकों का उपयोग कर एक डिजिटल सर्किट पर काम कर रहा हूं।

640x480 डिस्प्ले के लिए, पिक्सेल घड़ी 25.175MHz है, जिसकी अवधि लगभग 40ns है। मुझे समझ नहीं आ रहा है कि मैं यह प्रदर्शित करने के लिए एक नया पिक्सेल कैसे प्रदान कर सकता हूँ।

मेरे सर्किट की मूल वास्तुकला इस प्रकार है:

  1. क्षैतिज पिक्सेल के लिए बाइनरी काउंटर 25.175MHz से 800 (640 दृश्यमान पिक्सेल + 160 सामने के पोर्च, सिंक, बैक पोर) के लिए गिना जाता है। 800 पर, वर्टिकल वर्टिकल लाइन काउंटर (और 525 लाइनों पर रीसेट)

  2. क्षैतिज और ऊर्ध्वाधर स्थिति का उपयोग करते हुए, वर्तमान वर्ण के x, y को समन्वित करें।

  3. X, y वर्ण का समन्वय, ASCII वर्ण को पुनः प्राप्त करने के लिए वीडियो मेमोरी में अनुक्रमणिका का उपयोग करना।

  4. चरित्र के लिए बिट पैटर्न प्राप्त करने के लिए चरित्र ROM में अनुक्रमणिका के लिए ASCII वर्ण का उपयोग करें

  5. पिक्सेल क्लॉक फ़्रीक्वेंसी पर 8 बिट्स के कैरेक्टर को व्यक्तिगत बिट्स में बदलने के लिए सीरियल शिफ्ट रजिस्टर के समानांतर का उपयोग करें

यदि आप श्रृंखला का अनुसरण करते हैं, तो यह जाता है: काउंटर -> रैम -> रोम -> सीरियल शिफ्ट रजिस्टर के समानांतर

सबसे तेज़ घटकों का उपयोग करके, मैं प्रचार देरी और पहुँच समय को जोड़कर लगभग 15ns + 20ns + 70ns + 15ns = 120ns, 25MHz के लिए 40ns की अवधि से बहुत अधिक हो सकता हूं।

यहां तक ​​कि उच्च रिज़ॉल्यूशन और ताज़ा दरों पर, आप पिक्सेल घड़ियों को 100 मेगाहर्ट्ज से ऊपर रख सकते हैं, जो कि 10ns की अवधि होगी।

हर 10ns में नए पिक्सेल प्रदान करना कैसे संभव है जब रैम / रोम के लिए उपयोग का समय पहले से ही अच्छी तरह से ऊपर है, आपके सिस्टम के अन्य सभी संकेतों पर भी विचार नहीं कर रहा है?


7
आप समर्पित वीडियो रैम का उपयोग करें, और सीधे अपने वीडियो सिग्नल में घड़ी। आप यह पता लगाने पर काम करते हैं कि वास्तव में प्रदर्शित करने से पहले आपको क्या प्रदर्शित करना है।
चूल्हा

2
मैक्सिमाइट के बारे में पढ़ें । यह सिर्फ MCU के परिधीय हार्डवेयर और VGA पोर्ट को चलाने के लिए कुछ प्रतिरोधों का उपयोग करता है। PIC32 परिधीय का उपयोग करके जांच शुरू करें। ठीक काम करता है। (मैं एक Maximite यहाँ है।)
Jonk

"डॉन लैंकेस्टर" द्वारा "द सस्ता वीडियो कुकबुक"
जैसन

जवाबों:


17

दो मुख्य कारण हैं जो आपको यह चुनौतीपूर्ण लग रहा है।

सबसे पहले, आप पुराने और अधिक असतत (निचले पैमाने पर एकीकरण) भागों का उपयोग कर रहे हैं, जो कि वीजीए के युग में ऐसा करने के लिए उपयोग किया गया होगा।

लेकिन अगले, आप उन्हें एक atypical तरीके से उपयोग कर रहे हैं। विशेष रूप से, आपका दृष्टिकोण वह नहीं है pipelinedजिसका अर्थ है कि आपको कई जोड़ने होंगे अपने अंतराल का निर्धारण करते समय देरी , और इस तरह की दर।

इसके विपरीत, तुल्यकालिक डिजिटल डिजाइन जो गति प्राप्त करने का प्रयास करते हैं, वे रजिस्टरों के बीच जितना संभव हो उतना कम करने की कोशिश करते हैं।

हालांकि विवरण शायद थोड़ा अलग होगा, गंभीर रूप से यह कुछ इस तरह से काम करेगा:

  • आप पता बढ़ाते हैं या फिर रीसेट करते हैं, फिर वह रजिस्टर में जाता है।
  • आप एड्रेस को सिंक्रोनस मेमोरी में लाच करते हैं
  • आप सिंक्रोनस मेमोरी के आउटपुट को लैच करते हैं
  • आप इसे सिंक्रोनस कैरेक्टर जनरेटर के पते में लेटते हैं
  • आप वर्ण जनरेटर का आउटपुट आउटपुट रजिस्टर में लाच करते हैं
  • पैलेट लुकअप लागू करें ...
  • तुल्यकालिक DAC में ...

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

इस तरह से बनाया गया एक डिजाइन एक उत्पादन का निर्माण करने के लिए कई घड़ियों को ले जाएगा - विलंबता वास्तव में एक विशुद्ध रूप से दहनशील डिजाइन से अधिक होगी। लेकिन यह बहुत तेज घड़ी के प्रत्येक चक्र पर एक नया सही आउटपुट उत्पन्न करता है।

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

व्यवहार में, लगभग सभी जटिल डिजिटल सिस्टम इस तरह से काम करते हैं, जैसा कि यह एक महान विचार है - ठीक है जब तक कि एक pipelined CPU पहले के कम्प्यूटेशनल परिणाम या सशर्त शाखा पर निर्भरता नहीं मारता है ... तब चीजें दिलचस्प हो जाती हैं, जैसा कि वे इसके बारे में बात करेंगे। एक डिजिटल सिस्टम वर्ग के अगले व्याख्यान में - लेकिन सौभाग्य से आपकी वीजीए स्थिति बहुत सरल है, खासकर यदि आप अभी तक फाड़ प्रभाव के बारे में चिंता नहीं करते हैं अगर स्क्रीन को खींचा जा रहा है तो चरित्र बफर बदल जाता है।

एक व्यावहारिक बात के रूप में यदि आप इसे बनाना चाहते हैं, तो इसे FPGA में करें। यदि आप आंतरिक मेमोरी का उपयोग करते हैं या आप बाहरी मेमोरी का उपयोग करते हैं तो सिंक्रोनस IO रजिस्टरों का उपयोग करने पर आप पर बहुत अधिक समकालिक यादों को बल मिलेगा। आपको एक उचित डिज़ाइन की ओर बहुत अधिक कुहनी मिलेगी, कपड़े अपने आप ही अपने असतत भागों की तुलना में तेज़ हो जाएंगे, और निश्चित रूप से यदि आप एक गलती करते हैं तो आपको केवल अपने अंगूठे को मोड़ने की आवश्यकता होती है, जबकि यह एक लंबा दिन बिताने के बजाय पुनर्मिलन करता है ।


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

मुझे लगता है कि आप इसे अधिक जटिल कर रहे हैं। उन्होंने पहले ही कहा कि वह एक 8-बिट शिफ्ट रजिस्टर का उपयोग कर रहे हैं जो प्रति पिक्सेल एक बिट को आउटपुट करता है। संभवतः यह कुंडी के साथ 8-बिट शिफ्ट रजिस्टर है। इसका मतलब है कि उसे केवल 8 पिक्सेल घड़ियों के लिए एक बार एक नया बाइट प्राप्त करना है, इसके बाद 3.125MHz की दर है। यह आपको 320 के सभी को शिफ्ट रजिस्टर कुंडी में डेटा प्राप्त करने के लिए देता है, जो कि उनके द्वारा कहे गए 120 से अधिक लंबे समय तक होता है।
क्रिस_ एफएफ़

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

2

सबसे तेज़ घटकों का उपयोग करके, मैं प्रचार देरी और पहुँच समय को जोड़कर लगभग 15ns + 20ns + 70ns + 15ns = 120ns, 25MHz के लिए 40ns की अवधि से बहुत अधिक हो सकता हूं।

आप भूल जाते हैं कि एक ग्राफिक्स एडॉप्टर कभी भी एक पिक्सेल नहीं खींचेगा - लेकिन कम से कम एक पूर्ण स्कैन लाइन। इस प्रकार, यह पूरी तरह से पाइपलाइनेबल समस्या होगी।

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

मेरे सर्किट की मूल वास्तुकला इस प्रकार है:

  1. क्षैतिज पिक्सेल के लिए बाइनरी काउंटर 25.175MHz से 800 (640 दृश्यमान पिक्सेल + 160 सामने के पोर्च, सिंक, बैक पोर) के लिए गिना जाता है। 800 पर, वर्टिकल वर्टिकल लाइन काउंटर (और 525 लाइनों पर रीसेट)

  2. क्षैतिज और ऊर्ध्वाधर स्थिति का उपयोग करते हुए, वर्तमान वर्ण के x, y को समन्वित करें।

नहीं, तुम ऐसा क्यों करोगे? आप बस अपनी पंक्ति पिक्सेल को मेमोरी के एक समीपवर्ती क्षेत्र में डाल देंगे और रैखिक रूप से इसे आपके DAC के लिए डाल देंगे - यदि यह CPU / MCU कार्यान्वयन के बारे में है, तो आप अपने CPU को ऐसा नहीं करने देंगे, लेकिन DMA इकाई, प्रोग्राम्ड कुछ भी नहीं करने के लिए लेकिन एक के बाद एक मूल्य लेते हैं और इसे किसी भी सीपीयू कोर इंटरैक्शन के बिना एक समानांतर डेटा पोर्ट जैसे उदा।

  1. X, y वर्ण का समन्वय, ASCII वर्ण को पुनः प्राप्त करने के लिए वीडियो मेमोरी में अनुक्रमणिका का उपयोग करना।

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


1
हालांकि आधुनिक सामान प्री-रेंडर किए गए फ़्रेमबफ़र को पसंद करते हैं, वे स्पष्ट रूप से एक बुरा विकल्प हैं यदि आप बहुत राम के बिना काम करने की कोशिश कर रहे हैं। यदि आप FPGA में ऐसा कर रहे हैं, तो आप केवल DMA राज्य मशीन को चरित्र सेल मानचित्र से पते ले सकते हैं और फिर संबंधित वर्ण ग्लिफ़ से पढ़ सकते हैं।
R .. गिटहब स्टॉप हेल्पिंग ICE

पूरी तरह से यहाँ सहमत! इसलिए, तीसरे प्रश्न पर मेरा उत्तर अनुभाग।
मार्कस मुलर

2

पाइपलाइनिंग के अलावा काफी कुछ (जो आपको करना चाहिए बहुत कुछ), आप कुछ प्रमुख याद कर रहे हैं ...।

25 विषम मेगाहर्ट्ज में समानांतर, सीरियल आउट शिफ्ट रजिस्टर घड़ियां बाहर निकलती हैं, निश्चित रूप से, लेकिन अगर आपके पात्रों को 8 पिक्सेल चौड़ा कहा जाता है, तो इसका इनपुट केवल ~ 3.2MHz पर है जो आसानी से वीजीए युग एलएस श्रृंखला के लिए पहुंच में है, सभी के लिए जब वर्तमान रजिस्टर एक के साथ समाप्त हो जाता है, तो अगली बाइट तैयार करने की आवश्यकता होती है (यह वह जगह है जहाँ पाइपलाइन आती है)।

टेक्स्ट बफर और सीजी रोम ड्राइव करने के लिए ~ 25 मेगाहर्ट्ज पर एक पिक्सेल घड़ी और 1/8 वें पर एक मेमोरी घड़ी बनाएं, फिर उस मेमोरी और सीजी रोम एक्सेस सामान को पाइपलाइन करें।

एक और चाल, पाठ बफर आउटपुट पाठ की किसी भी पंक्ति के भीतर प्रत्येक पंक्ति के लिए दोहराया जाएगा, इसलिए हो सकता है कि आप पाठ के 80 बाइट्स को रिंग बफर में घड़ी कर सकें और फिर अगली 7 पंक्तियों के लिए रैम पढ़ना बंद कर दें (8 मानकर लाइन कैरेक्टर), यह आपको सीपीयू को उपयोग करने के लिए मेमोरी को मुफ्त में देता है, जरूरत की कीमत पर 80 बाइट्स वाली राम की चीज की तरफ।


1

तो जाहिर है कि यह काम नहीं करता है; आपको एक पाइपलाइन की आवश्यकता है।

1) स्मृति में संचित रूप से पात्रों को संग्रहीत करें। शीर्ष बाईं ओर प्रारंभ करें।

2) ब्लैंकिंग अंतराल के दौरान एक चरित्र लाएं। स्मृति क्रम में वर्ण प्राप्त करना जारी रखें।

3) रेक में प्रत्येक डीकोडेड कैरेक्टर प्लस लाइन इंडेक्स को पाइपलाइन।

4) एक बफर में रॉम आउटपुट को पाइपलाइन करें।

5) बफर को शिफ्ट रजिस्टर में डालें। इससे 40 सेकंड के अंतराल पर लगातार पिक्सल पढ़ें।

(इसका तात्पर्य है कि आपको प्रत्येक रजिस्टर में एक नया चरित्र लोड करने की आवश्यकता है जो कि प्रत्येक 320ns पर है, जो सिस्टम के बाकी हिस्सों को पूरी तरह से पाइप किए बिना भी संभव हो सकता है।)

6) क्षैतिज कंबलिंग के दौरान, या तो लाइन की शुरुआत पर वापस लौटें या अगले चरित्र पर जाएं (यानी अगली पंक्ति की शुरुआत)।

बोनस सुविधा: चूंकि आपको हर 320 के दशक में केवल एक चरित्र की आवश्यकता होती है, आप एक चरित्र + रंग की जोड़ी भी पढ़ सकते हैं और MSDOS- शैली या स्पेक्ट्रम-शैली रंग वर्ण भी कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.