VHDL में if-else और Case स्टेटमेंट के बीच अंतर


11

मैं समझना चाहता हूं कि VHDL कोड में विभिन्न निर्माण RTL में कैसे संश्लेषित होते हैं।

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

पुनश्च: मैंने एक संबंधित प्रश्न देखा है "एकाधिक अगर vhdl में प्रक्रिया में बयान" लेकिन यह वैसे भी मेरे सवाल का जवाब नहीं देता है।


मैं यह नहीं बता सकता कि भौतिक फाटकों को कैसे कॉन्फ़िगर किया जाएगा, लेकिन अधिकांश संकलक जो कि x86 असेंबली का उत्सर्जन करते हैं, अगर-आम तौर पर सशर्त छलांग के साथ एकल चेक के रूप में मौजूद होता है (जैसे jg, jl, jz, jnz, आदि)। जबकि स्विच संख्यात्मक क्रम में मामलों को व्यवस्थित करता है और पुनरावृत्ति dec/ jzनिर्देश करता है , जो बहुत अधिक कुशल है। शायद एक समान अनुकूलन यहां लागू किया गया है।
बहुपत्नी

@Polynomial आपके विशिष्ट लीनियर प्रोग्रामिंग की तुलना में हार्डवेयर भाषाओं में if-else और केस का व्यवहार काफी भिन्न होता है। चूंकि ओपीएल स्टेटमेंट "तुरंत" निष्पादित करता है, इसलिए ओप-कोड अनुकूलन बहुत प्रासंगिक नहीं हैं।
W5VO

जवाबों:


10

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

if-elsif-elseनिर्माण एक प्राथमिकता नेटवर्क मार्ग infers:

ढांच के रूप में

इस सर्किट का अनुकरण करें - सर्किटलैब का उपयोग करके बनाई गई योजनाबद्ध

इससे मेल खाती है

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

caseनिर्माण, दूसरे हाथ पर, एक बड़ा infers ol 'mux:

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

इससे मेल खाती है

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

जाहिर है कि ये केवल एक मूल्य अभिव्यक्ति के साथ बहुत सरल डिजाइन हैं, जिसके परिणामस्वरूप एक आउटपुट होता है।

कई नेस्टेड के मामले पर विचार करें-अगर-और किसी प्रक्रिया के अंदर केस-स्टेट्स को मिलाते हैं या नहीं।

उपरोक्त के अनुसार, आप देख सकते हैं कि वे घोंसला कैसे बनाते / मिलाते हैं।

यह भी कि कब किस निर्माण का उपयोग किया जाए?

चूंकि if-elseप्राथमिकता प्राथमिकता होती है, इसलिए इसका उपयोग तब किया जाना चाहिए जब एक से अधिक इनपुट स्थिति हो सकती है। caseजब इनपुट पारस्परिक रूप से अनन्य होते हैं, तो एक दूसरे का उपयोग करना उचित होता है।


मैं समझता हूं कि केस स्टैडमेंट केवल सिंगल इनपुट कंडीशन के लिए काम करता है और अगर-और मल्टीपल इनपुट कंडीशन के लिए काम कर सकता है। लेकिन दोनों निर्माण अनिवार्य रूप से muxes (clk की अनुपस्थिति में) उत्पन्न करते हैं। क्या यह संभव नहीं है कि लॉजिक सिंथेसिस सिंगल-इनपुट को ऑप्टिमाइज़ कर सकता है अगर-मक्सिस की श्रृंखला के बजाय एक ही बड़े मक्स को? इसके अलावा, एक प्राथमिकता मार्ग नेटवर्क क्या है ... यह केवल 1 बड़े mux के बजाय muxes की श्रृंखला नहीं है?
नर्स जू 20'13

इसके अतिरिक्त, जब हमारे पास एक घड़ी के लिए संवेदनशील प्रक्रिया होती है, अगर-और अनुक्रमिक तत्व जैसे रजिस्टर, लैच आदि उत्पन्न कर सकते हैं तो क्या कोई केस स्टेटमेंट भी अनुक्रमिक तर्क उत्पन्न कर सकता है?
नर्स जूना 20'13

हां, एक प्राथमिकता राउटिंग नेटवर्क ठीक यही है - मक्स की एक श्रृंखला। if-elseनिर्माण की प्रकृति , हालांकि, जहां वह श्रृंखला उत्पन्न होती है। दूसरी स्थिति का परीक्षण करने के लिए पहली शर्त विफल होनी चाहिए । यह एर, caseनिर्माण, के लिए मामला नहीं है , और यही कारण है कि एक if-elseबयान को एक बड़े मक्स के रूप में संश्लेषित नहीं किया जा सकता है।
एंजेलो स्टैवर्

1
और हाँ, एक caseकथन अनुक्रमिक तर्क भी उत्पन्न कर सकता है। मुझे "रियल वर्ल्ड वीएचडीएल" मिला , ग्लासगो विश्वविद्यालय से व्याख्यान स्लाइड की एक श्रृंखला, जो आपके लिए उपयोगी हो सकती है।
एंजेलो स्टैवर्

यह एक अच्छा संदर्भ है।
नर्स जु

4

में इस पुराने ब्लॉग पोस्ट , लेखक ने लिखा है और VHDL कोड के दो कार्यात्मक रूप से बराबर संस्करणों संश्लेषित। एक का उपयोग अगर-और, दूसरे का उपयोग कर मामला। परिणाम:

मैंने इस कोड को संश्लेषित किया और सटीक परिणाम प्राप्त किए। आरटीएल योजनाबद्ध दोनों कार्यक्रमों के लिए बिल्कुल समान था।

और उसका निष्कर्ष:

इससे पता चलता है कि 'मामला' और 'अगर ... एल्सिफ ... और' दोनों कथन समान रूप से कुशल हैं। लेकिन यदि आप एक स्पष्ट कोड लिखना चाहते हैं, तो आप 'केस' का बेहतर उपयोग करते हैं। 'केस' तब बहुत उपयोगी होता है जब आउटपुट बड़ी संख्या में स्थितियों पर निर्भर करता है। लेकिन यदि शर्तों की संख्या बहुत कम है (2 या 3) तो आप 'if..elseif..else' का उपयोग कर सकते हैं।

प्रत्येक बोधगम्य भाषा के लिए स्टैक ओवरफ्लो पर इस विषय पर दर्जनों पोस्ट भी हैं। निष्कर्ष आम तौर पर एक ही है, कि कोई अंतर प्रदर्शन-वार नहीं है। कभी-कभी, यदि बड़ी संख्या में मामले होते हैं, तो लुक-अप तालिका बनाने के लिए एक कंपाइलर काफी स्मार्ट हो सकता है जो थोड़ा बेहतर प्रदर्शन करेगा।

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

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