2012-06-17 13 views
7

क्या सी कार्यान्वयन की बात आती है जब मीली और मूर राज्य मशीनों के बीच का अंतर कोई वास्तविक महत्व है? आम तौर पर यह अंतर क्या होगा?मीली और मूर के बीच अंतर

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

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

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

मैं एक अन्य आटे/मूर पोस्ट यहाँ देखा था: Mealy v/s. Moore

लेकिन यह वास्तव में मैं देख रहा हूँ विवरण के स्तर नहीं है।

+0

LUT = लुकअप टेबल (http://en.wikipedia.org/wiki/Lookup_table) –

उत्तर

4

आपके पास एक औपचारिकता को दूसरे में बदलने के लिए एक यांत्रिक प्रक्रिया है, इसलिए दोनों के बीच कोई संरचनात्मक अंतर नहीं है।

कार्यान्वयन में अंतर के बारे में बोलते हुए, दो औपचारिकता केवल आउटपुट फ़ंक्शन में भिन्न होती है, जो आपको बताती है कि कौन सा प्रतीक आउटपुट होना चाहिए। विशेष रूप से:

  1. एक मूर मशीन में, उत्पादन केवल वर्तमान स्थिति
  2. एक आटे मशीन में पर निर्भर करता है, उत्पादन वर्तमान स्थिति और वर्तमान इनपुट पर निर्भर करता है।

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

यहाँ एक सरल मूर मशीन सी में कैसा दिखेगा कैसे:

int state = INITIAL; 
while (!isTerminal(state)) { 
    char input = nextInputSymbol(); 
    fprintf(output, "%c", nextOutputSymbol(state)); 
    state = nextState(state, input); 
} 

और यहाँ आटे की मशीन है:

int state = INITIAL; 
while (!isTerminal(state)) { 
    char input = nextInputSymbol(); 
    fprintf(output, "%c", nextOutputSymbol(input, state)); 
    state = nextState(state, input); 
} 

जैसा कि आप देख, फर्क सिर्फ इतना है की परिभाषा में है nextOutputSymbol()। चाहे एक या अन्य औपचारिकता के लिए कहा गया कार्य का कार्यान्वयन आसान है, यह वास्तव में विशिष्ट अनुप्रयोग पर निर्भर करता है।

nextInputSymbol सिर्फ एक नियमित एक नया प्रतीक प्राप्त करने के लिए है (एक scanf या की तरह हो सकता है) और nextState विशिष्ट मशीन पर निर्भर करेगा, लेकिन इसकी जटिलता आटे और बराबर मूर के बीच ज्यादा नहीं बदलेगा।

विशेष रूप से, एक मेज देखने या एक switch या एक if/else चेन, कोई वास्तविक कार्यान्वयन कठिनाई के साथ करने के लिए नीचे दोनों nextOutputSymbol और nextState फोड़ा। वे वास्तव में लिखने के लिए उबाऊ हैं, वास्तव में।

नोट: मैंने चर्चा के मुख्य बिंदु पर ध्यान केंद्रित करने के लिए कोड स्निपेट में त्रुटि जांच को छोड़ दिया। असली दुनिया कोड कुछ अतिरिक्त चेक करेगा, जैसे कि nextInputSymbol पर 0OF या break त्रुटि पर EOF को संभालने की तरह।

+0

शानदार उत्तर। प्रासंगिक: http://www.inf.u-szeged.hu/actacybernetica/prevvols/14_4/14_4_541_552.pdf –

1

मूर मशीन: आउटपुट केवल वर्तमान स्थिति पर निर्भर करता है। मीली मशीन: आउटपुट वर्तमान स्थिति & वर्तमान इनपुट पर निर्भर करता है।

संबंधित मुद्दे