विवाडो: पिकासो मोड

अमूर्त


पागलपन सब युग सबमिसिव


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


इस तरह के एक असामान्य "डिजाइन मार्ग" को डेढ़ साल पहले लागू किया गया था, लेकिन केवल अब यह विचार एक नोट के रूप में इसे व्यवस्थित करने के लिए आया था, जिसमें डिजाइन पर्यावरण का प्रबंधन करने के लिए Tcl स्क्रिप्ट का उपयोग करने में बहुत कम अभ्यास है, इस मामले में Vivado। हालांकि, मामूली संशोधनों के साथ, सब कुछ आसानी से अन्य विकास के वातावरण के लिए अनुकूलित किया जा सकता है, उदाहरण के लिए क्वार्ट्स II।



परिचय


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


समस्या को हल करते समय, मुझे विवाडो पर्यावरण के साधनों में से एक का सहारा लेना पड़ा, अर्थात्, प्लेसमेंट के बाद परियोजना में संबंधित घटकों और मॉड्यूलों को रंगना और अंतहीन समय चार्ट में ट्रेसिंग और पेअर करना।


नतीजतन, मैंने विभिन्न रंगों में सीएलबी के कई कॉन्फ़िगर करने योग्य तार्किक ब्लॉकों को चित्रित किया, और यह मुझ पर जगाया - ये छवि के पिक्सेल हैं, इसलिए मैं यह चित्र बनाने के लिए कोशिश कर सकता हूं कि चित्र क्या है, प्रत्येक पिक्सेल को अपने रंग के सीएलबी के साथ मेल खाता है? ... ठीक है, यह शुरू हुआ?


Tcl हमारी मदद कैसे करेगा?


मान लीजिए कि हमारे पास 100x100 पिक्सेल आकार का एक छोटा चित्र है। अब मान लीजिए कि सीएलबी को रंगने के लिए, हमें दो काम करने होंगे: सीएलबी का चयन करें और रंग का चयन करें। 100x100 चित्र में, हमारे पास 10,000 पिक्सेल हैं और मैन्युअल रूप से इस तरह का रंग करना काफी थकाऊ है, खासकर जब से क्रियाएं समान और दोहरावदार हैं। इस प्रकार, प्रत्येक CLB को मैन्युअल रूप से पेंट करना एक विकल्प नहीं है और आपको Tcl और स्क्रिप्ट का उपयोग करने की आवश्यकता है। लेकिन कहां से शुरू करें?


पहली बात यह थी कि चयनित तत्व को रंग असाइन करने के लिए जिम्मेदार सही टीम को ढूंढना था। सौभाग्य से, जब मैन्युअल रूप से कार्यों को निष्पादित किया जाता है, तो विवाडो कंसोल के लिए उपयुक्त Tcl कमांड प्रदर्शित करता है, और ऐसा लगता है कि खोज समस्या को जितनी जल्दी हो सके हल किया जाना चाहिए। हालांकि, यह वहां नहीं था। विवाडो केवल चयनित तत्वों को उजागर करने के लिए कमांड के आउटपुट को अनदेखा करता है, और कमांड को खोजने के लिए एकमात्र विकल्प है, और मुझे पूरी तरह से यकीन था कि यह होना चाहिए, विवाडो में उपलब्ध Tcl गाइड में हेडलॉग को डुबोना है, और यह लगभग 1 पृष्ठ है [1]।


निराशा न करें, "हाइलाइट" कीवर्ड को जल्दी से संबंधित कमांड मिली, जिसे हाइलाइट_बॉजेक्ट्स कहा जाता है। यह कमांड निर्दिष्ट या चयनित ऑब्जेक्ट को एक विशिष्ट रंग में हाइलाइट करता है, विकल्पों का उपयोग करके निर्दिष्ट किया गया है। Highlight_objects कमांड के विकल्प इस प्रकार हैं:


- color_index - (वैकल्पिक) विकल्प तर्क का वैध मान 1 से 20 तक की संख्या होना चाहिए। जिस रंग में चयनित वस्तु को चित्रित किया जाएगा वह पूर्व निर्धारित रंग पैलेट से उसके सीरियल नंबर से निर्धारित होता है, जो मेनू अनुभाग में कलर्स / हाइलाइट में पाया जा सकता है → सेटिंग ।
- आरजीबी - (वैकल्पिक) आरजीबी प्रारूप में चयनित वस्तु का रंग निर्धारित करता है
- रंग - (वैकल्पिक) निम्न रंगों में से किसी एक में चयनित वस्तु पर प्रकाश डालता है: लाल, हरा, नीला, मैजेंटा, पीला, सियान और नारंगी


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


अब छवि के पिक्सेल मान प्राप्त करना बुरा नहीं होगा, लेकिन मुझे वह छवि नहीं मिली जो बिटमैप प्रारूप में प्रस्तुत की जाएगी। प्रत्येक फ़ाइल को एक पाठ संपादक के साथ खोलना, पिक्सेल मान वाली लाइनें ढूंढना संभव नहीं था। बेशक, मैंने छवियों को बिटमैप प्रारूप में परिवर्तित करने के लिए एक कार्यक्रम नहीं लिखा था, लेकिन बस तैयार समाधान की तलाश के लिए इंटरनेट पर चढ़ गया। यह खोज करने के लिए बहुत लंबा नहीं था। जैसा कि यह पता चला है, एक छवि को बिटमैप प्रारूप में बदलने का कार्य (जब हम असम्पीडित छवि के पिक्सेल मूल्यों को देखते हैं) काफी प्रासंगिक है (शायद, इस तरह के कार्य को छात्र-प्रोग्रामर को प्रयोगशाला के काम के लिए होमवर्क के रूप में दिया जाता है)। एक छोटी खोज गितुब पर हुई, जहां से Image2Bitmap कार्यक्रम डाउनलोड किया गया [2]।


कार्यक्रम में छवि इनपुट की आवश्यकता होती है और RGB565 प्रारूप में हेक्साडेसिमल पिक्सेल मूल्यों के साथ एक एस सरणी के रूप में पिक्सेल मूल्यों को आउटपुट करता है। यह प्रारूप कहता है कि लाल घटक के लिए रंग कोडिंग 5 बिट्स, ग्रीन 6 बिट्स और ब्लू 5 बिट्स का उपयोग करता है। यह काम के लिए काफी महत्वपूर्ण निकला। अब यह आवश्यक है कि प्राप्त मूल्यों को सीधे चित्रित वर्गों (स्लाइस) में मैप किया जाए।


FPGA चयन


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


  1. हम विवाडो शुरू करते हैं और हम प्रोजेक्ट बनाते हैं


  2. हम xc7s6cpga196-2 क्रिस्टल का चयन करते हैं, जिस पर हम परीक्षण छवि तैयार करेंगे


  3. खींची गई प्रदर्शित करने के लिए, हमें स्वयं क्रिस्टल की छवि को खोलने की आवश्यकता है, हालांकि, यह संश्लेषण चरण या विस्तृत के बाद किया जा सकता है। विवाडो में, इसके लिए हमें किसी भी भाषा में डमी मॉड्यूल बनाने की आवश्यकता है।


  4. Tcl प्रोजेक्ट में स्क्रिप्ट जोड़ें।
    एक। ऐसा करने के लिए, प्रोजेक्ट के साथ फ़ोल्डर में एक्सटेंशन ".tcl" के साथ एक फ़ाइल बनाएं, उदाहरण के लिए, "fpga_painter.tcl"


    ख। विवाडो पर जाएं, और इस फ़ाइल को प्रोजेक्ट में जोड़ें।


    सी। प्रोजेक्ट पदानुक्रम को अद्यतन करने के बाद, फ़ाइल को निष्क्रिय करें।


  5. मॉड्यूल बनाने के बाद, यह प्रोजेक्ट पदानुक्रम विंडो में दिखाई देगा और ओपन विस्तृत डिज़ाइन बटन हमारे लिए उपलब्ध होगा। इसे धक्का दे दो।


  6. विस्तृत डिजाइन खोलने के बाद, विंडो → डिवाइस पर जाएं। हमारे FPGA के क्षेत्र का एक प्रदर्शन दिखाई देगा।


  7. तैयारी पूरी हो गई है, हम एक स्क्रिप्ट लिखना शुरू करते हैं।



मापदंडों और प्रक्रियाओं की परिभाषा


परीक्षण छवि


पहले, आइए एल्गोरिथ्म / कोड को छोटी छवि पर इस तरह से डिबग करें, 5x3 कहें, और फिर इसे "पूर्णतम" पर चलाएं।


  1. पेंट खोलें, छवि क्षेत्र को 5x3 पिक्सेल तक सीमित करें (आप किसी भी रंग ले सकते हैं)। फ़ाइल को "5x3.png" के रूप में सहेजें


  2. Image2Bitmap प्रोग्राम खोलें और हमारी छवि को RGB565 सरणी में बदलें।


  3. रूपांतरण के बाद, कार्यक्रम हमें 15 पिक्सेल की एक सरणी देगा



*uint16_t image = { 0xf800, 0x07e0, 0x001f, 0x8410, 0x8010, 0xfbe4, 0xff80, 0x2589, 0x051d, 0x3a59, 0xa254, 0xbbca, 0xfd79, 0xef36, 0x9edd, };* 

डेटा की तैयारी


पिक्सेल के प्रसंस्करण के साथ आगे बढ़ने से पहले, हम Image2Bitmap द्वारा उत्पन्न डेटा को एक साधारण सूची में परिवर्तित करते हैं जिसमें हेक्साडेसिमल पिक्सेल मान लिखे जाते हैं। हम प्रोग्राम डेटा की प्रतिलिपि बनाएँ और इसे pic_array.dat फ़ाइल में सहेजें, जो प्रोजेक्ट फ़ोल्डर में स्थित होना चाहिए।



बनाई गई स्क्रिप्ट शुरू करते समय, हमें "pic_array.dat" फाइल को प्रोसेस करना होगा। यह ध्यान देने योग्य है कि Image2Bitmap द्वारा लौटाए गए लाइन में तत्वों की संख्या परिवर्तित छवि की लाइन में पिक्सेल की संख्या से मेल नहीं खाती है, इस कारण से हम "पिक्सल" की एक अलग सूची बनाएंगे।



फ़ाइल पढ़ते समय, आपको पहली पंक्ति "uint16_t छवि = {" और अंतिम "};" को अनदेखा करना चाहिए। किसी फ़ाइल को पढ़ते समय पहली पंक्ति को छोड़ने के लिए, हम पूरी लाइन को पूरी फ़ाइल पढ़ने के चक्र से पहले पढ़ते हैं।



संपूर्ण फ़ाइल पढ़ने के बाद, हम देखेंगे कि फ़ाइल की अंतिम पंक्ति "};" सूची का एक तत्व बन गई है, जो कि बस नष्ट हो गई है।



यह हेक्साडेसिमल पिक्सेल मूल्यों के साथ सूची के गठन को पूरा करता है। अब इनका प्रसंस्करण शुरू करते हैं।


छवि आकार


एक बार फिर, FPGA फ़ील्ड और छवि पर एक नज़र डालें। FPGA फ़ील्ड को वर्गों (SLICE) में विभाजित किया गया है, जिसमें संबंधित क्षैतिज निर्देशांक "X" और ऊर्ध्वाधर "Y" हैं। उदाहरण के लिए, SLICE_X6Y36।



छवि, बदले में, क्षैतिज और ऊर्ध्वाधर निर्देशांक के साथ पिक्सेल भी है। FPGA पर छवि को ओवरले करते समय, हमें FPGA के ऊपरी बाएँ अनुभाग के साथ ऊपरी बाएँ पिक्सेल को जोड़ना चाहिए। इस मामले में, चयनित क्रिस्टल में समन्वय X0Y49 के साथ एक ऊपरी अनुभाग है।



छवि का आकार FPGA में वर्गों की संख्या क्षैतिज और लंबवत रूप से निर्धारित किया जाएगा। चयनित क्रिस्टल के लिए, वर्गों का क्षैतिज समन्वय X0 से X131 तक भिन्न होता है, और Y49 से Y0 तक ऊर्ध्वाधर समन्वय होता है। यह इस प्रकार है कि सैद्धांतिक रूप से हम चयनित क्रिस्टल पर 132x50 आकार की एक छवि बना सकते हैं।


प्रारंभिक पैरामीटर


संक्षेप में: हमारी लिपि के प्रारंभिक पैरामीटर निम्न होंगे:


  1. X अनुभाग का प्रारंभ स्थान: चर नाम start_x


  2. Y अक्ष पर खंड प्रारंभ स्थिति: चर नाम start_y


  3. छवि चौड़ाई (परीक्षण छवि के लिए 5 है): चर डब्ल्यू


  4. छवि ऊंचाई (परीक्षण छवि के लिए 3 है): चर एच



पिक्सेल रंग समायोजन


Image2Bitmap RGB565 प्रारूप में पिक्सेल की एक सरणी प्रदान करता है जो 16-बिट संख्या हेक्साडेसिमल प्रारूप में लिखा गया है। हमें चाहिए:


  1. बाइनरी प्रारूप में पिक्सेल मान परिवर्तित करें। यह hex2bin प्रक्रिया का उपयोग करके किया जा सकता है, जिसे [3] में पाया जा सकता है।


  2. इसी रंग के घटकों से बिट्स का मिलान करें:
    • लाल रंग का घटक [15:11]


    • ग्रीन घटक जी [१०: ५]


    • ब्लू कम्पोनेंट B [4: 0]



स्पष्टीकरण: आदेश को इस तथ्य के कारण बदल दिया जाता है कि हेक्स 2बीन प्रक्रिया एक स्ट्रिंग लौटाती है जिसमें तत्वों की संख्या 0 से शुरू होती है, अर्थात, 15 वीं बिट स्ट्रिंग के 0 वें तत्व से मेल खाती है, और 0 वीं बिट स्ट्रिंग के 15 वें तत्व से मेल खाती है।


  1. बाइनरी से दशमलव तक रंग घटक के मूल्य को परिवर्तित करें। यह बिन 2 डीईसी प्रक्रिया का उपयोग करके किया जा सकता है, जिसे पाया जा सकता है [3]:




  2. चिकनी छवि प्रदर्शन के लिए RGB मान को RGB565 से RGB888 प्रारूप में कनवर्ट करें। यह दो सूचियों का उपयोग करके किया जाता है, जिसे [4] में पाया जा सकता है। यह कैसे काम करता है:
    • रंग घटकों आर और बी का संकल्प 5 बिट्स है। घटक के दशमलव मान को लेते हुए, हम इसकी तुलना सूची t5 में लिखी संख्या की स्थिति से करते हैं, और घटक का मान तालिका में मान में बदल जाता है






    • इसी तरह घटक G और टेबल t6 के लिए





अनुभाग उपलब्धता


कुछ FPGAs के अंदर विशेष संसाधन या voids होते हैं जो अनुभाग निर्देशांक की क्रमिक संख्या को बाधित कर सकते हैं। उदाहरण के लिए, नीचे दिए गए चित्र में आप देख सकते हैं कि सेक्शन नंबरिंग बाधित है (xc7s50 क्रिस्टल)


इस कारण से, धुंधला होने से पहले, हम पहले अनुभाग के अस्तित्व की जांच करते हैं। यदि यह मौजूद है, तो पेंट करें, यदि यह मौजूद नहीं है, तो अगले पिक्सेल पर जाएं


खंड धुंधला हो जाना


खंड रंग परिभाषित, अनुभाग जाँच की गई। अब रंग को highlight_objects कमांड का उपयोग करके अनुभागों को सौंपा जाना चाहिए:


वेक्टर → दो-आयामी सरणी


शुरुआत में, हमने छवि डेटा को पिक्सेल की सूची में बदल दिया, जो छवि के प्रगतिशील स्कैन को संग्रहीत करता है। तस्वीर को व्यवस्थित करने के लिए, हम दो चर, x और y पेश करते हैं, जो छवि में पिक्सेल की स्थिति के अनुरूप होंगे। क्रमिक रूप से पिक्सेल की सूची के तत्वों को पढ़कर, हम दो छोरों के लिए एक छवि का निर्माण करेंगे: एक पंक्ति की संख्या से, दूसरी पंक्ति में पिक्सेल की स्थिति से




पूरी स्क्रिप्ट लिस्टिंग


Fpga_painter.tcl लिस्टिंग
 #https://tcl.tk/ #http://www.tune-it.ru/web/il/home/-/blogs/-rgb888-<->-rgb565----- #https://github.com/FoxExe/Image2Bitmap/releases/tag/0.5 #        set start_x 0; # set start_y 49; # set w 5; #  (   ) set h 3; #  ( ) proc hex2bin hex { set t [list 0 0000 1 0001 2 0010 3 0011 4 0100 \ 5 0101 6 0110 7 0111 8 1000 9 1001 \ a 1010 b 1011 c 1100 d 1101 e 1110 f 1111 \ A 1010 B 1011 C 1100 D 1101 E 1110 F 1111] regsub {^0[xX]} $hex {} hex return [string map -nocase $t $hex] } proc bin2dec bin { #returns integer equivalent of $bin set res 0 if {$bin == 0} { return 0 } elseif {[string match -* $bin]} { set sign - set bin [string range $bin[set bin {}] 1 end] } else { set sign {} } foreach i [split $bin {}] { set res [expr {$res*2+$i}] } return $sign$res } ############### #RGB565 -> RGB888 using tables set t5 [list 0 8 16 25 33 41 49 58 66 74 82 90 99 107 115 123 132\ 140 148 156 165 173 181 189 197 206 214 222 230 239 247 255] set t6 [list 0 4 8 12 16 20 24 28 32 36 40 45 49 53 57 61 65 69\ 73 77 81 85 89 93 97 101 105 109 113 117 121 125 130 134 138\ 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198\ 202 206 210 215 219 223 227 231 235 239 243 247 251 255] ############### #  .         set script_path [get_property DIRECTORY [get_projects *]] cd $script_path #       set fId [open {pic_array.dat} r] # ,       set pixels [list ] #    .    gets $fId line #  .     . while {[gets $fId line] > 0} { set pixels [concat $pixels $line] } #   pixels   "};",    Image2Bitmap set pixels [lrange $pixels 0 end-1] #    pixels set pix_num 0; #      for {set y 0} { $y < $h } {incr y} { #    ( ) set Y [expr {$start_y - $y}] #    for {set x 0} { $x < $w } {incr x } { set pix_val [lindex $pixels $pix_num]; incr pix_num #   binary  set pix_bin [hex2bin $pix_val] ; #     set R_bin [string range $pix_bin 0 4] #    set R_dec [ bin2dec $R_bin ] #       t5 set R [lindex $t5 $R_dec] #       set G_bin [string range $pix_bin 5 10] set G [lindex $t6 [ bin2dec $G_bin ]] set B_bin [string range $pix_bin 11 15] set B [lindex $t5 [ bin2dec $B_bin ] ] #    set X [expr {$start_x + $x}] #,      set cond [get_sites "SLICE_X${X}Y${Y}"] if {$cond ne ""} { #  highlight_objects [get_sites "SLICE_X${X}Y${Y}"] -rgb "$R $G $B" } puts "X = $XY = $Y; $R $G $B" } } close $fId puts "Complete::Check FPGA field::Window->Device" 

परीक्षण


  1. परीक्षण शुरू करने के लिए, सुनिश्चित करें कि FPGA फ़ील्ड आपके लिए उपलब्ध है, अर्थात। डिज़ाइन चरणों में से एक खुला है: विस्तृत, संश्लेषण, या कार्यान्वित। FPGA फ़ील्ड प्रदर्शित करने के लिए, विंडो → डिवाइस का चयन करें


  2. Pic_array.dat फ़ाइल खोलें और फ़ाइल में Image2Bitmap से डेटा कॉपी करें। फ़ाइल सहेजें


  3. स्क्रिप्ट खोलते हैं। ऊपरी बाएं पिक्सेल 0 और 49 के समन्वय को सेट करें, परीक्षण छवि का आकार 5 से 3 है, और स्क्रिप्ट चलाएँ। ऐसा करने के लिए, स्क्रिप्ट फ़ील्ड में राइट-क्लिक करें और रन चुनें।


  4. Tcl कंसोल पर जाएं और सुनिश्चित करें कि स्क्रिप्ट निष्पादित हो गई है।


  5. डिवाइस टैब पर जाएं और सुनिश्चित करें कि सेल उपयुक्त रंग में रंगे हुए हैं।


  6. अब हम किसी भी छवि को ले सकते हैं, इसे वांछित आकार में बदल सकते हैं और एफपीजीए क्षेत्र में भर सकते हैं। नीचे कुछ उदाहरण दिए गए हैं।



पुनश्च: कस्टम रंग असाइनमेंट विवाडो के डिफ़ॉल्ट रंग सेटिंग को बदल देता है


संदर्भ


  1. UG835। विवाडो डिजाइन सूट TclCommand संदर्भ गाइड
  2. https://github.com/FoxExe/Image2Bitmap/releases/tag/0.5
  3. https://tcl.tk
  4. http://www.tune-it.ru/web/il/home/-/blogs/conversion-rgb888 - <-> -rgb565-and-safety-मशरूम-से-लुप्त होती

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


All Articles